PHP password recovery
我认识到为了安全起见,密码不应该以明文形式存储在数据库中。如果我散列它们,我就可以为登录目的验证它们。
但是,如果我想建立一个密码恢复系统,那么最好的策略是什么,因为散列操作是不可撤销的?
有人能简要介绍一下存储和恢复密码的安全策略吗?
- 在某个地方一定有这种事
- @雅各布·雷金,你是说,像这样?stackoverflow.com/questions/2283937/…
- 还有,什么该死的家伙不使用MD5。
- @用户257493:MD5出了什么问题?当然,如果是加盐的话,那就好了。
- @用户257493是!
- php.net/faq.passwords(密码)
您不能恢复已散列的密码,也不应该恢复。
你应该做的是:
对密码重置请求进行验证,例如验证码。
创建一个一次性随机代码,并将其链接发送到用户的电子邮件。
让这个代码在一小时内到期。
使用后立即终止此代码。
在与代码的链接上,如果代码有效,允许他更改密码。
通知他密码已更改,但不要在电子邮件中发送。
- 完全同意100%。不要在电子邮件中发送任何密码(即使是临时密码)。当然,一次性代码和密码一样好,但是你还能做什么……
- 代码只在有限的时间内和密码一样好,这使得它不那么危险。
- 假设,比如说Alice,用&171;假&187;电子邮件([email protected])注册到您的网站(website.com)。嗯,[email protected](又名bob)是一个现有的hotmail帐户,所有者是一个坏的、聪明的、活跃的人。Bob看到一个机会,并使用收到的激活链接激活Alice的帐户。鲍勃是个坏孩子,他真的想登录爱丽丝的website.com帐户,他知道怎么做。Bob请求密码请求,填写自己的电子邮件地址,发送请求,接收激活链接,单击此链接,更新Alice的密码。最后,Bob可以登录。
- @Marc Andr&233;Fecteau这就是为什么你不应该使用他人创建的真实域名和账户来伪造电子邮件的原因。创建一个带有随机长密码的gmail帐户,一旦你完成了它,你就可以扔掉密码。当然,如果你需要恢复站点的密码,你就有麻烦了:)
- 对于步骤5:是否可以为用户生成一个新密码并将其显示在页面上,从而减少所需步骤?
- 如果输入了假电子邮件地址,请使用example.com作为域;-)
您不能"恢复"密码。你做的是两件事之一。
向用户发送链接以创建新密码,覆盖当前密码
向用户发送随机生成的密码,然后要求他们更改。
- en.wikipedia.org/wiki/one-time_密码
我的流程如下。
1。用户启动忘记的密码请求
用户单击一个忘记密码的链接,然后重定向到一个重置密码表单,要求他们输入注册的电子邮件地址。
2。验证电子邮件地址并生成令牌
用户输入电子邮件地址后,系统会验证数据库中是否存在该地址。如果电子邮件地址有效,则会生成一个令牌,并使用用户凭据存储在数据库中。
三。发送恢复电子邮件
电子邮件发送到注册的电子邮件地址,其中包含指向重置表单的链接,该链接包含2个get参数,包括令牌和存储在数据库中的用户唯一ID。
4。重置密码
用户单击链接后,它们将被带到重置窗体。系统从URL中检索2个get参数,并验证它们是否存在于数据库中。如果验证令牌是否存在于用户的数据库中,则可以向用户显示"重置密码"窗体字段以输入新密码。
安全性
我建议使用bcrypt(从php 5.3开始就可以使用)来散列密码,为了增加安全性,可能需要对令牌使用某种过期时间,以便在一段时间后不能使用它。
- 并且只在数据库中存储令牌的散列值,否则具有数据库读取访问权限(SQL注入)的攻击者可以要求重置他想要的任何电子邮件,并且因为他可以读取新令牌,所以他可以劫持帐户。
- 如果您有sqli漏洞,那么您会有更大的顾虑。
您可以为用户和MD5创建一个新的(随机生成的)密码,然后通过电子邮件发送用户。
- 通过电子邮件发送密码是一个坏主意,因为许多人几乎永远都会存储电子邮件,而且信息可能会泄露出来。
- @斯塔姆:他指的是临时密码。然后用户登录进行更改。
- @斯塔姆:这就是为什么你告诉用户在用这个随机生成的密码登录后要更改他们的密码。
- @当然,这个密码是临时密码。必须由用户更改。
- @韦比戴夫,如果我改密码而不是他怎么办?
- @用户257493,他可以设置临时密码的到期日期。新密码请求后,用户应更改其临时密码。
- MD5开裂。Sa2比较好。