我正在尝试在Android应用中实现SafetyNet,但是遇到了这个问题:
我收到的JWS将随机数显示为一个特定值,但它与我在此处传递的值不同:
Task<SafetyNetApi.AttestationResponse> task = client.attest(nonce.getBytes(), apiKey);
task.addOnSuccessListener(this, new OnSuccessListener<SafetyNetApi.AttestationResponse>() {
@Override
public void onSuccess(SafetyNetApi.AttestationResponse attestationResponse) {
handleJWS(attestationResponse.getJwsResult());
}
}).addOnFailureListener(this, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
if (BuildConfig.DEBUG)
Log.d("cts", "fail " + e.toString());
}
});
我使用nonce.getBytes()
作为参数,因为从服务器生成的随机数是一个字符串。
我已经一遍又一遍地读过documentation,但无法弄清楚为什么我在JWS中收到的现时值与我在attest()
中输入的值不匹配方法。如果可以预期,为什么会这样?如何使服务器期望该值以进行验证?
有什么想法吗?
谢谢!
答案 0 :(得分:0)
我遇到了同样的问题,只是想出了问题所在:现时,apkDigestSha256和apkCertificateDigestSha256的值都是Base64编码的!参见https://github.com/googlesamples/android-play-safetynet/blob/master/server/java/src/main/java/AttestationStatement.java
为了将您的随机数与JWS中的随机数进行比较,您必须:
Arrays.equals(yourNonce, Base64.decode(attestationStatement.nonce(), Base64.DEFAULT))