我正在为 Web 应用程序实现密码重置功能,并正在考虑采用类似于Django的实现。
简而言之,Django 创建一个由时间戳和时间戳和用户 ID 的哈希组成的令牌。此哈希是 HMAC,用于验证时间戳或用户 ID 是否未被篡改。
除了时间戳之外,有关用户的信息(例如她的密码盐)也会被散列。这样,如果用户更改了她的密码,令牌就会失效,从而减少了攻击者的机会之窗。
令牌生成器的源代码可以在这里查看, 这里是伪代码:
function make_token(user)
timestamp = current timestamp (now)
value = timestamp + user.id + user.password
hash = create_hmac("some secret", value)
return timestamp + ":" + hash
function check_token(user, token)
timestamp = token.split(":")[0]
hash = token.split(":")[1]
if timestamp is after expiration date
return false
value = timestamp + user.id + user.password
comparate = create_hmac("some secret", value)
// if the hash has changed, the token has been tampered with or the user has
// changed their password.
if hash != comparate
return false
return true
这对我来说似乎是一个很好的解决方案。自 2008 年左右以来,运行 Django 的网站一直在这样做,我找不到任何关于漏洞的报告。
我做了一些研究,Hacker News上有人不喜欢这种方法。还有几张关于这个主题的票表示关注。但是,我还没有找到一个具体的原因来解释为什么这可能是不安全的。
这是生成密码重置令牌的安全方法吗?如果不是,为什么?