3

我试图了解 jwt 签名验证的工作原理。

这就是我目前的做法:

1) My app calls the attest api
2) My app sends the jwt to my server
3) My server verify the signature (third field of the jwt) using the certificate provided in the header of the jwt.

我知道签名是通过散列 jwt 的标头和有效负载然后使用 Google 的私钥对其进行签名(加密)来创建的。

我在第 3 步中所做的是获取标头 + 有效负载并使用证书的公钥对其进行解密并验证它是否与签名匹配。(当我说“我”时,我的意思是 lib 做到了)

我的问题是,如果用户设备上有恶意软件并即时修改发送到我的服务器的 JWT,会发生什么?恶意软件会在标头中添加自己的证书(由受信任的 CA 颁发),根据需要修改有效负载并创建签名。

我的服务器端......好吧,我将使用证书中提供的公钥验证签名,它将匹配。

这个对吗?还是我在某个地方感到困惑?因为在那种情况下,它会使这一切流程变得毫无用处,不是吗?如何确保自己 100% 相信 JWT 来自谷歌?

4

2 回答 2

3

关键点是验证签名证书是否attest.android.com由受信任的证书颁发机构颁发

任何受信任的 CA 都会向attest.android.com. 看看如果他们从事不良做法会发生什么https://security.googleblog.com/2016/10/distrusting-wosign-and-startcom.html?m=1

查看谷歌的文档

验证兼容性检查响应

您应该采取措施确保兼容性检查响应确实来自 SafetyNet 服务并包含与您的请求数据匹配的数据。

警告:您应该使用安全连接将整个 JWS 响应发送到您自己的服务器以进行验证。我们不建议您直接在您的应用中执行验证,因为在这种情况下,无法保证验证逻辑本身没有被修改。

按照以下步骤验证 JWS 消息的来源:

  1. 从 JWS 消息中提取 SSL 证书链。

  2. 验证 SSL 证书链并使用 SSL 主机名匹配来验证叶证书是否已颁发给主机名 attest.android.com。

  3. 使用证书来验证 JWS 消息的签名。

  4. 检查 JWS 消息的数据以确保它与您的原始请求中的数据相匹配。特别要确保随机数、时间戳、包名称和 SHA-256 哈希值匹配。

第二个点需要验证证书链。假设它使用了一个包含证书颁发机构根证书的信任管理器

我在OfflineVerify中检查了 Google 的示例代码,以确保 TrustManager 的存在,因为它没有明确说明,并且在 JWS 验证期间有效使用。它使用默认系统 TrustManager,但您可以使用自定义的

请注意,使用的是 JWS(Json Web 签名),而不是 JWT。JWT 通常是使用 JWS 签名的身份验证令牌

于 2017-07-25T06:25:13.343 回答
0

You did grasp the concept correctly. However something that you overlooked is that the lib you use is probably verifying that the certificate from which it extracts the public keys is a valid and a 'trusted' certificate (AKA comes from a trusted CA)

Thanks to this (and like the doc points it out) you need to verify yourself that the certificate has been issued by a "attest.android.com". No one will be able to forge a certificate to make it comes from this CA because.

This is what I understood at least, please correct me if I am wrong.

于 2017-07-24T23:32:35.587 回答