【问题标题】:Android SafetyNet JWT signature verificationAndroid SafetyNet JWT 签名验证
【发布时间】:2017-12-30 16:23:06
【问题描述】:

我正在尝试了解 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 来自谷歌?

【问题讨论】:

    标签: android validation jwt digital-signature safetynet


    【解决方案1】:

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

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

    查看 Google 的 doc

    验证兼容性检查响应

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

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

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

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

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

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

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

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

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

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

    【讨论】:

    • 是什么阻止了我创建假证书并使其“由”“attest.android.com”颁发。验证签名的库是否会因为该证书中的公钥与 TrustedManager 中的公钥不匹配而失败?
    • 没错,攻击者颁发的假证书不会使用您信任库中存储的任何受信任的根证书进行签名,因此签名验证过程将失败。我将它检查到谷歌代码中,因为不清楚它使用的是什么信任库
    【解决方案2】:

    您确实正确掌握了这个概念。但是,您忽略的一点是,您使用的 lib 可能正在验证从中提取公钥的证书是否有效且“受信任”证书(AKA 来自受信任的 CA)

    多亏了这一点(就像文档指出的那样),您需要验证自己的证书是由“attest.android.com”颁发的。没有人能够伪造证书使其来自该 CA,因为。

    这是我至少理解的,如果我错了,请纠正我。

    【讨论】:

      猜你喜欢
      • 2016-08-28
      • 2019-11-14
      • 2018-09-16
      • 2014-05-29
      • 2019-11-01
      • 2016-07-10
      • 2018-05-29
      • 2013-07-12
      相关资源
      最近更新 更多