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