JWS из Google SafetyNet содержит не однозначное значение, отличное от того, которое я отправил в atst()

Я пытаюсь реализовать SafetyNet в приложении для Android, но сталкиваюсь с этой проблемой:

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() в качестве параметра, поскольку одноразовый номер, генерируемый сервером, является строкой.

Я перечитывал документацию снова и снова, но не могу понять, почему одноразовое значение, которое я получаю как часть JWS, не соответствует значению, которое я положил в attest() метод. Если это ожидается, почему это так и как я могу заставить сервер ожидать это значение для его проверки?

Есть идеи?

Спасибо!

1 ответ

Решение

У меня была та же проблема, и я только что выяснил, что было не так: nonce, 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))
Другие вопросы по тегам