我将把JWT应用到我使用Java-Jersey开发的REST API中。我正在将此库用于JWT - https://github.com/auth0/java-jwt
我对JWT - Secret
的问题很少Secret
必须是唯一的吗?答案 0 :(得分:18)
- 这个
醇>Secret
必须是唯一的吗?
它应该是您的应用程序所特有的 - 毕竟它必须是秘密 - 但它对于每个令牌都不是唯一的。相反,您应该在任何给定时间拥有相对较少数量的密钥(例如,通常只有一个密钥,但是当您从一个密钥旋转到下一个密钥时,您有两个密钥的短暂时间段。)
- 我应该使用用户密码的哈希版本来保密吗?
醇>
不,有两个原因:
GoPackers123
。在您的秘密中使用密码意味着有人可以轻松测试给定的潜在密码,看它是否产生正确的签名;而且,更重要的是,他们可以轻松测试大量潜在密码,看看是否有任何密码给出正确的签名。这是一次离线攻击,所以你永远不会知道它发生了。答案 1 :(得分:7)
JWT和java-jwt库支持签名的对称和非对称算法:
如果你选择对称算法,例如HS256,你将只有一个密钥用于签名和验证签名。
如果您考虑非对称算法,例如RS256,您将拥有私钥和公钥。保持私钥在服务器上安全并使用它来签署令牌。使用公钥验证签名(也可以与需要验证签名的人共享)。
永远共享用于签署令牌的密钥!
没有什么能阻止你拥有一套用于签署令牌的不同密钥。在这种情况下,kid
标头参数可用于指示用于对令牌进行签名的密钥。该声明应该带有密钥标识符,而不是密钥本身。
答案 2 :(得分:3)
使用RSA256即私钥/公钥对(不需要'秘密')。 这样你可以保密私钥是安全的(它只用于签署令牌),你可以使用公钥来验证签名是否正确。
您可以将公钥提供给需要验证令牌签名是否正确的任何人或任何服务。