- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在调查 Google 在我的 Android 应用程序中提供的 SafetyNet。
首先,我简单地调用了 SafetyNet 证明 API,然后 Base64 解码了 Google 提供的示例中显示的部分。
SafetyNet.getClient(this).attest(NONCE, <API KEY>)
.addOnSuccessListener(this, new OnSuccessListener<SafetyNetApi.AttestationResponse>() {
@Override
public void onSuccess(final SafetyNetApi.AttestationResponse attestationResponse) {
initialDataExtraction(attestationResponse.getJwsResult());
}
})
.addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull final Exception exception) {
if (exception instanceof ApiException) {
final ApiException apiException = (ApiException) exception;
Log.e(TAG, "onFailure: " + apiException.getMessage() + " " + apiException.getStatusCode());
} else {
Log.e(TAG, "Error: ", exception);
}
}
});
我提取 JWS 部分如下:-
private byte[] initialDataExtraction(final String jwsResult) {
final String[] jwsResultParts = jwsResult.split("[.]");
if (jwsResultParts.length == 3) {
final byte[] header = Base64.decode(jwsResultParts[0], Base64.NO_WRAP);
final byte[] data = Base64.decode(jwsResultParts[1], Base64.NO_WRAP);
final byte[] signature = Base64.decode(jwsResultParts[2], Base64.NO_WRAP);
Log.d(TAG, "initialDataExtraction: header = " + new String(header, UTF_8));
Log.d(TAG, "initialDataExtraction: data = " + new String(data, UTF_8));
Log.d(TAG, "initialDataExtraction: signature = " + new String(signature, UTF_8));
return data;
} else {
Log.e(TAG, "initialDataExtraction: Failure: Illegal JWS signature format. The JWS consists of " + jwsResultParts.length + " parts instead of 3.");
return null;
}
}
我正在使用 android.util.Base64
解码部分,大部分时间解码完成正常。
虽然我偶尔会收到此异常:-
java.lang.IllegalArgumentException: bad base-64
at android.util.Base64.decode(Base64.java:161)
at android.util.Base64.decode(Base64.java:136)
at android.util.Base64.decode(Base64.java:118)
解码签名部分时。
解码时看到这个间歇性错误我做错了什么?
然后我开始使用 JWT 库来解码 token 。
首先我尝试了 group: 'com.auth0.android', name: 'jwtdecode', version: '1.1.1'
我试过的代码是
final JWT jwt = new JWT(jwsResult);
始终因以下错误而失败
com.auth0.android.jwt.DecodeException: The token's payload had an invalid JSON format.
at com.auth0.android.jwt.JWT.parseJson(JWT.java:235)
at com.auth0.android.jwt.JWT.decode(JWT.java:203)
at com.auth0.android.jwt.JWT.<init>(JWT.java:40)
Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_ARRAY at line 1 column 23 path $.
at com.google.gson.Gson.fromJson(Gson.java:899)
at com.google.gson.Gson.fromJson(Gson.java:852)
at com.google.gson.Gson.fromJson(Gson.java:801)
此异常似乎是由 Auth0 库无法解析 header 4.1.6 引起的。 “x5c”(X.509 证书链) header
格式很奇怪,因为 JWS 规范明确指出该值由 JSON 数组表示:-
The "x5c" (X.509 Certificate Chain) Header Parameter contains the
X.509 public key certificate or certificate chain [RFC5280]
corresponding to the key used to digitally sign the JWS. The
certificate or certificate chain is represented as a JSON array of
certificate value strings.
但是,如果我将相同的 jws 结果字符串复制并粘贴到纯 java 项目中并使用 compile 'com.auth0:java-jwt:3.3.0'
并使用此代码:-
String token = "<JWS TOKEN>";
try {
final DecodedJWT jwt = JWT.decode(token);
System.out.println("Header = " + jwt.getHeader());
System.out.println("Payload = " + jwt.getPayload());
System.out.println("Signature = " + jwt.getSignature());
} catch (JWTDecodeException exception){
throw new RuntimeException(exception);
}
Jws Token解码成功
我在我的 Android 应用程序中做错了什么导致 auth0 android jwt 库按预期停止工作?
然后我在我的 Android 应用程序中尝试了 'io.jsonwebtoken:jjwt:0.9.0'
库。
当我执行这段代码时:-
Jwts.parser().parse(jwsResult).getBody();
它失败了:-
java.lang.IllegalArgumentException: A signing key must be specified if the specified JWT is digitally signed.
at io.jsonwebtoken.lang.Assert.notNull(Assert.java:85)
at io.jsonwebtoken.impl.DefaultJwtParser.parse(DefaultJwtParser.java:331)
我需要将什么签名 key 传递给 Jwts?我拥有的唯一 key 是我在 Google API 控制台中保存的 API key ,这是我应该使用的 key 吗?
当我按如下方式传递时:
Jwts.parser().setSigningKey<API KEY>.parse(jwsResult).getBody();
这失败了:-
java.lang.IllegalArgumentException: Key bytes can only be specified for HMAC signatures. Please specify a PublicKey or PrivateKey instance.
at io.jsonwebtoken.lang.Assert.isTrue(Assert.java:38)
at io.jsonwebtoken.impl.DefaultJwtParser.parse(DefaultJwtParser.java:324)
解码和使用从 SafetyNet 证明 API 调用收到的 Jws 结果的正确方法是什么?
我从这个问题 Base64: java.lang.IllegalArgumentException: Illegal character 中发现了 java.lang.IllegalArgumentException: bad base-64
问题的修复
解码前简单替换jws token中的字符
token.replace('-', '+').replace('_', '/')
最佳答案
我发现这个库不仅可以完成它在 Android 上运行良好的工作。
// https://mvnrepository.com/artifact/com.nimbusds/nimbus-jose-jwt
implementation group: 'com.nimbusds', name: 'nimbus-jose-jwt', version: '5.1'
try {
final JWSObject jwsObject = JWSObject.parse(jwsResult);
System.out.println("header = " + jwsObject.getHeader());
System.out.println("header = " + jwsObject.getHeader().getX509CertChain());
System.out.println("payload = " + jwsObject.getPayload().toJSONObject());
System.out.println("signature = " + jwsObject.getSignature());
System.out.println("signature = " + jwsObject.getSignature().decodeToString());
} catch (ParseException e) {
e.printStackTrace();
}
提供了一些很好的例子:-
关于android - 如何解码 SafetyNet JWS 响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47690811/
我阅读了可以找到的 JSON Web 签名规范 here .该规范为 JSON Web 签名定义了两种序列化表示。一种是 JWS Compact Serialization,另一种是 JWS JSON
我正在研究 WSDL 和 JAX-WS,这就是我遇到这个问题的地方。当我在 JAX-WS 中编写服务接口(interface)时,如下所示: @WebService @SOAPBinding(styl
我正在尝试使用 Certbot 为我的 IIS 服务器获取证书。但我不断收到此错误: [31mAn unexpected error occurred:[0m [31mThe JWS was sign
我有一个很大的 Java applet(大约 7 MB)。这是一个古老而庞大的项目,由几个 (7) 个较小的项目组成,所有项目都使用“fatjar”捆绑在一个 jar 中。由于 applet 是一项旧
如何查看 JWS 应用程序堆栈跟踪? 最佳答案 如果您指的是 Java Web Start,那么您需要进入 Java 设置并打开控制台。 (将其设置为“始终”显示。)下次单击 JNLP 时,控制台将启
我正在部署一个需要一些外部库才能运行的 swing 客户端。我如何才能通过下载它们在 JNLP 中?是否有使它们可用的配置或可以放置它们的文件夹? 最佳答案 如上所述here ,必须可以使用 href
我有一个使用许多数据文件的 swing 应用程序,这些数据文件会不时更改。如何将这些数据文件加载到客户端计算机上?有什么方法可以创建类似结构的文件夹并运行批处理文件等吗?任何帮助表示赞赏。 最佳答案
我的 JWS 应用程序 jar 已签名1,当我启动该证书时,它不会要求任何东西,只是抛出一个异常,说明您的应用程序已被阻止。 如果我安装该证书它就可以工作,但是我如何强制我的应用程序给出一条消息来安装
我已获得可信机构颁发的证书(已获得 .pfx 文件)。 我像这样用 jarsigner 签署了我所有的 .jar 文件: jarsigner -storetype pkcs12 -keystore m
是否可以将 Tomcat 与带有 Java WebStart 的 Spring 应用程序捆绑在一起?如何捆绑? 最佳答案 Jetty提供对嵌入的支持,然后您将在 jnlp 中声明 jar 文件,并从主
是否可以在 HTML 中嵌入小程序,以便将其显示在浏览器窗口中,然后通过 JNLP 文件通过 Java Web Start 启动,而不是使用浏览器的 Java 插件?如果是这样,这是如何完成的? 我只
我确实写了一个简单的 java web 服务(使用 javax jws)。我正在尝试将此服务部署到 openshift 的 Jboss 服务器中。当我尝试访问该服务时,我收到了上述异常。 Java 服
我正在尝试将一个简单的 java servlet 部署到 Tomcat,它使用部署到本地主机上同一个 Tomcat 的 Web 服务。我正在 Netbeans 中处理 Maven 项目。 servle
我正在编写后端代码以在 Node.JS 中验证来自 Google 的 SafetyNet API 的 JWS。我很惊讶没有为此找到现成可用的模块,所以我开始使用可用库查看 JWS 的一些简单验证: 首
刚刚了解 JOSE,我知道 JWE 用于加密,而 JWS 用于签名。我似乎无法找到既加密又签名的有效负载的示例。 让我们假设我有一个有效载荷 hello world .做这样的事情是正确的吗? JWS
我不明白为什么存在 JWS 不 protected header 。 对于某些上下文:JWS 不 protected header 包含不受完整性保护的参数,并且只能与 JSON 序列化一起使用每个签
我在AWS-EKS中运行我的应用程序,而我的Jenkins实例尚未容器化。为了部署我们的应用程序,我们在Jenkins Pipeline中使用kubectl命令。我想知道通过Jenkins部署Kube
我有一个使用 swing-layout 的旧应用程序,我必须通过 java webstart 使其可用。它从 netbeans 运行良好,但如果我使用 jws 启动它,我会收到此错误: excepti
我在确定如何使用 Java Web Start 程序写入文件时遇到一些问题,我想将文件写入描述已上传到云服务器的文件的服务器。我还希望从客户端发送文件名和路径等数据,以便我可以在用户和云存储设施之间创
为什么我的 JWS 应用程序不响应 Swing 按钮操作? 我有一个在 Eclipse 中创建的程序。它收集有关连接到本地网络的设备的信息并将其显示在 JTable 中。在环境中它执行得很好 befo
我是一名优秀的程序员,十分优秀!