安全“重置密码”的强大算法

时间:2012-02-08 11:50:25

标签: algorithm security passwords password-recovery

我正在开发一种强大的算法来安全地重置密码并寻找用户社区的反馈。这是我到目前为止所提出的(在What are best practices for activation/registration/password-reset links in emails with nonce的帮助下)

密码重置过程的工作原理如下:   当用户请求“重置密码链接通过电子邮件发送给他们”时......

  1. 生成$ salt
  2. 提示用户输入要发送“重置密码”链接的$ email地址。
  3. 检索$ key(=只有他们知道的秘密用户预定义敏感帐户数据,例如他们出生的城市或SSN#Last4)
  4. 创建$ nonce = hash($ email。$ key)
  5. 保存到表格:
          
    • $ nonce(PK)
    •     
    • $盐
    •     
    • $ EXP_DATE
  6. 创建$ hash = hash($ salt。$ email。$ key)
  7. 通过电子邮件向用户发送重置密码的链接@ URL = ...?hash = $ hash
  8. 当用户点击我们发送的链接时,会将其带到表单中:      

    • 输入$ email
    •      
    • 输入$ newPassword
    •      
    • 确认$ newPassword
    •      
    • 提示关键字段...即:“输入您出生的城市:”输入$ key

    当用户提交此表单时......

    1. 从网址
    2. 中检索$ hash
    3. 重新创建$ nonce = hash($ email。$ key)
    4. 使用$ nonce从我们的表中检索$ salt(如果未过期)。
    5. 如果从URL获取哈希($ salt。$ email。$ key)== $ hash,那么验证就是好的!所以我们......    更新数据库中的用户密码
    6. 否则,我们拒绝尝试更改密码

    注意:

    • 所有$ email和$ key响应都被修剪了&
    • 定期维护任务sproc应定期删除所有过期的nonce以保持表​​清洁

    您怎么看?

1 个答案:

答案 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。因此,我可以“快速”打破整个数据库。