恢复机制与安全实现

最容易被忽略的设计

MFA 越严格,一个现实问题越突出:用户丢了手机或验证器怎么办?

如果恢复流程很弱,攻击者就会专挑恢复入口打——因为这里往往是「安全后门」。所以设计原则是:恢复流程不能比 MFA 本身更弱。

恢复方式

方式强度说明
备用恢复码中开启 MFA 时发放一批一次性恢复码,用户妥善保存
已登录设备确认中用另一台已可信设备确认「确实是本人」
邮箱 / 手机二次验证中结合风控,验证绑定联系方式
人工审核强提交材料,人工审核,适用于高风险场景

恢复码的细节

如果采用备用恢复码:

  • 一次性使用,用完即作废(或用掉大部分后提示重新生成)。
  • 只显示一次,之后只能重新生成。
  • 加密 / 哈希存储,数据库泄露也不能直接使用。

安全实现要点

MFA 验证本身要经得起攻击:

  • 验证码短期有效,限制重试次数(防爆破)。
  • TOTP 允许少量时间偏移(如 ±1 步),但不能过宽。
  • 备用码只能用一次,并加密存储。
  • 验证通过后给会话提升信任等级,但设置有效期,不是永久免验。

与会话联动

完成 MFA 后,系统记录:

session.assurance_level = high
mfa_verified_at = now

接下来一段时间内,用户执行敏感操作不必重复验证。超过有效期或风险变化后,再要求重新验证。这是「验证强度跟随风险」的落地:把摩擦放在最需要的地方。

人工审核

极端情况(什么都丢了)走人工审核:

  • 记录用户提交的材料。
  • 记录审核人、审核结论、处理结果。
  • 全程可审计——人工通道本身也是攻击入口。

上线检查清单

  • MFA 因子是否至少组合两类?
  • 是否提供多种因子供用户选择?
  • 触发是否基于风险,而不是一刀切?
  • 恢复流程是否不比 MFA 弱?
  • 备用码是否一次性、加密存储?
  • 通过 MFA 后是否给会话标记信任等级并设置有效期?

到这里,MFA 这块拼图也齐了。下一章我们把账号密码、Token、会话、SSO、OAuth、MFA 全部合并成一套完整的生产级身份认证架构。

发现内容有问题?

告诉我们哪里需要改进。