Authentication 忘记密码:实现忘记密码功能的最佳方法是什么?

Authentication 忘记密码:实现忘记密码功能的最佳方法是什么?,authentication,passwords,forgot-password,change-password,Authentication,Passwords,Forgot Password,Change Password,我想知道在网站上创建忘记密码功能的最佳方法是什么。我已经看到了很多,这里有一些或组合: 密码短语问题/答案(1个或多个) 使用新密码发送电子邮件 在屏幕上输入新密码 通过电子邮件确认:必须单击链接以获取新密码 要求用户输入新密码的页面 您会为忘记密码功能添加哪些组合或附加步骤?我想知道他们是如何申请新密码的,以及他们最终是如何获得密码的 我的操作原理是无法检索密码;必须提供/生成新密码 编辑我喜欢Cory所说的如果用户名存在就不显示,但我想知道应该显示什么。我认为一半的问题是用户忘记了他们使

我想知道在网站上创建忘记密码功能的最佳方法是什么。我已经看到了很多,这里有一些或组合:

  • 密码短语问题/答案(1个或多个)
  • 使用新密码发送电子邮件
  • 在屏幕上输入新密码
  • 通过电子邮件确认:必须单击链接以获取新密码
  • 要求用户输入新密码的页面
您会为忘记密码功能添加哪些组合或附加步骤?我想知道他们是如何申请新密码的,以及他们最终是如何获得密码的

我的操作原理是无法检索密码;必须提供/生成新密码


编辑我喜欢Cory所说的如果用户名存在就不显示,但我想知道应该显示什么。我认为一半的问题是用户忘记了他们使用的电子邮件地址,显示某种“不存在”的消息是有用的。有什么解决方案吗?

使用新密码发送电子邮件

当他们到达时强制更改密码并输入新密码

这确保了想要密码的人将是唯一进入帐户的人

如果电子邮件被嗅探,有人可以进入该帐户(当然),但真正的一方会立即发现这一点(因为您刚刚发送给他们的密码不起作用)

还向用户发送密码更改确认

如果有人得到了新密码,然后发了一封邮件说“thanx for Changed the password”,他们会感到相当困惑,如果他们没有这样做,他们会与管理员交谈

  • 我个人会发送一封电子邮件,其中包含一个短期页面的链接,让他们设置一个新密码。将页面名称设置为某种UID
  • 如果您对此不感兴趣,那么向他们发送一个新密码,并在第一次访问时强制他们更改密码也可以

  • 选项1要简单得多。

    选项1。不是一个好主意,因为通常他的想法很容易被别人猜到。莎拉·佩林(Sarah Palin)的个人电子邮件(我想是雅虎)就是这样被第三方黑客入侵的


    其他选项更好,之前的文章已经概述了细节。

    使用电子邮件验证/密码重置链接将为您提供更好的安全性。
    如果你环顾四周,大多数网站都是这样做的,人们对这种验证非常熟悉,因此我建议使用这种类型的身份验证。

    一些重要的安全问题:

    • 密码短语问题/答案实际上会降低安全性,因为它通常会成为过程中最薄弱的环节。猜测某人的答案通常比猜测密码更容易——特别是在问题没有被仔细选择的情况下
    • 假设电子邮件在您的系统中作为用户名运行(这通常是出于各种原因而推荐的),对密码重置请求的响应不应表明是否找到了有效的帐户。它应该简单地说明密码请求电子邮件已发送到提供的地址。为什么?指示电子邮件存在/不存在的响应允许黑客通过提交多个密码请求(通常通过HTTP代理,如burp套件)并注意是否找到电子邮件来获取用户帐户列表。为了防止登录捕获,您必须确保登录/auth相关功能不提供任何指示,表明有效用户的电子邮件何时已输入登录/pass重置表单
    有关更多背景信息,请查看。这是一本关于创建安全认证模型的优秀读物

    编辑:关于编辑中的问题,我建议:

    “已发送密码请求电子邮件 发送到您提供的地址。如果 电子邮件不会很快到达, 请检查您的垃圾邮件文件夹。如果没有 电子邮件到达,则不存在任何帐户 使用您提供的电子邮件。“

    这里需要在易用性和安全性之间进行权衡。您必须根据上下文平衡这一点-安全性对您和您的用户是否足够重要,以证明这一不便?

    我认为(gbrandt的)选项2是一个很好的方法,如果它与您已经为用户提供的一些个人信息相结合。i、 e出生日期

    当用户通过输入其电子邮件地址请求新密码(重置)时,在重置密码并通过电子邮件向用户发送新密码之前,他还必须输入正确的出生日期(或其他日期)

    只有那些非常了解他的人才有可能通过重置他的密码来激怒他!它不可能是陌生人或机器人

    当5或7个错误的电子邮件地址和出生日期组合出现时,会向用户发送电子邮件,告知其密码已被请求重置,并且由于凭据不正确而失败。然后,该帐户的密码重置将暂停24小时或任何所需时间

    (如果有太多用户就此电子邮件联系网站管理员,他将知道有人试图从您的网站/应用程序恶意获取信息)


    你们觉得怎么样?

    我想的是在发送给用户的链接中对数据进行签名。然后,当用户单击链接,服务器收到呼叫时,服务器也会得到加密部分,并可以验证数据是否未被触动。

    我已经为这个用例实现了一个JAVA项目。它位于GitHub上,开源。它完美地回答了你的问题。。。用Java实现

    至于电子邮件中的链接,它会生成链接,并在使用时对其进行验证

    每件事都有解释(如果遗漏了什么,请告诉我…)

    看看:

    见a


    这是一个客户端web应用程序,它使用auth流,自述文件包含所有解释。它指导您实现:

    选项1还有一个优点,即