我通过以下方式实现了忘记密码服务:
- 用户进入登录页面,点击“忘记密码?”
- 用户会看到一个表单,询问他们的电子邮件地址。
- 如果在数据库中,电子邮件将发送到给定地址,并带有包含(假定)唯一、长、随机生成的字符串的链接,该字符串也与请求的时间一起存储在数据库中,允许设置时间限制链接(它是)
- 用户点击链接,它被验证,然后他们被要求提供一个新密码。
这是相当标准的,(尽管我可以更改它的一些小方面),但这让我想知道 - 既然很少提供/记住好的密码,为什么不完全放弃密码并使用忘记密码系统呢?
- 用户进入登录页面,填写电子邮件地址(或者可能是更安全的用户名?)
- 电子邮件通过链接发送。链接的有效期非常短(< 5 分钟)。
- 用户点击链接,他们在里面。
在这两种情况下,用户的电子邮件安全 - 无论是被嗅探还是被入侵 - 都是常见的威胁,但在第二种情况下:
- 该链接的有效时间要短得多。
- 它也可能会被更快地用完(任何类型的验证电子邮件都可以不用管,但如果您现在确实想登录,那么您将在获得该链接时用完该链接)。
- 用户无法提供伪劣密码。
- 用户只需记住一个密码。
- 一个帐户不能在多人之间共享(除非他们共享一个电子邮件地址)。
- 自动攻击需要侵入电子邮件系统并等待一封电子邮件,这可能比等待密码被清除的时间更长,即比 bcrypt 更好。
我只是想知道有什么缺点吗?我可以看到:
- 用户恼火,也许是不得不等待电子邮件或登录他们的电子邮件
- 它可能会打开一个新的浏览器窗口,如果您想组织标签,这可能会很烦人
- 用户可能会意识到他们必须使用更好的密码保护他们的电子邮件帐户,更改密码,然后将自己锁定:-)
这只是一个想法。
感谢所有提出答案的人,其中一些非常有趣(而且绝对有效)的观点确实让我思考并给了我更多研究领域。DW 之所以打勾,是因为提供的链接可以进一步了解这种特殊类型的情况,但我非常感谢所有给出的答案。