多因素认证(MFA)
MFA 要求两个或更多独立类别的认证因素共同证明身份,用于降低密码泄漏、credential stuffing 与单一凭证失守后的直接接管风险;安全性取决于因素独立性、抗钓鱼能力、限速、恢复流程与 session assurance,而不只是“多输一个验证码”。
[!info] related notes
- 所属 MOC: 安全 MOC
- Password 边界: Password 与 MFA 的安全边界
- 方法对比: MFA 方式的安全边界
- TOTP: TOTP
- WebAuthn / Passkey: WebAuthn, Passkey
- 在线攻击: Credential Stuffing / Spraying / Brute Force
- Throttling: Authentication Throttling & Account Lockout
- Recovery: MFA Recovery Codes, Account Recovery
- Trusted Device / Freshness: Trusted Device & Remember MFA, Authentication Assurance & Reauthentication Freshness
多因素认证(MFA)
一句话定义
MFA 的关键不是:
多做一次验证。
而是:
要求来自不同 factor category 的独立证明。
常见 factor:
- Knowledge:你知道什么,例如 password/PIN;
- Possession:你持有什么,例如 authenticator、security key;
- Inherence:你是谁,例如某些 biometric。
两个 Secret 不一定是 MFA
例如:
password + security question
都是 knowledge factor。
因此:
two steps ≠ two factors
同理,两个不同 password 通常也不构成真正的 MFA。
Password + TOTP
典型流程:
password valid → TOTP challenge → TOTP valid → issue session
它显著降低:
password leak credential stuffing password reuse
导致的直接 account takeover。
但 TOTP code 仍可被实时 phishing proxy 捕获和转发。
所以:
MFA ≠ phishing resistant
WebAuthn / Passkey
WebAuthn 的核心优势:
- public-key credential;
- origin binding;
- private key 不发送给 server;
- challenge-response;
- 可提供 phishing-resistant authentication。
Passkey 是 WebAuthn credential 的现代用户体验形态之一。
这与“另一个 6 位共享秘密验证码”是不同的安全模型。
MFA Method 不是同等级
不同方法的风险边界不同:
- SMS:依赖电信信道,受 SIM swap 等风险影响;
- TOTP:不依赖运营商,但 code 可被实时 phishing;
- Push:体验好,但可能出现 MFA fatigue;
- WebAuthn/security key:更强 phishing resistance。
详见 MFA 方式的安全边界。
Rate Limiting 仍然需要
MFA 不是无限尝试许可。
必须限制:
- password failures;
- TOTP guesses;
- push notification frequency;
- recovery-code guesses;
- MFA reset requests。
短 OTP 的搜索空间有限,没有 retry limit 会迅速降低实际安全强度。
Adaptive / Risk-Based MFA
可以在风险升高时触发额外认证:
- new device;
- unusual IP;
- impossible travel;
- credential-stuffing signal;
- unusual behavior;
- privileged operation。
这叫:
adaptive / risk-based authentication。
风险信号应该:
触发额外验证或限制,
而不是单独作为“你就是这个用户”的认证证据。
Step-Up Authentication
用户已经登录,不代表所有后续操作都具有足够 assurance。
例如:
ordinary read → current session enough
change password export vault create API key large payment disable MFA → require recent strong authentication
这叫 step-up authentication。
Session Assurance
MFA 成功后,应把结果投影成 session state,例如:
- authentication method;
- MFA verified;
- MFA verified_at;
- assurance level;
- device binding / risk context。
高风险动作可以要求:
MFA verified recently
而不是只判断:
这个账户历史上开启了 MFA。
Recovery 是核心边界
强 MFA 如果配一个极弱 recovery:
lost device → email support → remove MFA
那么 recovery 就是整个系统真实最弱认证路径。
必须设计:
- recovery codes;
- device recovery;
- identity verification;
- helpdesk controls;
- admin override;
- cooldown / notification;
- factor re-binding。
MFA Reset 需要 Step-Up
已登录用户修改:
- MFA factor;
- phone number;
- security key;
- recovery email;
- backup codes;
本身就是高风险操作。
通常应要求:
- recent authentication;
- existing factor proof;
- recovery controls;
- notification。
不能仅凭长期 session cookie 静默完成。
MFA 与 Passwordless
未来方向不一定是:
password → OTP → more OTP
可以直接使用:
Passkey / WebAuthn → public-key authentication
降低 shared-secret password 带来的:
- reuse;
- stuffing;
- phishing;
风险。
MFA 与 Password Policy
有 MFA 时,password 的 minimum length policy 可以与 single-factor 场景不同。
但 MFA 不会把一个弱、泄漏、复用 password 变成强 password。
常见误区
两步验证 = MFA
错误,必须看 factor category 是否独立。
MFA = TOTP
错误,TOTP 只是 MFA 的一种 authenticator。
开启 MFA 就不需要 rate limit
错误。
MFA 能天然防所有 phishing
错误,传统 OTP 可以被实时代理。
Recovery 只是客服 UX
错误,它是认证协议的一部分。
学习检查
- two-step 与 multi-factor 的根本差异是什么?
- 为什么 password + security question 通常不算 MFA?
- TOTP 为什么能防 credential stuffing,却不天然抗实时 phishing?
- WebAuthn 的 phishing resistance 来自哪些协议特征?
- MFA 为什么仍需要 retry/rate limiting?
- adaptive MFA 与 step-up authentication 有什么差异?
- 为什么 session 应记录 authentication assurance/freshness?
- recovery/reset 为什么可能成为 MFA 系统真正最弱路径?