重置密码,将密码放入JWT有效负载



我的一次性重置密码链接是这样的,带有令牌http://url.com/token。令牌的有效负载包含一个密码(散列)

当用户请求忘记密码时,则生成如下令牌

jwt.sign({ password, email }, secret, {expiresIn: "1d"})

当用户单击链接并填写重置表单时。密码重置请求被发送到服务器,在正文中包含来自url的token和新密码。

jwt.verify(req.body.token, secret)

然后我检查了数据库中的散列密码是否与jwt有效负载中显示的密码匹配。如果是,我将修改数据库中的密码。如果没有,说明一次性链接已经被使用,所以I错误(返回400错误)。

如何在不存储密码的情况下做到这一点?

我肯定不会在JWT中发送旧密码散列。如果有人想要访问其中的一堆,他们可以用它们来尝试暴力破解你的身份验证。

我要做的是有一个单独的表密码重置请求。所以每次有人请求重置链接

  1. 使用重置令牌
  2. 在DB中创建一个新的密码重置请求条目
  3. 如果数据库中已经存在该用户的密码重置请求,请删除它
  4. 用户用新密码和令牌提交重置请求
  5. 您查询您的密码重置请求表,并验证他们提供的令牌与您的DB中的令牌匹配(即,因为您只保留最新的令牌,所以您知道它是正确的)
  6. 操作密码更改并从DB中删除密码重置请求

祝你好运!

人们可以尝试破解密码哈希,即使这需要很长时间:https://security.stackexchange.com/questions/199494/how-to-crack-a-password-given-its-hash-and-its-possibilities

这会使您的密码哈希敏感,这意味着您不应该将其放在JWT令牌中。https://stackoverflow.com/questions/43496821/is-it-safe-to-store-sensitive-data-in-jwt-payload: ~:文本=理想% 20你% 20 % 20不该% 20商店,由% 20只% 20 base64 % 20解码% 20。

时间复杂性/安全风险取决于很多事情(确保您正在设置密码)。

这是JWT令牌的一个常见问题:以下是一些解决方案的链接:JSON Web令牌失效

遗漏的一项是在密码中添加密码版本(密码更改时增加的某个数字)。然后在令牌中传递此版本,而不是密码散列。由于您已经查询了数据库(以确保密码相同),因此只需查询以确保密码版本是最新版本,而无需任何额外的时间复杂度。如果相同,请修改密码。如果不相同,请勿修改密码。

最新更新