在mysql中存储密码...使用哈希吧?但是你如何向用户发送忘记密码?

时间:2012-11-09 14:32:14

标签: mysql sql security passwords

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

3 个答案:

答案 0 :(得分:10)

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

功能概要:

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

答案 1 :(得分:3)

最佳解决方案是向用户发送一个链接,用户可以输入新密码,而无需输入被遗忘的密码。

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

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

答案 2 :(得分:2)

密码不应以纯文本(they should be hashed)存储,这是正确的,因此无法将其传递给忘记密码的用户。

基本上,您希望的是一种规避正常身份验证方案的方法,您首先应该意识到这种机制是应用程序的后门。

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

  1. 请求忘记密码页面,并要求用户将他们注册的电子邮件地址输入他们随后提交的表格中
    • 接收代码检查提交的电子邮件地址是否确实已注册,如果是:
      • 从相应的存储空间中删除此地址的所有现有密码重置令牌
      • 为此地址生成并存储新密码重置令牌
      • 向用户发送电子邮件通知他们
        • '某人'要求重置密码
        • 点击链接,如果他们确实希望重置
        • 如果他们没有请求重置,则忽略该电子邮件
      • 回复表单提交,其中的页面上写着“如果提交的地址已注册,则已发送重置电子邮件”
    • 如果提交的地址不是在应用程序中注册的地址,那么除了回复提交时,请回复一个页面,该页面上写着“如果提交的地址已注册,然后重置电子邮件已被发送“ - 就像地址是有效的一样(这是为了让某人发现在应用程序中注册的电子邮件地址更加困难)
  2. 然后,用户会收到忘记的密码电子邮件,然后单击其中的链接。该链接将密码重置令牌传递给应用程序。
  3. 收到密码重设令牌后,代码会检查该令牌是否存在于存储中且尚未过期。如果这些都成立,那么您认为它必须是提交令牌的注册用户,并且您可以允许他们设置新密码(带有密码和密码确认输入和提交按钮的简单表单,其中包含零个人信息 - 甚至不是他们的名字。)
  4. 设置密码后,您可以将用户定向到正常输入凭据的登录页面。
  5. 这不是一个完美的计划。这是安全性和便利性之间的权衡,并且毫无疑问它构成了应用程序的后门。对于低价值的应用程序,它通常足够好。

    进一步阅读: