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