PHP密码恢复

PHP password recovery

我认识到为了安全起见,密码不应该以明文形式存储在数据库中。如果我散列它们,我就可以为登录目的验证它们。

但是,如果我想建立一个密码恢复系统,那么最好的策略是什么,因为散列操作是不可撤销的?

有人能简要介绍一下存储和恢复密码的安全策略吗?


您不能恢复已散列的密码,也不应该恢复。

你应该做的是:

  • 对密码重置请求进行验证,例如验证码。
  • 创建一个一次性随机代码,并将其链接发送到用户的电子邮件。
  • 让这个代码在一小时内到期。
  • 使用后立即终止此代码。
  • 在与代码的链接上,如果代码有效,允许他更改密码。
  • 通知他密码已更改,但不要在电子邮件中发送。

  • 您不能"恢复"密码。你做的是两件事之一。

  • 向用户发送链接以创建新密码,覆盖当前密码
  • 向用户发送随机生成的密码,然后要求他们更改。

  • 我的流程如下。

    1。用户启动忘记的密码请求

    用户单击一个忘记密码的链接,然后重定向到一个重置密码表单,要求他们输入注册的电子邮件地址。

    2。验证电子邮件地址并生成令牌

    用户输入电子邮件地址后,系统会验证数据库中是否存在该地址。如果电子邮件地址有效,则会生成一个令牌,并使用用户凭据存储在数据库中。

    三。发送恢复电子邮件

    电子邮件发送到注册的电子邮件地址,其中包含指向重置表单的链接,该链接包含2个get参数,包括令牌和存储在数据库中的用户唯一ID。

    4。重置密码

    用户单击链接后,它们将被带到重置窗体。系统从URL中检索2个get参数,并验证它们是否存在于数据库中。如果验证令牌是否存在于用户的数据库中,则可以向用户显示"重置密码"窗体字段以输入新密码。

    安全性

    我建议使用bcrypt(从php 5.3开始就可以使用)来散列密码,为了增加安全性,可能需要对令牌使用某种过期时间,以便在一段时间后不能使用它。


    您可以为用户和MD5创建一个新的(随机生成的)密码,然后通过电子邮件发送用户。