Skip to content

密码、验证码与账号恢复 ​

密码登录的核心是验证用户输入与已保存凭据是否匹配。工程难点在于限制在线猜测、抵御数据库泄露后的离线破解,并让密码重置具备清晰的账号接管边界。

密码策略与存储 ​

NIST SP 800-63B-4 §3.1.1对其适用系统规定:单因素密码至少 15 个字符;仅用于多因素流程时可放宽到至少 8 个字符;支持的最大长度应至少达到 64 个字符。不要求混合字符类别,也不要求在没有泄露证据时周期性改密。普通业务可以参考这些原则,但不能仅满足几项长度规则就宣称达到某个认证保证等级。

实际产品还要支持密码管理器、粘贴与泄露密码拦截。密码不要自动去首尾空格,也不要静默截断;若采用 Unicode 规范化,注册、改密和验证必须使用同一约定。

密码使用专门的慢哈希算法。OWASP Password Storage优先建议 Argon2id,其中一组最低配置为内存 19 MiB、迭代 2、并行度 1。这是基线配置,不是所有部署的最终参数:需要在目标硬件、容器限制和并发量下测量验证耗时与内存。

  • 每个密码使用独立随机 salt,交给成熟库生成并编码到哈希记录中。
  • 保存算法与成本参数,用户成功登录时可渐进升级旧哈希。
  • SHA-256、MD5 等快速摘要不适合直接保存人类密码。
  • 旧 bcrypt 系统要特别检查库的 72 字节边界;不要把字节限制误当成字符限制。
  • 可选 pepper 与数据库分开保管,但轮换与故障处理更复杂,不能代替慢哈希。

密码校验的内存需求大致随“单次成本 × 并行验证数”增长。例如每次约 19 MiB、100 次并行,仅算法配置对应的内存就约 1.9 GiB,还未计入进程开销。认证服务应在进入昂贵计算前做输入长度与流量限制,并控制验证并发。

登录失败与账号枚举 ​

同一个公开错误可以覆盖“账号不存在”“密码错误”和“不可用于此登录方式”,内部记录分别保留原因。还需比较状态码、响应长度、耗时与恢复接口行为,不能只把文案统一。

不存在的账号可以走预先生成的哑元哈希验证,减少明显的时间分支;这只缩小差异,不能保证整条链路恒定时间。限流必须先于昂贵哈希,避免攻击者借不存在的账号消耗计算资源。

建议组合多个限流维度:

维度能限制什么单独使用的缺点
IP、网络段单来源高频尝试共享出口误伤、代理轮换
规范化账号标识分布式撞同一个账号攻击者可能恶意锁定受害者
设备与风险信号自动化与异常行为可伪造、涉及隐私与误判
全局资源预算大规模流量耗尽验证服务不能识别具体账号风险

采用渐进退避、短期限制和强认证提升,通常比无限期锁号更容易恢复。错误密码次数清零、跨节点计数、时钟与缓存故障都要定义行为。OWASP Authentication讨论了登录限流与锁定策略。

验证码要有用途和事务边界 ​

短信码、邮箱码和邮件链接都是短期凭据,需要绑定用途:注册码不能用来重置密码,登录码不能用来换绑其他账号。

建议记录 challenge_id、用途、目标标识或账号、过期时间、剩余尝试次数、消费时间与安全版本。重新发送时应规定旧码是否失效,不能让用户可用的码数无上限增长。

低熵数字码不能只用普通 SHA-256 摘要保护:数据库泄露后,攻击者可枚举全部短码。可以使用独立服务密钥参与 HMAC,并配合严格的过期、尝试次数和密钥隔离。高熵随机链接令牌可以只存摘要。TOTP 的共享种子则需要解密后参与验证,见 MFA 设计。

验证成功与消费需要原子完成。两个并发请求不能都读到“未使用”,再各自建立一个授权结果。可使用条件更新、行锁或等价的存储原子操作;重发接口同样需要频率与费用预算。

密码重置事务 ​

OWASP Forgot Password建议恢复令牌随机、短期有效、单次使用,并避免接口泄露账号存在性。恢复链接使用受信任的固定站点地址生成,不直接使用请求中未经验证的 Host。

下面聚焦用户取得恢复链接后的提交过程。图中“检查并消费”属于同一数据库事务,失败时不产生部分改密结果。

挑战校验覆盖用途、有效期、消费状态与尝试限制,账号校验覆盖恢复资格及安全版本;版本增加后,该账号其他旧恢复请求也应失效。outbox 的投递发生在提交之后。

慢哈希可在事务前计算以缩短持锁时间,但事务内仍要重新检查所有决定有效性的条件。会话如果存于外部缓存,不能假设数据库提交与缓存删除具备原子性;通过安全版本检查、可靠事件和受限缓存时限补足,见参考设计。

恢复完成后要求用户重新登录;可发送安全通知,但不把新密码或恢复令牌写进通知日志。恢复页面不加载非必要第三方资源,配置适当的 Referrer 策略,并避免分析系统记录带令牌的 URL。

密码修改、短信登录与客服恢复 ​

已登录的密码修改应要求近期认证或等价证明,并区分“只退出其他设备”和“全部重新登录”。无论产品如何选择,都要更新安全状态并明确告知用户。

短信登录只依赖号码控制权,不能直接等价为高强度 MFA;存在换卡、转移、转发和号码回收风险。用于重要资产时,应提供更强认证方式并审查恢复规则。

客服恢复是高权限入口。应有独立审核、操作留痕、必要的延迟与异动通知;不能仅凭能搜索到的生日、订单截图或安全问题答案,直接移除原有 MFA。

参考资料 ​