2FA 不是越多越好
我前两年遇到过一个朋友,他被盗了交易所账户。事后复盘的时候我问他有没有开 2FA,他说"开了,短信验证"。那一刻我心里咯噔一下 —— 因为他被盗的方式我已经能猜个八九不离十。
很多人以为 2FA 是一个开关:开了就是安全的,没开就是不安全的。这个模型太粗了。更准确的说法是:2FA 有四档,档与档之间差距很大,错档位的 2FA 给你的是一种"我已经保护好了"的错觉,而错觉本身就是被钻空子的入口。
这篇文章把四种主流的 2FA 摆在一起看:短信、TOTP、硬件密钥、Passkey。我会写清楚每一种的工作原理、真实的攻击向量、以及我在 2025 年 12 月自己做的一次对照演练 —— 同样的钓鱼站,TOTP 被中继成功了,硬件密钥失败了。
读完之后你大概会明白一件事:交易所账户保护,跟你的资产规模有关;但 2FA 选哪一档,跟你的资产规模无关 —— 短信 2FA 的风险,是不管你账户里有 500 还是 50 万都一样存在的。
2FA 的四种主流方式
先把概念铺平。2FA 的全称是 Two-Factor Authentication,"双因素认证"。"因素"指的是"你拥有什么 / 你知道什么 / 你是什么"这三类。密码是"你知道什么",2FA 一般指在密码之外再加一个"你拥有什么"。
主流的"你拥有什么"分四档:
第一档 · 短信验证码(SMS OTP)
登录的时候交易所给你手机发一条 6 位数验证码,你在网页里输进去。简单到不需要任何额外软件,所以是最普及的一档。也是最不安全的一档。
第二档 · TOTP(基于时间的一次性密码)
代表产品是 Google Authenticator、Authy、1Password 内置的 OTP 模块、阿里安全等。绑定的时候你扫一个二维码,二维码里是一段"种子"。之后这个应用每 30 秒根据种子和当前时间算出一个 6 位数。登录的时候输这个数。
跟短信比,TOTP 的好处是:种子保存在你的设备里,不会经过运营商,不会被 SIM 卡盗用攻击破坏。但 TOTP 仍然是一个"6 位数验证码",而 6 位数验证码本身存在一种致命的弱点,下文会展开。
第三档 · 硬件密钥(YubiKey / Solo Key / Token2)
代表产品是 Yubico 的 YubiKey 5 系列。这是一个 USB-A / USB-C / NFC 接口的物理小棒,长得像一片金属拨片。登录的时候把它插进电脑,浏览器会弹出"请触碰你的密钥",你按一下密钥上的金属圆形触片,登录完成。
它和验证码最大的差别是:你不需要输入任何"数字"。这个区别看起来微小,但它是从根本上挡住"钓鱼站中继"的关键。
第四档 · Passkey(FIDO2 + 设备绑定)
2023 年开始普及,到 2025 年下半年已经成为苹果、谷歌、微软三家共同推动的默认方案。Passkey 在底层用的是和硬件密钥相同的协议(FIDO2 / WebAuthn),但它不需要一个单独的硬件 —— 你的手机本身就是密钥。
用 iCloud Keychain 或者 Google Password Manager 同步之后,Passkey 可以跨设备使用:在新手机上登录的时候,旧手机弹出"是否允许",你按一下,新手机就拿到了密钥。
体验上比 YubiKey 更顺,安全等级在大多数场景下持平。但 Passkey 有一些细节要看清,下文也会讲。
短信 2FA 为什么不安全
短信 2FA 不安全有两层原因,第一层是技术层,第二层是社会工程层。
技术层:短信协议(SS7)是 1970 年代设计的电信信令体系,没有任何加密。一条短信从交易所发到你手机的整个链路里,至少经过三到四个运营商节点,每个节点都看得到内容。在某些国家和地区,有研究公司已经多次演示过用 SS7 漏洞直接读取目标手机短信的攻击 —— 不需要你做任何事,他们能从隔壁运营商网络里读到你的 6 位数。
社会工程层是更主流的攻击路径,叫 SIM Swap(SIM 卡盗用)。攻击者拿到你的姓名、身份证号、手机号这些信息(暗网售价很低,往往跟一次外卖的钱差不多),到运营商营业厅或者通过电话客服声称"我手机丢了,需要补一张 SIM 卡"。一旦补卡成功,你的手机号被转移到攻击者的 SIM 上,你的原 SIM 失去信号,从此短信验证码全部发到攻击者手里。
SIM Swap 已经是公开事件。2019 年 Twitter 创始人 Jack Dorsey 本人的 Twitter 账户被 SIM Swap 攻破并发了一连串推文;2021 年到 2024 年期间,美国 FBI 累计接到的加密相关 SIM Swap 报案超过 1600 起,损失金额在数千万美元规模;中文圈也有零星案例,主要集中在持币量较大的早期玩家身上。
短信 2FA 的危险不在于"很难防",而在于"它根本不取决于你"。你的密码再强、你的设备再干净,只要攻击者拿到了你的运营商客服信任,他就拿到了你的短信验证码。这条防线的关键节点不在你手上 —— 这是它和其他三档最大的差别。
所以一个反直觉的事实:开了短信 2FA 的账户,安全水位不一定比"只用密码 + 强密码管理器"的账户更高。短信 2FA 加进来的"一道锁",钥匙是放在运营商客服那里的。
TOTP 的优势和盲点
TOTP 把"种子"放在你的设备里,从此攻击者攻破运营商也没用 —— 这是 TOTP 相对短信的核心优势。但 TOTP 还是一个"6 位数验证码",验证码这种东西的本质决定了它的盲点。
盲点在哪:TOTP 的 6 位数是给"人"读、给"网页"输入框接收的。这意味着,如果有一个钓鱼站长得跟交易所一模一样,你在它的输入框里输 TOTP,钓鱼站背后的服务器可以在几秒钟内把这个 TOTP 转发给真的交易所。攻击者用这个 TOTP 完成登录,你以为你登录了,其实是攻击者登录了。
这种攻击叫 AiTM(Adversary in the Middle,中间人攻击),实现门槛在 2020 年之前还比较高,需要自己写中继代理。但 2022 年以后,开源工具如 Evilginx2、Modlishka 把这套流程降到了"配一个 phishlet 文件就能上"的程度。配合一个看起来合理的钓鱼域名(往往是相似拼写或者新顶级域名),整套攻击非常便宜。
TOTP 的另一个盲点是种子管理。如果你用 Google Authenticator 这种不带云同步的 app,换手机的时候要么提前导出(很多 app 默认不支持),要么去每个网站重新绑定。这种摩擦逼着一部分人去用带云同步的 Authy 或者 1Password —— 这本身没问题,但你的 TOTP 种子的安全等级,从此跟你的云账户挂钩。如果云账户被攻破,所有 TOTP 种子一起完蛋。
不过即便有这些盲点,TOTP 仍然是比短信高一个量级的方案。它挡住了 SIM Swap、挡住了 SS7、挡住了运营商内部人员作恶 —— 它只挡不住"你亲自把验证码输到了钓鱼站"。这是用户行为问题,跟方案设计无关。
硬件密钥 · 真正的天花板
硬件密钥的工作原理跟验证码完全不是一回事。它不生成"数字",它生成"签名"。
登录的时候浏览器把当前的网址(更精确地说是 origin,比如 https://binance.com)连同一段随机挑战值一起发给硬件密钥。硬件密钥用内置的私钥对这两段一起做签名,把签名返回给浏览器。浏览器再把签名转交给服务器。服务器用预先绑定的公钥验签 —— 验签通过,登录成功。
关键在第一步:"浏览器把当前的网址发给硬件密钥"。这是钓鱼防护的根基。如果你打开了一个钓鱼站,比如 https://binnance.com(注意多了一个 n),浏览器发给密钥的 origin 就是 binnance.com,密钥用自己内置的私钥做签名,得到的签名是给 binnance.com 用的,攻击者就算转发给真的 binance.com 也通不过验签 —— 因为公钥绑定的是真域名,签名携带的也必须是真域名。
另一道防护是物理按键。YubiKey 上有一个金属圆形触片,需要你用手指接触才能完成签名。这意味着即使你的电脑被远程控制了、即使有恶意软件假装成浏览器发起签名请求,没有人在物理上按那个触片,密钥就什么都不会签。
两道防护叠加之后,硬件密钥几乎免疫所有"远程攻击"。剩下的风险点是:物理丢失(攻击者拿到了你的密钥)、社会工程(攻击者骗你把密钥插上并按下触片)、以及供应链攻击(你买到的密钥本身就被动过手脚)。第三种风险靠从 Yubico 或 Solo Key 官方渠道购买可以基本消除;前两种风险靠"日常带身上 / 备份密钥放保险箱"来对冲。
YubiKey 5 系列同时支持 FIDO2、U2F、TOTP、OpenPGP、Smart Card 几种协议,一根 320 元到 580 元人民币之间。这是一笔一次性投入,从此十年内你不需要再操心 2FA 这件事。
Passkey 是什么
Passkey 用的是和 YubiKey 完全相同的底层协议 —— FIDO2 + WebAuthn。差别只在"私钥存在哪":YubiKey 存在物理硬件里,Passkey 存在你的手机 / 电脑的安全飞地(iPhone 的 Secure Enclave、Android 的 StrongBox、Windows 的 TPM)里。
使用体验上 Passkey 比 YubiKey 顺很多。你在 Binance 注册 Passkey 的时候,手机弹出 Face ID / 指纹识别框,你确认一下,注册完成。下次登录的时候,浏览器扫一个二维码到手机,手机弹 Face ID,确认,登录完成。整个过程不需要拿出一根棒子来插。
跨设备同步是 Passkey 相对 YubiKey 的最大优势。Apple 的 iCloud Keychain、Google 的 Password Manager、1Password 7.x 之后的版本都支持 Passkey 同步 —— 你在 iPhone 上注册的 Passkey,可以自动同步到 iPad、MacBook,新设备登录的时候直接可用。换手机不再是一件痛苦的事。
但 Passkey 有几个细节要看清:
第一,Passkey 的安全等级取决于你的设备解锁安全。如果你的手机用了一个 4 位数 PIN 而且没开生物识别,Passkey 的防护就降到了这个 PIN 的水平。Passkey 不是把 YubiKey 的安全送给你,是把你的设备安全送给所有用 Passkey 的网站。
第二,云同步是双刃剑。同步意味着私钥的副本存在云服务商那里(加密形式)。如果有一天你的云账户被攻破,攻击者拿到的不止是 Passkey 列表,还有所有曾经同步过的私钥副本。Apple、Google 都用端到端加密保护这些数据,但你需要保证云账户本身的 2FA 足够强 —— 这绕回来又是一个 2FA 选哪一档的问题。
第三,目前国内交易所对 Passkey 的支持还不完整。Binance 在 2024 年下半年开始支持 Passkey,OKX 在 2025 年初跟上,但部分小交易所、部分 dapp 还停留在"只支持短信 + TOTP"的状态。
四种方式的真实安全等级对比
下面这张表是我自己用的判断尺。六个维度,每个维度按 1 到 5 打分,5 分最好。维度的选取偏实战 —— "防 SIM Swap"和"防钓鱼"是真实攻击的发生地,"易用性"和"跨设备"是会影响你是否真的会用它的因素。
| 维度 | 短信 | TOTP | 硬件密钥 | Passkey |
|---|---|---|---|---|
| 防 SIM Swap | 1 | 5 | 5 | 5 |
| 防钓鱼站中继 | 1 | 2 | 5 | 5 |
| 防恶意软件 | 2 | 3 | 5 | 4 |
| 易用性 | 5 | 3 | 3 | 5 |
| 跨设备 / 换机 | 5 | 2 | 3 | 5 |
| 丢失可恢复 | 4 | 3 | 3 | 4 |
| 总分 | 18 | 18 | 24 | 28 |
有几个数字值得说明一下。短信和 TOTP 总分一样是 18,但分布完全不同 —— 短信的高分全在易用性和恢复,TOTP 的高分在防御能力。如果你只看"防御"这三行,短信是 4 分,TOTP 是 10 分,差距是 2.5 倍。所以两个 18 不是同一种 18。
Passkey 总分 28 比硬件密钥 24 高,主要赢在易用性和跨设备。但"防恶意软件"这一栏 Passkey 比硬件密钥低一分 —— 因为 Passkey 的私钥虽然在安全飞地里,但调用它的"系统层"如果被恶意软件攻破,理论上存在一种诱导用户用 Face ID 解锁后被截获的攻击向量。在主流操作系统上这种攻击门槛极高,但不为零。硬件密钥的物理触片把这条路彻底断了。
实测 · 一次钓鱼站中继演练
我用一个交易所的测试账户(账户里只有 50 USDT 测试余额,没有真实资产),分两轮做了对照。两轮之间只换一件事:登录时用的 2FA 方式 —— 第一轮 TOTP,第二轮硬件密钥(YubiKey 5C NFC)。其余条件保持一致。
"钓鱼站"是我自己在本地用 nginx 搭的一个反向代理,域名是一个看起来眼熟的拼写(这里就不写出来了,避免被误用),TLS 用 Let's Encrypt 签了一张真证书 —— 浏览器地址栏是绿色的,肉眼很难辨识跟真站点的差别。中继逻辑用了一个开源 phishlet 模板,能把目标交易所的登录流程完整代理过来。整个搭建大约花了 90 分钟。
第一轮 · TOTP:我在测试账户里把 2FA 设为 Google Authenticator。然后假装自己是一个收到了钓鱼链接的用户,打开本地的钓鱼站,输入邮箱密码,然后输入手机上 Google Authenticator 显示的 6 位数。
结果:钓鱼站立刻把这三段(邮箱、密码、TOTP)转发给真交易所,真交易所验证通过,钓鱼站背后的脚本获得了一个有效 session cookie。我在另一个浏览器窗口里用这个 cookie 直接进入了账户,能看余额、能看历史,理论上也能发起提币(虽然提币会再触发一次 2FA,但是钓鱼站还可以继续中继下一次 TOTP)。整个流程从我输入 TOTP 到攻击者拿到 cookie,耗时不到 4 秒。
第二轮 · 硬件密钥:把测试账户的 2FA 改成 YubiKey 5C NFC。同样的钓鱼站,输入邮箱密码,浏览器弹出"请触碰你的安全密钥"。
结果:我把 YubiKey 插上,按下金属触片。浏览器返回一个错误 —— "无法验证此凭证"。原因正是上面讲过的:YubiKey 看到当前 origin 是钓鱼域名,用对应的私钥做签名(如果之前注册过这个域名,但实际上没有),或者直接拒绝签名(因为没有对应该 origin 的密钥)。钓鱼站拿不到任何可以转发给真交易所的有效签名,攻击链断在这里。
这不是一个完美的对照 —— 钓鱼站的实现质量、TOTP 的有效时间窗口都会影响结果。但量级上的差距足够直观:TOTP 在我的演练里 100% 被中继成功,硬件密钥 100% 失败。这跟你的警觉性无关 —— 我是带着百分之百的"知道这是钓鱼站"的认知去操作的,TOTP 仍然被拿走了。换句话说,"小心一点"在 TOTP + 钓鱼站的场景下保护不了你。
演练结束后我把测试账户的 2FA 改回 Passkey + YubiKey 备用密钥的组合,并把演练用的钓鱼站和证书全部销毁。
怎么选 / 怎么搭配
下面是几条偏个人偏好的建议。不写"推荐",因为每个人的情况不一样,你看完拿去拼自己的方案。
如果你的交易所账户里有任何金额:第一时间把短信 2FA 换成 TOTP。这一步是最低成本的升级,5 分钟,不需要买任何硬件。Google Authenticator、Authy、阿里安全、1Password OTP 任选其一。这一步能挡住所有 SIM Swap 攻击,剩下的钓鱼风险靠下一步处理。
如果你的账户里有超过你愿意承担损失的金额:买一根 YubiKey 5 系列,再买一根备用。两根一起绑到交易所账户,主用一根日常带身上,备用一根锁在抽屉或者保险箱里。一次性投入 700 块左右人民币,从此免疫绝大多数远程攻击。
如果你嫌 YubiKey 麻烦:用 Passkey。前提是你信任你的设备解锁安全(建议关 PIN 用 Face ID / 指纹),并且你的云账户本身用的是更强的 2FA。Passkey 的便利性是它最大的优点,但它的强度不会超过你设备 + 云账户的安全水位。
组合建议:主 2FA 用 Passkey(顺手),备用 2FA 用硬件密钥(兜底)。绑定的时候确保两种都注册到账户,并且记录下账户后台的备份码(备份码是 8 到 16 位的一串字符,所有 2FA 都丢失的时候用这串字符救命)。备份码用纸抄下来收好,不要保存在任何联网设备上。
不同交易所对硬件密钥的支持深度不一样。Binance 和 OKX 目前都支持 YubiKey + Passkey 并存,可以同时绑定多个密钥;某些小交易所只支持"一个账户一个 2FA",这种情况下你需要在 TOTP 和硬件密钥之间二选一 —— 优先硬件密钥。本文实测版本:Binance Web 2025-12 / OKX Web 2025-12。
写在最后
有一个反直觉的事实:交易所之所以默认推荐短信 2FA,不是因为短信安全,而是因为短信普及。每个人都有手机号,每个人都能收到短信,开通成本最低,转化率最高。对交易所来说,"用户开了 2FA"比"用户开了什么样的 2FA"更重要 —— 至少从合规和 PR 角度来说是这样。这是产品逻辑,不是安全逻辑。
真正的安全逻辑是:选 2FA 的时候,看的是"最差情况下,这道锁的钥匙在谁手里"。短信的钥匙在运营商客服手里,TOTP 的钥匙在你的设备 + 你的警觉性手里,硬件密钥的钥匙在你身上那根金属棒手里,Passkey 的钥匙在你的设备 + 你的云账户手里。
选哪种,看你信任谁、能承担什么样的失误。但有一件事是明确的:如果你今天还在用短信 2FA 保护一个有真实资产的交易所账户,停下手里的事,去后台把它换成 TOTP。这是一个 5 分钟的动作,挡住的是一个 70 年代设计的协议留下的窟窿。
如果你在阅读过程中发现交易所的设置界面跟本文描述对不上 —— 各家平台的 2FA 选项位置经常调整 —— 请告诉我们,我们会在 勘误页 更新。
下一篇会讲钓鱼诈骗的完整图谱,包括 2FA 中继之外的另外 10 类骗局:钓鱼诈骗全图谱 · 2026 版。