忘记密码:实现忘记密码function的最佳方法是什么?
我想知道什么是最好的方法是在网站上创build一个忘记密码function。 我在那里看过不less,这里有几个或者组合:
- 密码问题/答案(1或更多)
- 用新密码发送电子邮件
- 在屏幕上给新的密码
- 通过电子邮件确认:必须点击链接获取新密码
- 页面要求用户input一个新的密码
什么组合或额外的步骤,你会添加到忘记密码function? 我想知道他们如何请求新的密码,以及他们如何最终得到它。
我正在操作的密码无法检索的原则; 必须给出/生成一个新的密码。
编辑我喜欢科里说,如果用户名不存在显示,但我想知道显示什么,而不是。 我想一半的问题是,用户忘记了他们使用哪个电子邮件地址,显示某种“不存在”消息是有用的。 任何解决scheme
- 我个人会发送一封电子邮件,里面有短期页面的链接,让他们设置一个新的密码。 使页面名称某种UID。
- 如果这不能吸引你,那么给他们发一个新的密码,强迫他们在第一次访问时改变它也是可以的。
选项1要容易得多。
一些重要的安全问题:
- 密码问题/答案实际上降低了安全性,因为它通常成为过程中最薄弱的环节。 猜测某人的答案通常比口令更容易 – 特别是如果问题没有被仔细select的话。
- 假设电子邮件作为系统中的用户名(通常由于各种原因而推荐)操作,对密码重置请求的响应不应指示是否find有效的帐户。 它应该简单地说明密码请求电子邮件已经发送到提供的地址。 为什么? 指示电子邮件存在/不存在的响应允许黑客通过提交多个密码请求(通常通过诸如burp套件之类的HTTP代理)来获取用户账户列表,并且注意是否find了电子邮件。 为了防止login收获,您必须确保没有login/身份validation相关function提供login/通过重置表单时input有效用户电子邮件的任何指示。
有关更多背景信息,请查看Web应用程序黑客手册 。 这是创build安全身份validation模型的绝佳读物。
编辑 :关于你在编辑中的问题 – 我会build议:
“密码请求邮件已经发送到您提供的地址,如果邮件没有很快到达,请检查您的垃圾邮件文件夹,如果没有邮件到达,那么您提供的邮件就不存在帐户。
在易用性和安全性之间有一个折衷。 您必须根据上下文来平衡这一点 – 安全性对于您和您的用户是否足够重要,以certificate这种不便之处?
用新密码发送电子邮件。
当他们到达时强制更改密码并input新密码。
这确保了想要密码的人将是唯一进入账户的人。
如果电子邮件被嗅探,有人可以进入帐户(当然),但真正的聚会会立即发现(因为他们刚刚发送的密码不起作用)。
同时向用户发送密码更改确认。
如果有人得到新的密码,然后一封电子邮件说“比较改变密码”,他们会相当困惑,并会与pipe理员,如果他们不这样做。
使用电子邮件validation/密码重置链接将为您提供更好的安全性。 如果你仔细看看这是大多数网站的做法,而且人们很习惯这种validation,所以我build议使用这种types的身份validation。
我认为(gbrandt的)选项2将是一个很好的方法,如果它与您已经为用户的一些个人信息相结合。 即出生date。
当用户通过input他的电子邮件地址请求一个新的密码(重置)时,他还必须input一个正确的出生date(或其他),然后重新设置密码并通过电子邮件将新的密码发送给用户。
只有那些认识他的人才能通过重设密码来惹恼他! 它不能成为一个陌生人或机器人
在5或7个错误的电子邮件地址和出生date组合中,通过电子邮件发送用户的密码已被要求重置并且由于不正确的凭证而失败。 然后,该帐户的密码重置将被暂停24小时或任何期望的时间。
(如果太多的用户联系webadmin关于这封电子邮件,他会知道有人试图从您的网站/应用程序恶意获取信息)
你们有什么感想?
选项1 不是一个好主意,一般他很容易被其他人猜到。 佩林的个人电子邮件(雅虎我认为)被第三方以这种方式黑了。
其他选项更好,以前的职位已经勾勒出细节。
我已经为这个用例实现了一个JAVA项目。 它在GitHub上,开源。 它完美地回答你的问题…用Java实现。
至于电子邮件中的链接 – 它会生成链接,并在使用时进行validation。
有一切的解释(如果有东西丢失 – 让我知道…)
看看: https : //github.com/OhadR/Authentication-Flows
在这里看到一个演示 。
这是使用auth-flow的客户端Web应用程序,以及所有解释的README。 它指导你的实现: https : //github.com/OhadR/oAuth2-sample/tree/master/authentication-flows