我正在开发一种强大的算法来安全地重置密码并寻找用户社区的反馈。这是我到目前为止所提出的(在What are best practices for activation/registration/password-reset links in emails with nonce的帮助下)
密码重置过程的工作原理如下: 当用户请求“重置密码链接通过电子邮件发送给他们”时......
当用户点击我们发送的链接时,会将其带到表单中:
当用户提交此表单时......
注意:
您怎么看?
答案 0 :(得分:-1)
一些问题。通过将nonce存储到DB,您可以完全破坏nonce的含义,从而削弱应用程序的整体安全性。通过存储盐,您也会削弱安全性,因为如果我获得对数据库的访问权限,我就会知道您用于帐户的“随机”盐值,从而打开彩虹表攻击。
当用户提交此表单时......
Retrieve $hash from the URL
Recreate $nonce = hash($email . $key)
Use $nonce to retrieve $salt from our table (if unexpired).
If hash($salt . $email . $key) == $hash from URL, then the Validation is GOOD!, so we... Update the user's password in the database
Otherwise, we refuse the attempt to change the password
以上是破碎的。因为我知道你存储了nonce,所以你已经降低了应用程序的安全性,进一步存储盐也会降低你的安全性。鉴于上述情况,如果我有电子邮件+散列算法(我必须假设我知道你的算法),我可以检索盐并推断出nonce。因此,我可以“快速”打破整个数据库。