实际上,在再次考虑这一点之后,您的方法可能不如“正常流程”安全。
如果您只是发回HASH(HASH(user's original password))
,我可以看到这可以给攻击者利用的场景:
场景一:
Jim
在您的网站上注册为jimjones@microsoft.com
.
Jim
请求重置密码,但不使用它。重置的电子邮件永远留在他的收件箱中。
Jim
更改他在您网站上的电子邮件地址。
jimjones@gmicrosoft.com
被Bob
.
Bob
现在通过他的分布式 GPGPU 农场进行暴力攻击并恢复Jim
的密码。
场景二:
Jim
使用jimjonesupinthisma!
他的银行帐户的密码。
Jim
在您的网站上注册为jimjones@microsoft.com
. jimjones@microsoft.com
与您的银行账户没有任何关联。Jim
jimjones@gmicrosoft.com
被Bob
.
Bob
现在请求重置,他现在有HASH(HASH(jim's password))
。
Bob
现在通过他的分布式 GPGPU 农场进行暴力攻击并恢复Jim
的密码,然后他使用该密码访问Jim
s 银行帐户。
场景 3:
(您的站点使用 TLS,用户通过 TLS 注册。)
Jim
在您的网站上注册为jimjones@microsoft.com
.
Bob
请求重置Jim
s 帐户的密码。
Bob
在641A 房间为 NSA 工作。
Bob
使用他的全球互联网嗅探器并HASH(HASH(jim's password))
以明文形式通过电子邮件发送到jimjones@microsoft.com
.
Bob
现在通过他的分布式 GPGPU 农场进行暴力攻击并恢复Jim
的密码。
场景 1 和 2 的变体一直发生(取决于哈希和密码的强度),我不太确定 3。关键是,您的方法会泄露不必要的信息,这确实可以利用攻击者攻击您的用户.
我建议您使用与用户密码无关的随机生成的令牌。