短信、TOTP、Passkey、硬件密钥:4 种二次验证到底防的是什么

· 约 5 分钟 🔐 TOTP 验证码

「开了两步验证就安全了」是一个太粗的判断。四种常见方式的防护能力相差两个数量级——短信挡得住的攻击 Passkey 全挡得住,反过来完全不成立。

判断标准只有一个:面对具体的攻击手法,它还成不成立

四种方式 × 四类攻击

撞库 / 弱密码SIM 卡劫持实时钓鱼设备木马
短信验证码挡得住挡不住挡不住挡不住
TOTP 验证器挡得住挡得住挡不住挡不住
Passkey挡得住挡得住挡得住大部分挡得住
硬件安全密钥挡得住挡得住挡得住挡得住

这张表里唯一重要的是实时钓鱼那一列——它正好是前两种方式的共同盲区,也是现在最主流的账号攻击手法。

短信:最弱,但不是没用

先说公道话:短信 2FA 挡住的攻击量,比后三种加起来还多。因为真实世界里绝大多数攻击是撞库——拿泄露的密码库批量试,成功率靠数量堆。这类攻击面前,任何 2FA 都足够。

它的问题在于面对有针对性的攻击时几乎不设防:

  • SIM 卡补办 / 携号转网劫持——拿伪造证件去营业厅补卡,你的号就成了别人的。这类攻击成本不低,所以专门针对已知持有大额资产的目标
  • 实时钓鱼——假登录页让你输密码,后台同步在真站点触发登录,你收到的是真短信,输进去就被中继走了
  • 手机木马直接读短信;运营商内部人员

于是形成一个尴尬的结论:短信在你最需要它的场景下最弱。普通社交账号用它够了,邮箱、银行、交易所、域名注册商必须升级。

还有一条常被忽略:多种方式并存时,防线强度等于最弱的那条。你给账号配了硬件密钥,却留着短信作为备选,攻击者直接走短信那条路——加固就白做了。能关就关掉。

TOTP:去掉了运营商这个第三方

TOTP 相对短信是实打实的一档提升,核心是去掉了传输环节

  • 码在你手机本地算出来,不经短信网关、不经运营商 → SIM 卡劫持完全失效
  • 离线可用,没信号照样出码
  • 密钥在绑定那一刻固定,之后不再有任何交换

成本几乎为零,所以对绝大多数账号,TOTP 是性价比最优解

但它对实时钓鱼同样无能为力,原因很根本:

TOTP 算出来的是一串和目标网站无关的数字。它不知道你正在登录的是真站还是假站——只要你肯输,它就会被转走。

30 秒的有效期也帮不上忙,攻击者的中继是自动化的,几秒就用掉了。

TOTP 的运维细节(换机迁移、密钥备份、参数排查)见手机丢了 / 换新机 2FA 怎么迁移otpauth URI 逐参数详解

Passkey / FIDO2:把域名写进了协议

这是四种方式里唯一的质变。机制是这样的:

  1. 注册时设备生成一对公私钥,私钥永不离开设备,公钥交给网站
  2. 登录时,浏览器把当前页面的实际域名交给认证器
  3. 认证器用私钥对「服务端挑战值 + 域名」一起签名
  4. 服务端验签时核对域名

于是钓鱼在协议层被掐死:

  • 你在 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 个工作日且未必成功。

存放原则:

  • 打印或手抄,放保险柜 / 老家——离线不怕黑客,异地不怕火灾
  • 存进密码管理器可以,但不能是唯一一份
  • 绝不存在会自动同步的截图目录、聊天收藏、邮箱草稿里

两条实务经验:

  • 多数服务的恢复码一次性,用到只剩两三个时主动重新生成(重新生成会让旧码全部失效,记得替换旧的那份)
  • 把「这是哪个账号的」和码写在一起——很多人存了一堆码,事到临头认不出是哪个站的,等于没存

绑定页面上的恢复码通常只出现一次。当场存下再离开,这一步跳过,等于给自己埋了一颗定时炸弹。

❓ 常见问题

短信验证码到底还能不能用?

能用,但只应该作为「没有更好选项时的最低档」,且绝不用于高价值账号它挡得住什么:(1) 撞库——攻击者拿着泄露的密码批量试,没有你的手机就进不去,这是短信 2FA 的主要价值,且这类攻击占实际攻击量的绝大多数;(2) 弱密码被猜中。它挡不住什么:(1) SIM 卡补办 / 携号转网劫持——攻击者拿伪造证件去营业厅补卡,你的号就成了他的,这类攻击专门针对已知持有大额资产的目标;(2) 实时钓鱼——假登录页让你输密码和短信码,后台同步转发给真站点,你收到的是真短信,输进去就被中继了;(3) 手机木马直接读取短信;(4) 运营商内部人员或社工。结论:(1) 对普通社交账号,短信 2FA 已经能挡掉绝大多数真实攻击;(2) 对邮箱、银行、交易所、域名注册商,必须升级——这几类账号的攻击者是有针对性的,正好是短信最弱的场景;(3) 能同时开多种时,把短信关掉或降为最后备选,否则它会成为整条防线里最弱的一环。

TOTP 比短信强在哪?强多少?

强在去掉了运营商这个第三方,但对实时钓鱼同样无能为力优势:(1) 没有传输环节——码在你手机本地算出来,不经过短信网关、不经过运营商,SIM 卡劫持完全失效;(2) 离线可用,没信号也能出码;(3) 没有短信费用和到达延迟;(4) 密钥在绑定那一刻就固定,之后不再有任何交换。仍然挡不住:(1) 实时钓鱼中继——假页面骗你输入 6 位码,攻击者在 30 秒窗口内拿去真站点用掉,这是 TOTP 的根本短板;(2) 恶意软件截屏或读取验证器数据库;(3) 你被诱导念出验证码的社工电话。根本原因:TOTP 的码是一串和目标网站无关的数字——它不知道你正在登录的是真站还是假站,所以只要你肯输,它就会被转走。定位:TOTP 相对短信是实打实的一档提升,且成本极低,是绝大多数账号的性价比最优解;但它不是钓鱼的解药。

为什么说只有 Passkey / 硬件密钥能挡钓鱼?

因为它把「你正在访问的域名」写进了协议,签名和域名绑死机制:(1) 注册时设备生成一对公私钥,私钥永不离开设备,公钥交给网站;(2) 登录时浏览器把当前页面的实际域名交给认证器,认证器用私钥对「挑战值 + 域名」一起签名;(3) 服务端验签时会核对域名。因此:(1) 你在 github-login.com 这个假站上,浏览器传给认证器的域名就是 github-login.com;(2) 认证器要么找不到该域名对应的凭据(直接没反应),要么签出来的是绑定假域名的签名;(3) 攻击者把这个签名转发给真的 github.com,验签必然失败关键点:这不是靠用户「看清网址」,而是浏览器和认证器在协议层强制校验,用户想上当都上不了额外好处:(1) 没有可复制的秘密——私钥不出安全芯片,网站被拖库也拿不到任何能用的东西;(2) 免输入,指纹或 PIN 一下就完成。这是四种方式里唯一的质变。

Passkey 和硬件安全密钥是一回事吗?

底层协议同源(FIDO2 / WebAuthn),差别在私钥存在哪、能不能同步硬件安全密钥(YubiKey、Google Titan 等):(1) 私钥锁在一枚独立 USB / NFC 设备的安全芯片里,物理上不可导出;(2) 换手机换电脑都不影响,插上就能用;(3) 缺点是丢了就真没了——所以规范做法是买两把,一把随身一把放家里,同一个账号注册两把;(4) 成本每把约一两百元。Passkey(平台凭据):(1) 私钥存在手机 / 电脑的安全芯片里,通过 iCloud 钥匙串、Google 密码管理器等跨设备同步;(2) 换机自动跟随,丢一台不至于全丢;(3) 代价是安全边界从「一枚芯片」扩大到「你的云账号」——云账号本身必须用最强的方式保护;(4) 零成本。怎么选:(1) 普通人用 Passkey,体验和安全的平衡点最好;(2) 持有大额加密资产、或负责企业关键系统的,用硬件密钥,并且备一把;(3) 两者可以并存,同一账号同时注册 Passkey 和硬件密钥,互为备份。

我该怎么给自己的账号分层配置?

按「这个账号丢了,能连带丢掉什么」分三档,而不是按账号重要性的主观感觉第一档:根账号——主邮箱、域名注册商、密码管理器、手机厂商账号(Apple ID / Google 账号)。这些是别的账号的找回入口,丢了等于全丢。配置:Passkey 或硬件密钥 + 关掉短信找回(否则短信成了绕过一切的后门)+ 恢复码离线存放。第二档:资产账号——银行、券商、交易所、支付。配置:至少 TOTP,优先硬件密钥;单独绑一个不对外公开的手机号;开启提现白名单和延时。第三档:其余——社交、购物、各种网站。配置:TOTP 或 Passkey,有什么用什么,短信也比没有强。最关键的一条:(1) 检查每个账号的「找回路径」——很多人 2FA 配得很硬,却留着「短信重置密码」的后门,攻击者根本不去碰你的 2FA,直接走找回流程;(2) 防线的强度等于最弱的那条入口,不是你配得最强的那条。

开了 2FA 之后,恢复码要怎么保管?

当成和密钥同等重要的东西,离线、异地、且开启当天就存为什么重要:恢复码是你 2FA 设备全部失效时唯一的官方通道,没有它就只能走人工申诉,周期 3-15 个工作日且未必成功。存法:(1) 打印或手抄,放保险柜 / 老家——离线介质不怕黑客,异地不怕火灾入室;(2) 存进密码管理器可以,但不能是唯一一份——密码库本身也可能丢;(3) 绝不存在会自动同步到云的截图目录、聊天记录收藏、邮箱草稿里使用注意:(1) 多数服务的恢复码是一次性的,用掉一个就少一个,用到只剩两三个时主动重新生成;(2) 重新生成会让旧码全部失效,记得替换掉旧的那份;(3) 换 2FA 方式(比如从 TOTP 换成 Passkey)之后,去确认恢复码是否需要重新生成。一条实务经验:把恢复码和「这是哪个账号的」写在一起——很多人存了一堆码,事到临头认不出是哪个站的,等于没存。

🔐 打开 TOTP 验证码 2FA 动态口令 · 多账号保存 · 兼容 Google Authenticator · 倒计时 · otpauth 二维码 · 本地计算不上传

📖 同一工具的其他教程

🔗 相关阅读

全部教程 →