【问题标题】:Forgot Password: what is the best method of implementing a forgot password function?忘记密码:实现忘记密码功能的最佳方法是什么?
【发布时间】:2010-10-06 02:19:00
【问题描述】:

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

  • 密码问题/答案(1 个或多个)
  • 使用新密码发送电子邮件
  • 在屏幕上输入新密码
  • 通过电子邮件确认:必须单击链接才能获取新密码
  • 要求用户输入新密码的页面

您会为忘记密码功能添加哪些组合或额外步骤?我想知道他们如何请求新密码以及他们最终如何获得它。

我正在操作的主体上密码无法找回;必须提供/生成新密码。

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

【问题讨论】:

    标签: authentication passwords forgot-password change-password


    【解决方案1】:

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

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

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

    对所有事情都有解释(如果缺少某些东西 - 让我知道...)

    看看:https://github.com/OhadR/Authentication-Flows

    查看Demo here

    这是使用 auth-flows 的客户端 web 应用程序,带有包含所有解释的 README。它指导您实施:https://github.com/OhadR/authentication-flows/tree/master/authentication-flows

    【讨论】:

    • 我快速查看了源代码,但没有找到真正起作用的代码。所以我想知道配置中的 sha-256,这是否意味着密码是通过单个散列计算进行散列的,还是这是迭代 PBKDF2 的一部分?盐真的来自用户名,而不是操作系统的随机来源吗?忘记密码是如何存储的,是否只存储为哈希?
    • 密码使用密钥库 + salt(用户名)加密。如果用户忘记了他的密码,他不会得到它,而是会收到一封电子邮件到他的收件箱,所以我们确保他是唯一的(他的身份)。在电子邮件中有一个加密链接,引导他进入“设置新密码”页面。你可以在demo中试试(demo的链接在上面)
    • 工作流程对我来说看起来不错,我想知道哈希是如何计算的,或者您不使用哈希将密码存储在此密钥库中吗?它应该是一种慢速适应性哈希算法,如 BCrypt 或 PBKDF2 以确保安全。那么理想情况下盐应该是真正随机的,而不是从其他参数推导出来的。当我提交忘记密码表单时,框架发送了一封带有令牌的电子邮件,该令牌很好,但该令牌不应该存储在数据库中,应该只存储它的哈希。
    • 实际上,Spring 完成了编码工作 - 他们使用 SHA256。在我的代码中,我使用相同的算法来适应。另外,要确保安全-该链接未存储在数据库中。发送给用户的链接使用非对称密钥加密。有意义吗?
    • -1 解释你做了什么而不是指出外部来源。
    【解决方案2】:

    几个重要的安全问题:

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

    如需了解更多背景信息,请查看Web Application Hackers Handbook。这是一本关于创建安全身份验证模型的优秀读物。

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

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

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

    【讨论】:

    • 您是否也无法确定注册时是否已使用电子邮件?
    • 是的,尽管可以使用相同的方法通知现有用户。对易用性的影响同样需要注意。
    【解决方案3】:

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

    当用户通过输入他的电子邮件地址请求新密码(重置)时,他还必须输入正确的出生日期(或其他内容),然后才能重置密码并将新密码通过电子邮件发送给用户。

    只有熟悉他的人才能通过重置他的密码来惹恼他!它不能是陌生人或机器人

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

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

    你们觉得呢?

    【讨论】:

      【解决方案4】:

      使用电子邮件验证/密码重置链接将为您提供更好的安全性。 如果您环顾四周,大多数网站都是这样做的,而且人们已经习惯了这种验证,所以我建议使用这种类型的身份验证。

      【讨论】:

        【解决方案5】:

        选项 1.不是一个好主意,因为通常他很容易被其他人猜到。 Sarah Palin 的个人电子邮件(我认为是雅虎)被第三方以这种方式入侵。

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

        【讨论】:

        • 你如何“轻松猜到”随机生成的长字符串?
        • 我的“选项 1”参考在其他帖子中不再清晰 - 它指的是 OP 提出的第一个选项。它提到了使用“秘密问题”的建议,如果回答正确,可以询问“你上哪所高中?”。抱歉,这变得不清楚。
        【解决方案6】:
        1. 我个人会发送一封电子邮件,其中包含一个短期页面链接,可让他们设置新密码。将页面名称设为某种 UID。
        2. 如果这对您没有吸引力,那么向他们发送新密码并强制他们在首次访问时更改密码也可以。

        选项 1 要容易得多。

        【讨论】:

        • 选项 1 还具有不易受到对用户的 DoS 攻击的优势。例如,有人不断点击选项 2 中的“重置密码”链接,因此用户实际上被锁定在他们的帐户之外。你可以防范它,但为什么要打扰呢?选项 1 是要走的路...
        • +1 表示罕见的合理、简单的安全建议。干得好。
        • 用户设置新密码后为什么不能登录?
        • 我支持这两个选项,因为第一个选项适用于网络应用程序,而第二个选项最适合移动应用程序。
        【解决方案7】:

        使用新密码发送电子邮件。

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

        这样可以确保只有想要密码的人才能进入该帐户。

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

        同时向用户发送密码更改确认。

        如果有人获得了新密码,然后收到一封电子邮件说“感谢更改密码”,他们会很困惑,如果他们没有这样做,他们会与管理员交谈。

        【讨论】:

        • IMO 坏主意。在真正的一方能够联系客户支持之前,嗅探器可能会造成很大的损害。
        猜你喜欢
        • 1970-01-01
        • 2017-07-06
        • 2013-12-22
        • 2015-11-04
        • 2013-12-09
        • 2011-10-19
        • 2011-09-28
        • 1970-01-01
        • 2012-11-30
        相关资源
        最近更新 更多