Google SafetyNet的JWS所包含的现时值不同于我在attest()中提交的现时值

时间:2018-07-12 18:11:33

标签: android safetynet

我正在尝试在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()中输入的值不匹配方法。如果可以预期,为什么会这样?如何使服务器期望该值以进行验证?

有什么想法吗?

谢谢!

1 个答案:

答案 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))