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 当成“防止密码被猜到”——它防的是密码已经泄露之后的事。把验证码发给任何人——真正的客服不会要。以及只在一个设备上绑定、丢了手机就永久失去账号:绑定多个验证器或保存恢复码,是最低成本的保险。