我们都知道我们不应该将用户密码存储为纯文本 数据库。但是我看到一些已经实施的网站 发送忘记密码功能。所以如果我问我的密码,我输入 我的电子邮件,他们发送密码。 注意:我不是在谈论密码更改(http://sample.com/forgot_pass?token=ddm39fhksnc)
这些网站如何实现这一目标?他们存储普通密码 数据库(也许是一个不同的数据库),因为据我所知 无法将密码哈希值反转为它构建的原始字符串...
有没有这个功能可以安全实施?或者我应该 说服客户坚持使用忘记传递链接方法。
感谢。
答案 0 :(得分:1)
如果他们能够向您发送密码,那么他们就会以纯文本格式存储您的密码。
请注意,如果使用了弃用的哈希函数(如md5),则可以从哈希中找出原始密码。
没有办法安全地做到这一点。如果您的数据库遭到破坏,攻击者将能够读出所有密码和相应的电子邮件地址/用户名。如果您的用户为不同的网站重复使用相同的密码(大多数人都会这样做)会发生什么。
即使有一个"安全"从哈希中找出密码的方法是什么阻止攻击者做同样的事情?
答案 1 :(得分:1)
这样的功能无法安全实施。如果应用程序可以检索原始密码(例如,从加密密码),则成功的攻击者也可以检索密码。这就是为什么人们应该使用像BCrypt,SCrypt或PBKDF2这样的哈希函数。
另一个缺点是每封电子邮件都会发送密码。更好的方法是发送令牌,让用户在确认后选择自己的密码。相同的代码可用于注册新用户和重置密码。
答案 2 :(得分:0)
如果将实际密码存储在数据库中,则会打开主要安全问题的大门。但是,如果实际上你必须向他们重新发送密码,你可以采用的一种方式是,当他们注册时,将密码存储在公共目录之外的文本文件中。
然后创建某种命名逻辑,将记录与文本文件相关联。然后从那里开始,使它成为访问该文本文件的唯一方法是使用适当的安全检查,然后通过您的脚本。
答案 3 :(得分:0)
我的解决方案是在我的数据库中的“user”表中添加两个字段:“token”字段和“expired_time”字段。
当用户发送重置密码的请求时,您的应用程序将更新令牌字符串和过期时间以重置该用户的密码。
发送一封电子邮件,其中包含用户名(或电子邮件,或ID,...)和令牌http://example.com/resetpassword.php?id=userid&token=token
在resetpassword.php中,您将按用户ID,令牌和过期时间(可能是5分钟)检查身份验证
允许用户更改密码。
这是我的解决方案,我希望它有用:)