忘记用户密码重置的最佳实践

16
据我所思,有两种合理的方法可以重置用户忘记密码。
  1. 让用户输入他们的电子邮件地址,然后将新的明文密码发送到他们的电子邮件地址。
  2. 向他们的电子邮件地址发送一个带有UID编号的链接。点击该链接会带用户进入网站上的一个表单页面,用户可以在其中选择自己的新密码。
哪种方法更可取,为什么?
如果使用第一种方法,可能会出现第三方读取电子邮件并获取新密码的情况。如果使用第二种方法,有什么办法阻止某人系统性地浏览UID代码并尝试访问更改用户密码的表单?

如果我们采用第二种方式,如何处理那个链接?我正在从iOS应用程序调用忘记密码并使用FRAPI API(www.getfrapi.com)。当用户单击邮件中的链接时,我们如何处理该邮件的URL?通过API还是需要外部服务器?我需要帮助。 - Ponting
3个回答

54
最佳方案如下:
  1. 用户请求重置密码。最好通过用户名进行操作,不要指示用户名是否存在(以避免可能的用户列表脚本)

  2. 在新的数据库表中生成一条记录,包含userid、请求日期时间(=当前日期时间)和刚生成的GUID

  3. 向用户发送一封邮件,其中包含指向带有GUID(而非userid)作为参数的密码重置页面的链接

  4. 在此页面上,应检查GUID是否存在,并且可以设置一些过期日期(例如,用户有1天来进行重置)

  5. 当用户重置密码时,请不要忘记将该记录标记为“已使用”(使用表中的额外字段),以便您可以阻止可能的第二次尝试...

这可能甚至更加安全,但我认为已经相当不错了...

如果我们选择第二种方式,那么我们如何处理该链接?我正在从iOS应用程序中调用忘记密码功能,并使用FRAPI API(www.getfrapi.com)。当用户点击邮件中的链接时,我们如何处理该链接的URL?通过API还是需要外部服务器?我需要帮助。 - Ponting
但是你必须意识到,在这些情况下,电子邮件应该始终是第二种通信方式,因为用户可能无法再访问电子邮件或电子邮件根本无效。我建议您阅读此文,并获得一种良好的组合方式来保护重置密码的过程。 - arash moeen
3
嗨,阿拉什。谢谢你提供这个链接,它确实非常有趣。我认为依赖电子邮件重置密码的弱点不在于密码重置程序,而在于电子邮件账户的安全性。如果这个账户得到了很好的保护,使用它进行密码重置程序也是相当安全的。这是再次强调需要保护好电子邮件账户安全性的一种机会,因为对大多数人来说,它们是许多其他互联网账户和/或个人信息的“主钥匙”。 - Laurent S.
1
GUID 应该被哈希,否则它与明文密码没有任何区别。 - Michael
我发现很多用户会忘记他们在文件中使用的用户名和电子邮件,如果您不向用户提供有关他们输入的用户名和/或电子邮件是否有效的任何信息,则最终会出现一条消息,使人们相信他们将收到密码重置链接,但实际上并没有。这些用户可能会感到困惑和沮丧,并仍然难以访问其帐户,而如果他们被告知无论他们输入什么都没有找到电子邮件/用户名,他们可能会记住正确的信息。这是一个权衡。 - cazort
显示剩余3条评论

15

-4

通过询问验证问题来确认发件人是否为真实用户。

不要将密码发送到未包含在计划员工列表中的个人电子邮件。

不要在电子邮件的标题或正文中添加“密码”这个词。

确保单独发送用户名和密码。

对于 Office 365 用户,请指引他们到“忘记密码”区域或者发送此链接 https://passwordreset.microsoftonline.com

不要被用户吓倒,如有需要请升级至 IT 经理。


7
永远不要通过电子邮件发送密码。 - Laurent S.
更普遍地说,如果您甚至存储密码,那么您的审核人员面临着不必要的安全风险。只存储单向哈希,并确保它是强哈希。 - cazort

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接