【问题标题】:What should be the "Secret" in JWT?JWT 中的“秘密”应该是什么?
【发布时间】:2017-08-07 03:58:08
【问题描述】:

我打算将 JWT 应用到我使用 Java-Jersey 开发的 REST API 中。我正在将此库用于 JWT - https://github.com/auth0/java-jwt

我对 JWT - Secret 有几个问题

  1. Secret 必须是唯一的吗?
  2. 我应该使用用户密码的散列版本来保密吗? (那么无论如何它都不是唯一的)这是因为当用户更改密码时,他的令牌将自动失效。

【问题讨论】:

    标签: java rest jwt secret-key


    【解决方案1】:

    使用 RSA256,即私钥/公钥对(不需要“秘密”)。 这样您就可以保持私钥的机密性和安全性(它将仅用于签署令牌),并且您可以使用公钥来验证签名是否正确。

    您可以将公钥提供给需要验证令牌签名是否正确的任何人或任何服务。

    【讨论】:

      【解决方案2】:
      1. Secret 必须是唯一的吗?

      它对于您的应用程序应该是唯一的——毕竟它必须是一个secret——但它不会对每个令牌都是唯一的。相反,在任何给定时间,您都应该拥有相对较少数量的密钥(例如,通常只有一个密钥,但在从一个密钥轮换到另一个密钥时,您会在短时间内拥有两个密钥)。

      1. 我应该使用散列版本的用户密码作为密码吗?

      不,有两个原因:

      1. 假设您的用户有一个相对不安全的密码,例如GoPackers123。然后,在您的秘密中使用密码意味着有人可以轻松地测试给定的潜在密码,看看它是否会产生正确的签名;而且,更重要的是,他们可以轻松测试大量潜在密码,看看其中是否有任何一个给出了正确的签名。这是一次离线攻击,因此您甚至都不会知道它发生了。
      2. 这将要求您将所有用户的密码哈希分发到需要保存机密的每个系统。如果您的用户数量很少,这可能会对您的秘密分发机制造成相当严重的负担。

      【讨论】:

      • usually having just one key - 我可以只有一把钥匙吗?我的意思是对每个人,永远?或者您的意思是每个用户在注销之前都需要分配一个密钥,但当时 100 个用户将拥有 100 个密钥?也是最后一个问题,两个人有相同的秘密会引起冲突,A 的人会看到B 的记录等等?
      • @PeakGen:您不会与用户共享秘密,因此您不需要为不同的用户提供不同的秘密。但是您确实需要经常更改密钥;您可以为所有人使用一键,但不能永远使用一键
      • 谢谢,另一个问题。我在java-jwt 中使用了one 硬编码secretHS256。我注意到我所有的用户都得到了相同的token。 api 使用此令牌进行保护。这是正常行为吧?
      • @PeakGen:应该单独发布单独的问题,但简而言之:不,这不正常。您的代币应包含 expsub 之类的声明,以限制生命周期和区分用户;所以没有两个令牌应该是相同的。
      【解决方案3】:

      JWT 和 java-jwt 库同时支持 对称非对称 算法的签名:

      • 如果您选择 HS256 等 对称算法,您将只有一个密钥可用于签名和验证签名。

      • 如果您考虑非对称算法,例如 RS256,您将拥有一个私钥和一个公钥。将私钥安全地保存在服务器上,并使用它来签署令牌。使用公钥验证签名(也可以与需要验证签名的人共享)。

      永远不会共享用于签署令牌的密钥!

      没有什么能阻止您使用一组不同的密钥来签署您的令牌。在这种情况下,kid 标头参数可用于指示使用哪个密钥对令牌进行签名。这个声明应该带有一个密钥标识符,而不是密钥本身。

      有关kid 声明的更多详细信息,请参阅此answer

      【讨论】:

      • 好的,哪一个最好? HS256RSA256
      • @PeakGen 问题应该是:哪一个最适合我的应用程序? 答案是:这取决于您的要求。如果要允许客户端验证签名,请使用 RS256。否则,坚持HS256。这个answer 可能会有所帮助。
      • @PeakGen 如果您需要任何进一步的说明,请告诉我。
      • 谢谢。我相信 HS256 是我要走的路,因为我不向用户提供任何密钥,他们也没有使用这样的密钥。谢谢,另一个问题。我在java-jwt 中使用了one 硬编码secretHS256。我注意到我所有的用户都得到了相同的token。 api 使用此令牌进行保护。这是正常行为吧?
      • @PeakGen 我的所有用户都获得相同的令牌是什么意思?
      猜你喜欢
      • 2021-10-19
      • 2013-07-02
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 2013-09-15
      • 2016-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多