带有 JWT ID 声明的一次性 JWT 令牌

信息安全 验证 jwt 重设密码
2021-09-02 11:16:08

我试图弄清楚如何为密码重置功能颁发一次性使用的 JWT 令牌并仍然保持无状态。遇到了带 JWT 的一次性令牌,它基本上建议包含当前密码的哈希值,一旦密码成功更改,该哈希值就会失效。

我对在 JWT 中包含密码哈希感到不舒服,所以我进行了一些研究,发现了JWT ID 规范,但这需要将 ID 存储在某个地方,以便可以在令牌验证时对其进行检查。

所以我的问题是,如果我在通过电子邮件发送的密码重置链接令牌中包含当前密码哈希,会有什么安全问题?

使用 JWT ID 并将其作为列添加到数据库中的某处而不是使用密码会更好吗?

1个回答

我犹豫是否要推出自己的安全性,但只是为了好玩,这是一个想法。

在生成 JWT 时,请遵循以下流程,而不是包含密码哈希:

  1. 获取密码哈希
  2. 获取服务器端密钥(256 位熵应该可以)
  3. 计算一个过期时间戳,比如从当前时间开始一个小时
  4. 在 1 + 2 + 3 上创建一个新哈希
  5. 在 JWT 中包含哈希和过期时间戳

要验证密码重置请求:

  1. 获取密码哈希
  2. 获取服务器端密钥
  3. 从 JWT 读取(并检查)过期时间戳
  4. 计算 1 + 2 +3 的新哈希
  5. 与 JWT 中的哈希值进行比较

这样您就不会暴露密码哈希,并且如果不暴力破解密钥(这将花费数百万年),它就不能被暴力破解。而且您还可以通过在其中嵌入时间戳来阻止重用哈希。