4

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

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

  1. 生成 $
  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

当用户点击我们发送给他们的链接时,它会将他们带到一个表单中:

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

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

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

笔记:

  • 所有 $email 和 $key 响应在处理之前都被修剪和小写以避免混淆。
  • 定期维护任务 sproc 应定期删除所有过期的 nonce 以保持表清洁

你怎么看?

4

1 回答 1

0

几个问题。通过将 nonce 存储到数据库中,您完全破坏了 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,所以你降低了应用程序的安全性,进一步通过存储盐,你也削弱了安全性。鉴于上述情况,如果我有电子邮件 + 散列算法(你必须假设我知道你的算法),我可以检索盐并推断随机数。因此我可以“快速”破坏整个数据库。

于 2012-02-15T02:49:41.860 回答