「开了两步验证就安全了」是一个太粗的判断。四种常见方式的防护能力相差两个数量级——短信挡得住的攻击 Passkey 全挡得住,反过来完全不成立。
判断标准只有一个:面对具体的攻击手法,它还成不成立。
四种方式 × 四类攻击
| 撞库 / 弱密码 | SIM 卡劫持 | 实时钓鱼 | 设备木马 | |
|---|---|---|---|---|
| 短信验证码 | 挡得住 | 挡不住 | 挡不住 | 挡不住 |
| TOTP 验证器 | 挡得住 | 挡得住 | 挡不住 | 挡不住 |
| Passkey | 挡得住 | 挡得住 | 挡得住 | 大部分挡得住 |
| 硬件安全密钥 | 挡得住 | 挡得住 | 挡得住 | 挡得住 |
这张表里唯一重要的是实时钓鱼那一列——它正好是前两种方式的共同盲区,也是现在最主流的账号攻击手法。
短信:最弱,但不是没用
先说公道话:短信 2FA 挡住的攻击量,比后三种加起来还多。因为真实世界里绝大多数攻击是撞库——拿泄露的密码库批量试,成功率靠数量堆。这类攻击面前,任何 2FA 都足够。
它的问题在于面对有针对性的攻击时几乎不设防:
- SIM 卡补办 / 携号转网劫持——拿伪造证件去营业厅补卡,你的号就成了别人的。这类攻击成本不低,所以专门针对已知持有大额资产的目标
- 实时钓鱼——假登录页让你输密码,后台同步在真站点触发登录,你收到的是真短信,输进去就被中继走了
- 手机木马直接读短信;运营商内部人员
于是形成一个尴尬的结论:短信在你最需要它的场景下最弱。普通社交账号用它够了,邮箱、银行、交易所、域名注册商必须升级。
还有一条常被忽略:多种方式并存时,防线强度等于最弱的那条。你给账号配了硬件密钥,却留着短信作为备选,攻击者直接走短信那条路——加固就白做了。能关就关掉。
TOTP:去掉了运营商这个第三方
TOTP 相对短信是实打实的一档提升,核心是去掉了传输环节:
- 码在你手机本地算出来,不经短信网关、不经运营商 → SIM 卡劫持完全失效
- 离线可用,没信号照样出码
- 密钥在绑定那一刻固定,之后不再有任何交换
成本几乎为零,所以对绝大多数账号,TOTP 是性价比最优解。
但它对实时钓鱼同样无能为力,原因很根本:
TOTP 算出来的是一串和目标网站无关的数字。它不知道你正在登录的是真站还是假站——只要你肯输,它就会被转走。
30 秒的有效期也帮不上忙,攻击者的中继是自动化的,几秒就用掉了。
TOTP 的运维细节(换机迁移、密钥备份、参数排查)见手机丢了 / 换新机 2FA 怎么迁移和otpauth URI 逐参数详解。
Passkey / FIDO2:把域名写进了协议
这是四种方式里唯一的质变。机制是这样的:
- 注册时设备生成一对公私钥,私钥永不离开设备,公钥交给网站
- 登录时,浏览器把当前页面的实际域名交给认证器
- 认证器用私钥对「服务端挑战值 + 域名」一起签名
- 服务端验签时核对域名
于是钓鱼在协议层被掐死:
- 你在
github-login.com这个假站上,浏览器传给认证器的域名就是github-login.com - 认证器要么找不到该域名对应的凭据(直接没反应),要么签出的是绑定假域名的签名
- 攻击者把签名转发给真的
github.com,验签必然失败
关键在于:这不依赖用户「看清网址」。浏览器和认证器在协议层强制校验,用户想上当都上不了——这和「教育用户识别钓鱼」是完全不同量级的解法。
附带的好处同样重要:没有可复制的秘密。网站被拖库,攻击者拿到的只是公钥,什么也做不了;不像密码和 TOTP 密钥,泄露即失守。
Passkey 和硬件密钥怎么选
两者协议同源(FIDO2 / WebAuthn),差别在私钥存哪、能不能同步:
| Passkey(平台凭据) | 硬件安全密钥 | |
|---|---|---|
| 私钥位置 | 手机 / 电脑的安全芯片 | 独立 USB / NFC 设备 |
| 能否同步 | 能,跟随 iCloud 钥匙串 / Google 密码管理器 | 不能,物理上不可导出 |
| 换设备 | 自动跟随 | 插上就用,与设备无关 |
| 丢失后果 | 丢一台不至于全丢 | 丢了就真没了 |
| 安全边界 | 扩大到你的云账号 | 就是那枚芯片 |
| 成本 | 零 | 每把约一两百元 |
选择建议:
- 普通人用 Passkey——安全和体验的平衡点最好,换机不痛
- 持有大额加密资产、或负责企业关键系统的用硬件密钥,并且买两把,同一账号注册两把,一把随身一把放家里
- 两者可以并存,同一账号同时注册,互为备份
用 Passkey 时要意识到:安全边界从一枚芯片扩大到了你的云账号,所以那个云账号本身必须用最强的方式保护——这正好引出下一节。
按「连带损失」分三档配置
不要按账号重要性的主观感觉配,按这个账号丢了能连带丢掉什么分档:
第一档:根账号——主邮箱、域名注册商、密码管理器、Apple ID / Google 账号。
这些是别的账号的找回入口,丢了等于全丢。配置:Passkey 或硬件密钥 + 关掉短信找回 + 恢复码离线存放。
第二档:资产账号——银行、券商、交易所、支付。
配置:至少 TOTP,优先硬件密钥;单独绑一个不对外公开的手机号;开启提现白名单和延时到账。
第三档:其余——社交、购物、各类网站。
配置:有什么用什么,TOTP 或 Passkey 优先,短信也比不开强。
最关键的一条,很多人配完 2FA 仍然翻车就栽在这里:
检查每个账号的「找回路径」。 2FA 配得再硬,只要还留着「短信重置密码」,攻击者根本不碰你的 2FA,直接走找回流程。
恢复码:最后一道,也最容易被跳过
恢复码是你所有 2FA 设备失效时唯一的官方通道。没有它,只能走人工申诉,周期 3-15 个工作日且未必成功。
存放原则:
- 打印或手抄,放保险柜 / 老家——离线不怕黑客,异地不怕火灾
- 存进密码管理器可以,但不能是唯一一份
- 绝不存在会自动同步的截图目录、聊天收藏、邮箱草稿里
两条实务经验:
- 多数服务的恢复码一次性,用到只剩两三个时主动重新生成(重新生成会让旧码全部失效,记得替换旧的那份)
- 把「这是哪个账号的」和码写在一起——很多人存了一堆码,事到临头认不出是哪个站的,等于没存
绑定页面上的恢复码通常只出现一次。当场存下再离开,这一步跳过,等于给自己埋了一颗定时炸弹。