智威汤逊的“秘密”应该是什么?

2022-09-01 05:16:49

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

我对JWT有几个问题 - 秘密

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

答案 1
  1. 这必须是独一无二的吗?Secret

它应该对你的应用程序是唯一的 - 毕竟它需要是一个秘密 - 但它对于每个令牌都不是唯一的。相反,在任何给定时间,您都应该拥有相对较少数量的密钥(例如,通常只有一个密钥,但是在从一个密钥轮换到下一个密钥时,您有两个密钥的时间段)。

  1. 我应该使用用户密码的哈希版本作为机密吗?

不,原因有二:

  1. 假设您的用户有一个相对不安全的密码,如 .然后,在您的秘密中使用密码意味着某人可以轻松测试给定的潜在密码,以查看它是否会产生正确的签名;更重要的是,他们可以轻松测试大量潜在的密码,以查看其中是否有任何密码提供了正确的签名。这是一次离线攻击,所以你甚至永远不会知道它发生了。GoPackers123
  2. 这将要求您将所有用户的密码哈希分发到需要保存机密的每个系统。如果您拥有的用户数量超过微不足道,这可能会成为您秘密分发机制的一个非常严重的负担。

答案 2

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

  • 如果您使用对称算法(如HS256),则只有一个密钥可用于签名和验证签名。

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

切勿共享用于对令牌进行签名的密钥!

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

有关儿童索赔的更多详细信息,请参阅此答案