【问题标题】:Should we always ignore the alg parameter in the JWT header?我们是否应该始终忽略 JWT 标头中的 alg 参数?
【发布时间】:2018-03-07 23:29:54
【问题描述】:

this article 中,作者描述了一个场景,黑客通过利用以下事实构造有效的 JWT 令牌:为了验证签名,验证者首先必须查看标头。如果我们总是将 RSA 与公钥私钥对一起使用,那是否完全避免了这种黑客攻击发生的可能性?

这是一个引用:

不幸的是,攻击者可以滥用它。如果服务器期待一个用 RSA 签名的令牌,但实际上收到了一个用 HMAC 签名的令牌,它会认为公钥实际上是一个 HMAC 密钥。

我假设此语句意味着如果标头中的 alg 键表示令牌正在使用 HMAC,则检查令牌的代码将切换到 HMAC。因此,如果我们总是使用 RSA 而从不使用 HMAC,因此从不检查标头,我们只需使用我们的公钥验证令牌,如果验证失败,我们拒绝访问,这能解决这个问题吗?

这种方法是否会引入任何其他安全问题?

【问题讨论】:

  • 正如论文所说,只要您不根据标头中的内容选择算法,那么您应该是安全的。
  • 太棒了 - 我更新了主题以更准确地反映主题。
  • 根据论文,在一些弱类型语言(php、js)中存在与一些库相关的漏洞。使用公钥验证 JWT,就好像它是一个 HMAC 我认为它是一个具体的错误,而不是一个广泛的漏洞。我不认为应该完全省略标头验证,因为有有用的信息,例如可以安全推断的哈希算法(例如 RS256 vs RS512)

标签: security rsa jwt


【解决方案1】:

是的,只要您知道 Algo 会发生什么,并且您使用的是最新更新的库,那么您应该会很好。如果您可以访问该站点https://jwt.io,您会发现他们也强调了此漏洞,并且对于受影响的库,他们提到了要使用的最低版本,该版本已解决该问题,即算法验证没有被绕过.

    verify(string token, string algorithm, string verificationKey)

这是我的理解。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 2013-05-06
    • 2015-02-08
    • 2023-02-21
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多