Security 为什么不使用当前哈希密码对重置令牌进行签名?

Security 为什么不使用当前哈希密码对重置令牌进行签名?,security,reset-password,Security,Reset Password,我已经阅读了许多关于创建用户重置密码令牌的最佳实践的指南。他们都说我们应该创建另一个数据库表并存储令牌的哈希 我想,我们为什么不重新使用当前的哈希密码来签署重置令牌呢?我们通过电子邮件向用户发送该令牌,然后检查它们是否匹配 如果用户更改密码,则令牌将无效,因此它确保一次性使用。所以现在我们不必再添加额外的表 不确定我是否在这里漏掉了什么东西? 这样,你不会通过这样做引入一个主要的和直接可利用的漏洞,但是考虑一些事情来看看为什么我认为它不会真正被推荐。 任何知道密码的人都知道密码散列。可能不是真正

我已经阅读了许多关于创建用户重置密码令牌的最佳实践的指南。他们都说我们应该创建另一个数据库表并存储令牌的哈希

我想,我们为什么不重新使用当前的哈希密码来签署重置令牌呢?我们通过电子邮件向用户发送该令牌,然后检查它们是否匹配

如果用户更改密码,则令牌将无效,因此它确保一次性使用。所以现在我们不必再添加额外的表


不确定我是否在这里漏掉了什么东西?

这样,你不会通过这样做引入一个主要的和直接可利用的漏洞,但是考虑一些事情来看看为什么我认为它不会真正被推荐。 任何知道密码的人都知道密码散列。可能不是真正的用户,但如果作为攻击者,我不想直接尝试密码,因为密码太吵,会进入日志,引发警报等等。取而代之的是,我让用户改变他们的密码(例如,中间的一个人,我拦截所有的登录响应或任何东西,不管怎样),然后我猜他们的密码试图改变它,知道唯一的秘密用于令牌。这至少可能会破坏可审计性

此外,加密算法有时也有弱点。不太可能,但如果已知足够多的密文或散列(有些可能是明文),这样的一个弱点可能会允许找出密钥位。您不希望攻击者能够找到用户密码,特别是因为这些密码往往会被重复使用

所以基本上这一切都有点微妙,也许只是复杂攻击中的一个组成部分,但你不应该使用超出其目的的秘密。如果您这样做,弱点将联系在一起,一个组件的弱点(本例中密码重置)将成为另一个组件的弱点(密码存储)。最好将不同的东西分开,从而划分它们的漏洞(如果您愿意,可以减少攻击的影响)