MFA Recovery Codes
MFA Recovery Codes 是用户预先保存的一组高熵、单次使用 backup authenticator,用于主 MFA factor 丢失时恢复访问;服务端应只保存 digest、原子消费、支持重新生成并使旧集合失效,且恢复强度不能退化成仅凭 password 绕过 MFA。
[!info] related notes
- 所属 MOC: 安全 MOC
- MFA: 多因素认证(MFA)
- Password/MFA Boundary: Password 与 MFA 的安全边界
- Account Recovery: Password Reset & Account Recovery
- Session Revocation: Credential Change & Session Revocation
MFA Recovery Codes
一句话定义
Recovery Code 是用户预先获得并离线保存的 backup authenticator。
典型用途:
primary MFA factor unavailable → present one recovery code → regain restricted access → bind new factor
它不是“知道 password 就能关闭 MFA”的替代品。
Security Role
Recovery Codes 的价值在于:
- 不依赖丢失的手机/认证器;
- 可离线保存;
- 每个 code 单次使用;
- 用户可以准备多个备用 code。
NIST 将类似机制归入 look-up secret authenticator 的思路。
生成
Code 应由 CSPRNG 生成,并满足:
- 足够 entropy;
- human-readable but not guessable;
- 多个 code 独立;
- 不从 user/account data 派生。
不要使用 birthday、phone suffix、sequential number 或可预测 ID。
服务端存储
推荐:
raw recovery code → show once to user
H(raw code) → store digest
服务端保存:
- account_id;
- code_digest;
- created_at;
- used_at;
- recovery_set_version。
不要长期保存 plaintext recovery codes。
Single Use
验证成功后必须原子地从 unused 变成 consumed。
并发两个请求不能重复使用同一 code。
Regeneration
用户重新生成 recovery codes 时:
new set generated → invalidate all old unused codes → increment recovery_set_version
否则旧截图/旧备份中的 code 仍可能长期有效。
用户保存
UI 应提示用户:
- download / print;
- password manager;
- offline safe storage;
- 不要把唯一副本只存在可能丢失的设备里。
Recovery Code 是高价值 credential。
Recovery Code 与 Reset Token
Recovery Code:
- 预先发放;
- 用户长期保存;
- backup authenticator;
- 通常用于 MFA recovery。
Password Reset Token:
- 用户发起后临时签发;
- 通过 side-channel 发送;
- 短期有效。
两者 lifecycle 不同。
使用后的状态转换
更稳的流程:
recovery code valid → restricted recovery state → 证明 retained factor when appropriate → bind new MFA authenticator → rotate recovery codes → notify user → revoke suspicious sessions if needed
不建议:
recovery code valid → permanently disable MFA → full privileged session
Password-only MFA Reset
如果账户平时要求:
password + MFA
但丢 MFA 后只要:
password → reset MFA
那么 MFA 几乎退化成 UX friction。
Recovery 必须维持足够独立的 assurance。
Rate Limiting
Recovery code verification 仍应:
- per-account throttling;
- retry limit;
- monitoring;
- alert on repeated failures。
高熵不能替代 online attempt control。
Notification
使用 recovery code / 重置 MFA 后应通知用户:
- factor changed;
- recovery code used;
- time/device;
- security action if unexpected。
学习检查
- Recovery Code 为什么属于 backup authenticator,而不是普通 reset link?
- 服务端为什么应保存 code digest?
- single-use 为什么需要原子消费?
- regeneration 为什么应使旧 code set 全部失效?
- 为什么只凭 password 就允许 MFA reset 会削弱 MFA?
- Recovery Code 使用后为什么适合进入 restricted recovery state?
- Recovery Code 与 Password Reset Token 的生命周期差异是什么?