我正在开发一种强大的算法来安全地重置密码并寻找用户社区的反馈。到目前为止,这是我想出的(在What is best practice for activation/registration/password-reset links in emails with nonce 的帮助下)
密码重置过程如下:当用户请求“通过电子邮件将重置密码链接发送给他们”时......
- 生成 $盐
- 提示用户输入他们希望将“重置密码”链接发送到的 $email 地址。
- 检索 $key(=秘密的用户预定义敏感帐户数据,只有他们知道,例如他们出生的城市或 SSN#Last4)
- 创建 $ nonce = hash($email . $key)
- 保存到表格:
- $nonce (PK)
- $盐
- $exp_date
- 创建 $hash =hash($salt . $email . $key)
- 通过电子邮件向用户发送重置密码的链接@ URL=...?hash=$hash
当用户点击我们发送给他们的链接时,它会将他们带到一个表单中:
- 输入$电子邮件
- 输入 $newPassword
- 确认 $newPassword
- 提示输入关键字段... 即:“输入您出生的城市:”输入 $key
当用户提交此表单时...
- 从 URL 中检索 $hash
- 重新创建 $nonce = hash($email . $key)
- 使用 $nonce 从我们的表中检索 $salt(如果未过期)。
- 如果 hash($salt . $email . $key) == $hash from URL,那么验证是 GOOD!,所以我们... 更新数据库中的用户密码
- 否则,我们拒绝更改密码的尝试
笔记:
- 所有 $email 和 $key 响应在处理之前都被修剪和小写以避免混淆。
- 定期维护任务 sproc 应定期删除所有过期的 nonce 以保持表清洁
你怎么看?