创建链接以重置密码的最佳做法是啥? [关闭]

Posted

技术标签:

【中文标题】创建链接以重置密码的最佳做法是啥? [关闭]【英文标题】:which is best practice for creating link for resetting the password? [closed]创建链接以重置密码的最佳做法是什么? [关闭] 【发布时间】:2012-08-07 14:40:30 【问题描述】:

我在网站上有用户,他们的密码已加密 (md5) 并存储在数据库中。现在,我有他们的电子邮件,如果有人忘记了他的密码,我想给他发送链接以重置密码。

任何人都可以建议如何做到这一点?哪些是最佳做法?

问候,卓然

【问题讨论】:

MD5 不是“加密”,它是 散列。 MD5 也不是很好的散列。 【参考方案1】:

处理密码重置的安全方法如下所示:

密码重置请求:

    用户打开密码重置申请表并输入电子邮件地址。 您的应用程序检查电子邮件是否存在于您的数据库中。如果它存在,它会创建一个令牌,该令牌应该是随机的,而不是源自用户 ID 或时间戳等信息。 令牌的散列将与用户 ID 和到期日期一起存储在数据库中的单独表中。带有原始令牌的链接会通过电子邮件发送给用户。 应用程序显示电子邮件已发送的确认信息。此页面可以包含电子邮件地址,因此用户可以检查他是否有拼写错误(毕竟没有信息是否该电子邮件在数据库中,因此攻击者无法测试其存在)。

密码重置:

    用户单击链接并打开重置表单。在此表格上,他可以输入两次新密码。令牌必须作为隐藏的输入标签包含在表单中。 提交表单后,应用程序对令牌进行哈希处理并在数据库中搜索这样的令牌哈希。如果匹配且未过期,则可以允许用户更改密码。最后令牌应该被标记为已使用,我自己更喜欢保留条目,所以当他再次点击链接时,我可以通知用户令牌已经被使用。

您可以使用 SHA512 等哈希算法对令牌进行哈希处理,无需加盐。如果令牌非常强(最小长度 20,0-9 a-z A-Z),这是安全的。理论上你必须在输入数据库之前检查这样的哈希是否已经存在,实际上这可以忽略不计。

【讨论】:

Upps,我刚刚意识到这是一个旧线程。 欣赏这个答案的细节和清晰度。谢谢。【参考方案2】:

您应该使用mail() 发送电子邮件并向数据库添加散列随机字符串。电子邮件应包含类似“domain.com/forgot.php?h=HASHEDSTRING”的链接。在该页面中,您应该检查哪个用户拥有该哈希字符串并输出一个字段供他们重置密码。

【讨论】:

【参考方案3】:

在数据库中弹出一个相当唯一的列,并且是一个随机生成的令牌字符串(很长)。当用户请求重置密码时,请通过电子邮件向他们发送该令牌以进行验证。通过链接(又名 GET)返回该令牌将确认用户有权访问电子邮件地址,并允许他们重置密码。

【讨论】:

【参考方案4】:

你可以这样做,

    如果用户忘记了密码,请允许他输入注册的电子邮件。

    发送一封带有重置密码链接的电子邮件,该链接应包含 md5(一些数据) 例如:www.ex.com/md5_data

    在发送邮件之前,输入的检查电子邮件已经存在,如果存在,则取用户 ID,存储用户 ID,与邮件一起发送的 md5(数据)

    当用户单击发送到邮件的链接时,获取 url 数据并检查表中是否存在 md5 数据,如果存在则获取用户 ID,并允许他使用用户 ID 设置新密码和更新密码并删除表中的 md5 数据,因此如果他再次单击该链接,它将无法正常工作。

【讨论】:

以上是关于创建链接以重置密码的最佳做法是啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Azure AD B2C 自助服务密码重置链接不起作用 [关闭]

如何创建密码重置链接?

回顾我的设计:网站密码重置工具

Wordpress REST API - 发送重置密码链接

linux免密登录secure报密码过期

忘记密码过程的最佳做法是啥?