0

我正在尝试在 Android 应用程序中实现 SafetyNet,但遇到了这个问题:

我收到的 JWS 将 nonce 显示为特定值,但它与我在此处传递的不同:

 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()用作参数,因为从服务器生成的随机数是一个字符串。

我一遍又一遍地阅读文档,但无法弄清楚为什么我作为 JWS 的一部分收到的 nonce 值与我在attest()方法中输入的值不匹配。如果这是预期的,为什么会这样?我怎样才能让服务器期望这个值来验证它?

有任何想法吗?

谢谢!

4

1 回答 1

1

我遇到了同样的问题,只是找出了问题所在:nonce、apkDigestSha256 和 apkCertificateDigestSha256 的值是 Base64 编码的!请参阅https://github.com/googlesamples/android-play-safetynet/blob/master/server/java/src/main/java/AttestationStatement.java

为了将您的 nonce 与 JWS 中的 nonce 进行比较,您必须执行以下操作:

Arrays.equals(yourNonce, Base64.decode(attestationStatement.nonce(), Base64.DEFAULT))
于 2018-08-27T16:00:14.357 回答