2FA 是什么,以及为什么它不是“多输一次密码”
两步验证(Two-Factor Authentication,2FA)是在密码之外再加一个独立凭据。它的价值不在于更麻烦,而在于让“密码泄露”不再等于“账号被接管”。下面这个页面里,验证码由你的浏览器本地算出,不经过任何服务器。
1. 定义
2FA 要求登录时同时提供两类不同性质的凭据,通常归纳为:你知道的(密码、PIN)、你拥有的(手机、硬件密钥、验证器 App)、你是什么(指纹、面容)。任意两类组合即构成 2FA。只叠加两个“你知道的”(比如密码 + 安全问题)不算,因为两者会一起泄露。
2. 有什么用
现实中的账号失守主要来自撞库、钓鱼和数据泄露,这三类都直接拿到密码。启用 2FA 之后,攻击者即使拿到密码,也缺第二把钥匙。它的收益是具体的:把一次凭据泄露从“账号丢失”降级为“一次失败的登录尝试”。
反过来,2FA 也有它挡不住的东西:会话 Cookie 被盗(浏览器已被控制)、实时中间人钓鱼(你能把验证码交给假站)、以及你自己点下的“同意”授权。它不是万能盾,是降低单点失守的损失。
3. 原理:TOTP 为什么能离线算出同一个码
最常见的形式是 TOTP(基于时间的一次性密码,RFC 6238)。服务器与你的验证器 App 在绑定阶段共享一个密钥,之后双方各自用“当前时间片”做一次 HMAC 计算,得到同一个 6 位数字。没有网络交互,所以断网也能用。
code = H(HMAC-SHA1(secret, floor(unix_time / 30))) % 10^6
三个细节决定了它的安全性:时间片通常是 30 秒;服务器一般接受前后各一个时间片的偏差(时钟漂移);同一个时间片内的验证码只能用一次,否则重放就成立了。密钥只在绑定那一刻通过二维码传输,之后永远不离开设备。
下面的验证码在本地算出,可以直接拿去和任意 TOTP 验证器比对。
4. 选哪种第二因素
| 方式 | 抗钓鱼 | 便利性 | 适用 |
|---|---|---|---|
| TOTP(验证器 App) | 一般 | 高,离线可用 | 绝大多数账号的默认选择 |
| 短信验证码 | 差(可被 SIM 劫持) | 最高 | 只作为兜底,不要作为唯一手段 |
| 硬件密钥(WebAuthn) | 强(绑定域名) | 中,需随身携带 | 邮箱、云账号、代码仓库 |
| 推送确认 | 中(防 MFA 疲劳需谨慎) | 高 | 企业内部账号 |
实践建议:主账号优先硬件密钥,日常账号用 TOTP,短信只留作恢复手段,并把恢复码打印或存进密码管理器。
5. 常见误区
把 2FA 当成“防止密码被猜到”——它防的是密码已经泄露之后的事。把验证码发给任何人——真正的客服不会要。以及只在一个设备上绑定、丢了手机就永久失去账号:绑定多个验证器或保存恢复码,是最低成本的保险。