如何计算有权访问证书的正确 apkCertificateDigestSha256?
How to calculate proper apkCertificateDigestSha256 having access to certificate?
SafetyNet 文档 (https://developer.android.com/training/safetynet/attestation) 声明在名为 apkCertificateDigestSha256 的证明令牌中返回的字段是 Base-64 encoded representation(s) of the SHA-256 hash of the calling app's signing certificate(s)
。
我可能误解了它的意思,因为我的数据不匹配。如果我调查我的证书指纹,我有 SHA256 字段,它有 32 个字节的长度。当我尝试在 base64 中对其进行编码时,我得到了更长的字符串。这是使用字符串 hello world
sha256 散列然后编码为 base64 的示例结果:
Yjk0ZDI3Yjk5MzRkM2UwOGE1MmU1MmQ3ZGE3ZGFiZmFjNDg0ZWZlMzdhNTM4MGVlOTA4OGY3YWNlMmVmY2RlOQ==
同时 google 证明令牌 returns 从 base64 解码的更短的散列显示看似随机的值。例如这个:
EmGH9u67SiSyLuvZCoAN+R+NU/yHP29gSmoUgvNtehk=
解码后没有任何意义。
如何根据我的证书获得与 google 相同的结果?为什么他们的 sha256 哈希不是 32 字节长?
根据迈克尔在评论中的建议,问题是我使用的是指纹的文本表示而不是二进制数据。通过更改这一细节,我设法获得了与 Google returns.
相同的结果
您可以使用此命令轻松生成它
OSX:
keytool -printcert -jarfile ~/PATH_TO/YOURAPKFILE.apk | grep "SHA256: " | cut -d " " -f 3 | xxd -r -p | openssl base64
或者如果您已经有 SHA256 签名的文本表示,请使用此命令
echo "SHA256_TEXT_REPRESENTATION" | xxd -r -p | openssl base64
xxd 对输入进行十六进制转储,基本上是文本到二进制
SafetyNet 文档 (https://developer.android.com/training/safetynet/attestation) 声明在名为 apkCertificateDigestSha256 的证明令牌中返回的字段是 Base-64 encoded representation(s) of the SHA-256 hash of the calling app's signing certificate(s)
。
我可能误解了它的意思,因为我的数据不匹配。如果我调查我的证书指纹,我有 SHA256 字段,它有 32 个字节的长度。当我尝试在 base64 中对其进行编码时,我得到了更长的字符串。这是使用字符串 hello world
sha256 散列然后编码为 base64 的示例结果:
Yjk0ZDI3Yjk5MzRkM2UwOGE1MmU1MmQ3ZGE3ZGFiZmFjNDg0ZWZlMzdhNTM4MGVlOTA4OGY3YWNlMmVmY2RlOQ==
同时 google 证明令牌 returns 从 base64 解码的更短的散列显示看似随机的值。例如这个:
EmGH9u67SiSyLuvZCoAN+R+NU/yHP29gSmoUgvNtehk=
解码后没有任何意义。
如何根据我的证书获得与 google 相同的结果?为什么他们的 sha256 哈希不是 32 字节长?
根据迈克尔在评论中的建议,问题是我使用的是指纹的文本表示而不是二进制数据。通过更改这一细节,我设法获得了与 Google returns.
相同的结果您可以使用此命令轻松生成它
OSX:
keytool -printcert -jarfile ~/PATH_TO/YOURAPKFILE.apk | grep "SHA256: " | cut -d " " -f 3 | xxd -r -p | openssl base64
或者如果您已经有 SHA256 签名的文本表示,请使用此命令
echo "SHA256_TEXT_REPRESENTATION" | xxd -r -p | openssl base64
xxd 对输入进行十六进制转储,基本上是文本到二进制