7

我一直在研究将用户密码存储在 mysql 中,普遍的答复是使用 MD5 或 SHA1 等加密算法存储它。但是如果用户 x 忘记了她的密码并希望将其发送给她怎么办?然后怎样呢?我无法向她发送 md5 哈希!这个问题在现实世界中是如何处理的。有两个数据库吗?一个比较哈希值,另一个比较忘记密码?但是有什么区别,当时连接到它的sql用户都是只读的。你是怎么做到的?谢谢!!

4

3 回答 3

10

从不向用户发送密码是非常标准的安全做法。相反,您提供了一个密码重置实用程序,该实用程序与他们访问其电子邮件帐户的能力和/或回答有关其个人资料的问题(例如安全问题或他们居住的邮政编码)的能力相关联。

功能概要:

  1. 用户点击“忘记密码链接”
  2. 用户输入安全挑战信息(电子邮件地址、安全问题(如果需要))
  3. 系统发送带有自动生成链接的密码重置电子邮件(例如,在查询字符串中生成 GUID)
  4. 系统创建一个密码重置记录,其中包含重置 GUID、它的用户以及密钥何时超时。
  5. 用户检索电子邮件,点击链接。
  6. 系统匹配 GUID,删除密码重置记录,将用户发送到密码重置页面。
于 2012-11-09T14:36:48.353 回答
3

最好的解决方案是向用户发送一个链接,他们可以在其中输入新密码,而无需输入忘记的密码。

这个链接应该只能工作一次,而且只能工作几个小时。

不要创建新密码并通过邮件发送;用户会很想使用该密码(忽略已通过不安全通道传输的事实)。

于 2012-11-09T14:35:07.357 回答
2

您是正确的,密码不应该以纯文本形式存储(它们应该被散列),因此不能传递给忘记密码的用户。

本质上,您想要的是一种绕过正常身份验证方案的方法,您首先应该意识到这种机制是应用程序的后门。

通常会假设只有所需的用户才能访问发送到在您的应用程序中注册的电子邮件地址的电子邮件。“标准”密码重置机制正是基于此假设。这是我的看法:

  1. The forgotten password page is requested and the user is asked to enter their registered email address into a form which they then submit
    • The receiving code checks that the submitted email address is indeed registered and if it is:
      • delete any existing password reset tokens for this address from the appropriate storage
      • generate and store a new password reset token for this address
      • send an email to the user which informs them that
        • 'someone' has requested a password reset
        • to click the link if they do indeed wish to reset
        • to ignore the email if they did not request a reset
      • respond to the form submission with a page which says something along the lines of "if the address submitted was registered then a reset email has been sent"
    • 如果提交的地址不是在应用程序中注册的地址,则什么也不做,而是使用一个页面回复提交,该页面显示“如果提交的地址已注册,则已发送重置电子邮件” - 就像该地址是有效的(这是为了让某人更难发现在应用程序中注册的电子邮件地址)
  2. 然后,用户会收到忘记密码的电子邮件并单击其中的链接。该链接将密码重置令牌传递给应用程序。
  3. 收到密码重置令牌后,代码会检查令牌是否存在于存储中并且尚未过期。如果这些都成立,那么您假设必须是提交令牌的注册用户,您可以允许他们设置新密码(带有密码和密码确认输入和提交按钮的简单表单,其中包含零个人信息 -甚至没有他们的名字)。
  4. 设置密码后,您可以将用户引导到登录页面,他们可以在其中正常输入凭据。

这不是一个完美的方案。这是安全性和便利性之间的权衡,毫无疑问它构成了应用程序的后门。对于低价值的应用程序,它通常就足够了。

进一步阅读:

于 2012-11-09T15:45:47.857 回答