跳到内容

忘记密码备忘录

简介

为了实现一个适当的用户管理系统,系统集成了忘记密码服务,允许用户请求密码重置。

尽管此功能看起来简单且易于实现,但它却是漏洞的常见来源,例如著名的用户枚举攻击

以下简短指南可作为保护忘记密码服务的快速参考

  • 对存在和不存在的账户返回一致的消息。
  • 确保用户响应消息所需的时间是统一的。
  • 使用旁路通道来传达重置密码的方法。
  • 使用URL 令牌以实现最简单、最快速的部署。
  • 确保生成的令牌或代码是
    • 使用密码学安全算法随机生成。
    • 足够长以防御暴力破解攻击。
    • 安全存储。
    • 一次性使用并在适当时间后失效。
  • 在提供有效令牌之前,不要对账户进行任何更改,例如锁定账户

本备忘录侧重于重置用户密码。有关重置多因素身份验证(MFA)的指南,请参阅多因素身份验证备忘录中的相关部分。

忘记密码服务

密码重置过程可分为两个主要步骤,详情见以下部分。

忘记密码请求

当用户使用忘记密码服务并输入其用户名或电子邮件时,应遵循以下步骤来实现安全过程:

  • 对存在和不存在的账户返回一致的消息。
  • 确保响应在一致的时间内返回,以防止攻击者枚举哪些账户存在。这可以通过使用异步调用或确保遵循相同的逻辑而非使用快速退出方法来实现。
  • 实施针对过度自动化提交的保护措施,例如基于账户的速率限制、要求验证码(CAPTCHA)或其他控制。否则,攻击者可能针对给定账户每小时发出数千次密码重置请求,用无用的请求淹没用户的接收系统(例如,电子邮件收件箱或短信)。
  • 采用常规安全措施,例如SQL 注入防护方法输入验证

用户重置密码

一旦用户通过提供令牌(通过电子邮件发送)或代码(通过短信或其他机制发送)证明了其身份,他们就应该将密码重置为新的安全密码。为了确保此步骤的安全,应采取的措施有:

  • 用户应通过两次输入来确认其设置的密码。
  • 确保已实施安全的密码策略,并与应用程序的其余部分保持一致。
  • 遵循安全实践更新和存储密码。
  • 向用户发送电子邮件,告知其密码已重置(请勿在电子邮件中发送密码!)。
  • 一旦用户设置了新密码,他们应通过常规机制登录。不要自动登录用户,因为这会增加身份验证和会话处理代码的复杂性,并增加引入漏洞的可能性。
  • 询问用户是否要使所有现有会话失效,或自动使会话失效。

方法

为了允许用户请求密码重置,您需要某种方式来识别用户,或通过旁路通道联系他们。

这可以通过以下任何方法完成:

这些方法可以结合使用,以提供更大程度的保障,确保用户是其所声称的身份。无论如何,您必须确保用户始终有一种方法可以恢复其账户,即使这涉及联系支持团队并向工作人员证明其身份。

一般安全实践

对重置标识符(令牌、代码、PIN 码等)采用良好的安全实践至关重要。有些要点不适用于离线方法,例如生命周期限制。所有令牌和代码都应:

URL 令牌

URL 令牌在 URL 的查询字符串中传递,通常通过电子邮件发送给用户。该过程的基本概述如下:

  1. 为用户生成一个令牌并将其附加到 URL 查询字符串中。
  2. 通过电子邮件将此令牌发送给用户。- 在创建重置 URL 时,不要依赖 Host 头,以避免主机头注入攻击。URL 应硬编码或根据受信任域列表进行验证。- 确保 URL 使用 HTTPS。
  3. 用户收到电子邮件并浏览带有附加令牌的 URL。- 确保重置密码页面添加带有 noreferrer 值的 Referrer Policy 标签,以避免引用者泄漏。- 实施适当的保护措施,例如速率限制,以防止用户在 URL 中暴力破解令牌。
  4. 如果需要,执行任何额外的验证步骤,例如要求用户回答安全问题
  5. 让用户创建并确认新密码。确保应用与应用程序其他部分相同的密码策略。

注意:URL 令牌可以通过从令牌创建受限会话来遵循与PIN 码相同的行为。决策应根据开发人员的需求和专业知识做出。

PIN 码

PIN 码是通过短信等旁路通道发送给用户的数字(6 到 12 位)。

  1. 生成一个 PIN 码。
  2. 通过短信或其他机制将其发送给用户。- 用空格分隔 PIN 码可以方便用户阅读和输入。
  3. 用户随后在密码重置页面输入 PIN 码及其用户名。
  4. 从该 PIN 码创建一个受限会话,仅允许用户重置其密码。
  5. 让用户创建并确认新密码。确保应用与应用程序其他部分相同的密码策略。

离线方法

离线方法与其他方法的区别在于,它允许用户在不向后端请求特殊标识符(例如令牌或 PIN 码)的情况下重置密码。但是,后端仍需进行身份验证以确保请求合法。离线方法在注册时或用户希望配置时提供特定的标识符。

这些标识符应离线安全存储(例如密码管理器),并且后端应正确遵循一般安全实践。一些实现基于硬件 OTP 令牌证书或任何其他可在企业内部使用的实现。这些不在本备忘录的范围之内。

如果账户启用了 MFA,并且您正在寻找 MFA 恢复,可以在相应的多因素身份验证备忘录中找到不同的方法。

安全问题

安全问题不应作为重置密码的唯一机制,因为它们的答案通常容易被攻击者猜测或获取。但是,当与本备忘录中讨论的其他方法结合使用时,它们可以提供额外的安全层。如果使用安全问题,请确保选择安全的问题,如安全问题备忘录中所述。

账户锁定

账户不应因忘记密码攻击而被锁定,因为这可能被用来拒绝已知用户名的用户访问。有关账户锁定的更多详细信息,请参阅身份验证备忘录