关于明文:重置忘记用户密码的最佳做法

Best practice for resetting forgotten user passwords

据我所知,有两种合理的方法可以重置用户忘记的密码。

  • 让用户输入他们的电子邮件地址,并向他们的电子邮件地址发送一个新的明文密码。

  • 一个链接被发送到他们的电子邮件地址,该地址在URL中有一个uid号。点击这个按钮,用户将进入网站上的一个表单,在那里他们可以选择自己的新密码。

  • 哪种方法更可取?为什么?

    如果使用方法1,可能第三方可以阅读电子邮件并获得新密码。如果使用方法2,如何阻止某人有条不紊地通过uid代码尝试访问表单以更改用户密码?


    最好的模式是:

  • 用户请求密码重置。最好是通过用户名来完成,并且不指示用户名是否存在(以避免通过脚本列出的用户)

  • 在具有userid和datetime的新数据库表中生成记录请求(=current datetime),以及刚刚生成的guid

  • 向用户发送一封邮件,指向"密码重置"页作为参数的guid(不是userid)

  • 在这个页面上,您应该检查guid是否存在,以及最终你可以设定一个有效期(=用户有一天例如重置)

  • 不要忘记将记录标记为"已用"(在当用户重置密码时,您可以停止最后的第二次尝试…

  • 它可能更安全,但我想这已经相当好了……


    OWASP有一个很好的https://www.owasp.org/index.php/forgot_password_作弊表检查表

    以下是步骤的快速摘要:

  • 收集身份数据或安全问题
  • 验证安全问题
  • 通过侧通道发送令牌
  • 允许用户更改密码

  • 通过询问验证问题来验证发送者是否是真正的用户。

    不要在计划员工列表之外的个人电子邮件上发送密码。

    不要在电子邮件的标题或正文中添加"密码"一词。

    请确保分别发送用户名和密码。

    对于Office 365用户,请将其定向到"忘记我的密码"区域或发送此链接https://passwordreset.microsoftonline.com

    不要被用户吓倒,如果需要,请上报给IT经理。