- 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/
当我尝试更新我的 时,我收到了来自 Play 商店的警告。 flutter 在游戏商店。 The developer of play-services-safetynet (com.google.an
我想使用 SafetyNet Attestation API (请注意,该文档似乎已过时,因为它使用的方法已被弃用)。使用最新版本的 Play Services (11.0.1) 我想出了以下代码:
我正在尝试通过 stackover 中的一位同事的引用来学习如何实现安全网。 SafetyNet: package name always return null 第一段代码是SafetyNetVer
只是尝试在 Android 应用程序中实现 SafetyNet 安全浏览 API 并阅读文档:https://developer.android.com/training/safetynet/safe
我正在根据 Google SafetyNet sample 实现 SafetyNet API和 SafetyNet Helper 这是我的工作代码。第一部分是我在 SafetyNetSampleFra
我正在使用 Google 客户端调用 SafetyNet Api,但它没有做出正确的响应。 SafetyNet.SafetyNetApi.attest(mGoogleApiClient, gen
我正在使用这个库: https://github.com/scottyab/safetynethelper 我已经阅读了 Android Deveoloper 站点和存储库中的文档。一切正常,但我不清
我在我的应用程序中使用 Google SafetyNet API 来检测设备篡改。引用::https://developers.google.com/android/reference/com/goo
我正在尝试了解 jwt 签名验证的工作原理。 这就是我目前的做法: 1) My app calls the attest api 2) My app sends the jwt to my serve
我的问题是 Google Safetynet 内置了什么样的重试逻辑,应用程序中应该构建什么样的重试逻辑?构建应用程序级逻辑的最佳实践是什么? 我在 Android 应用程序和 Web 后端服务中使用
我正在调查 Google 在我的 Android 应用程序中提供的 SafetyNet。 首先,我简单地调用了 SafetyNet 证明 API,然后 Base64 解码了 Google 提供的示例中
我们应用中的 Safetynet 调用在生产环境中经常失败。我们认为最近消费者流量的激增和 Safetynet API 的限制可能是导致此问题的原因。 “如果每分钟触发超过 5 次调用,则超出了 AP
我有一个应用一直在使用 SafetyNet Attestation API一段时间。 突然间,对 API 的所有调用都开始失败。 SafetyNet Attestation API 发生了什么事吗?
我已成功为 SafetyNet 认证创建后端服务和 Android 客户端。当我将 jws token 发送到我的服务器并尝试验证它的证书时,结果发现没有签署它的证书。 我应该向我的 Android
我正在尝试将我的应用程序投入生产,但不断收到不允许我将我的应用程序部署到生产环境的“警告”/错误。 Critical issues have been reported with the follow
我已经成功实现了 Google SafetyNet API,甚至得到了成功的响应。问题是 JWSResult来自 AttestationResponse是一个散列字符串,而我的期望是得到一个 JSON
我们有关注Scottyab Safetynet Library . 虽然我们的 Android 设备中包名称为 com.safetynet.sampleStatus{statusCode=NETWOR
检查 SafetyNet 失败并出现错误(如下)。相反,recapcha 会在浏览器打开时触发。 如果有人遇到,请帮忙。您需要的所有信息都在下面。 授权码: Future _submitPhone
我的 Android 应用程序对我的后端进行了一些 REST 调用。我希望只有且只有我的应用程序有权调用端点。 我打算使用 Google 的 SafetyNet 来存档。 1) My app ask
当对 API key 设置限制时,Attestation API 停止工作:OnFailureListener 被 CANCELLED 触发(16)状态码 限制是android包名和证书签名(SHA-
我是一名优秀的程序员,十分优秀!