Security 密钥中包含用户密码的JWT

Security 密钥中包含用户密码的JWT,security,jwt,signing,Security,Jwt,Signing,我想在我的应用程序中使用JWT。 现在我想知道,将用户密码与私人密码结合使用作为密钥来签署令牌是否安全。这样,如果用户更改其密码,令牌将失效。 但也许这会让我的秘密变得脆弱? 谢谢你的想法 通常的做法是使用相同的密钥对所有令牌进行签名。简化管理并避免在每个请求中查询数据库 使用密钥+用户密码进行签名是可行的,并且具有允许撤销令牌的优点(有一些缺点) 确保您的签名密钥足够安全(从用户密码派生),并且具有所选签名算法的建议长度。不要直接存储或使用用户密码。密码是客户端和服务器之间交换的预共享字符串。

我想在我的应用程序中使用JWT。 现在我想知道,将用户密码与私人密码结合使用作为密钥来签署令牌是否安全。这样,如果用户更改其密码,令牌将失效。 但也许这会让我的秘密变得脆弱?
谢谢你的想法

通常的做法是使用相同的密钥对所有令牌进行签名。简化管理并避免在每个请求中查询数据库

使用密钥+用户密码进行签名是可行的,并且具有允许撤销令牌的优点(有一些缺点)


确保您的签名密钥足够安全(从用户密码派生),并且具有所选签名算法的建议长度。不要直接存储或使用用户密码。

密码是客户端和服务器之间交换的预共享字符串。 因此,在你的情况下:

         SecretString= PresharedSecret + ClientPassword
因此,每次客户端传递JWT令牌时,您都需要从数据库中检索密码,或者使用某种方式预加载密码,并在密码更改时进行检查以验证令牌

这可能导致以下情况:

  • 每次客户端忘记密码时,您可能需要进行昂贵的数据库调用
  • 它将以一种方式增强安全性,因为任何更改密码的人都无法在知道以前的SecretString的情况下与服务器通信。 需要决定一个新的预共享秘密。。并使用新注册的密码进行验证

  • 总的来说,它确实提高了安全性。但是,这取决于基础设施的用途。如果是一个用户经常忘记密码的系统。。这可能不是一个很好的选择。

    我想这会使验证变得有点困难,因为我必须先加载用户。但这应该是可行的。谢谢你的回答。假设我大部分时间都收到有效的请求,我最终还是会为用户查询数据库。所以我想这实际上并不是一个很大的缺点?影响取决于你的架构。如果您使用数十个查询来实现繁重的服务,那么额外的查询就无关紧要了。但是如果您使用微服务,那么它可能会影响响应时间。另外请注意,更改密码可能不是常见的请求,但您正在惩罚所有支持此操作的服务。