基于短信的一次性密码(SMS OTP)多年来一直是双因素认证(2FA)的标配。但随着网络攻击手段日益复杂,SMS OTP 已被证明存在严重安全隐患。SIM 卡交换、实时窃取验证码的钓鱼网站以及读取短信的恶意软件,都危及通过短信发送的验证码的安全性。
本文解释为什么监管机构和安全专家正在逐步淘汰 SMS OTP,TOTP(基于时间的一次性密码) 验证器应用如何解决这些漏洞,以及如何将你的账户迁移到更安全的设置。

SMS OTP 的安全缺陷
SMS OTP 存在几个根本性弱点:
- SIM 卡交换:攻击者诱骗移动运营商将你的手机号码转移到他们的 SIM 卡上,然后接收你的 OTP 验证码。
- 钓鱼攻击:虚假登录页面在你输入验证码时实时捕获并转发给攻击者。
- 恶意软件:手机上的木马应用可以拦截短信并将其转发到远程服务器。
- 社会工程学:攻击者冒充银行或客服,诱骗你主动交出验证码。
全球监管机构已开始采取行动。2025 年,香港证券及期货事务监察委员会(SFC)命令经纪商和持牌虚拟资产交易平台停止在客户登录和设备绑定时使用 SMS OTP,要求采用更稳健的防仿冒方法,如通行密钥或设备绑定。新加坡金融管理局(MAS)和马来西亚国家银行(BNM)也发布了类似指引。
为什么 TOTP 验证器应用更好
TOTP(RFC 6238)根据存储在设备上的共享密钥生成一个限时六位验证码。该验证码每 30 秒刷新一次,并在本地计算——从不通过网络传输。这消除了困扰 SMS 的攻击向量:
| 威胁 | SMS OTP | TOTP 验证器 |
|---|---|---|
| SIM 卡交换 | 易受攻击 | 免疫(密钥存储在设备上,而非 SIM 卡) |
| 钓鱼攻击 | 验证码可被实时捕获 | 验证码是临时的,但若用户在虚假网站上输入仍可被钓鱼 |
| 恶意软件/短信拦截 | 易受攻击 | 免疫(不涉及短信) |
| 网络拦截 | 易受攻击(SS7 漏洞) | 免疫(验证码本地生成) |
| 设备丢失 | 验证码可从短信收件箱读取 | 受设备 PIN/生物识别保护 |
虽然 TOTP 并非完全防钓鱼(用户仍可能被诱骗在虚假网站上输入验证码),但它消除了远程拦截和基于 SIM 的攻击。结合设备绑定或通行密钥,它构成了更强大的屏障。
TOTP 的工作原理
TOTP 基于一个共享密钥(通常是 Base32 编码的字符串)和当前 Unix 时间。算法计算时间计数器(自纪元以来的 30 秒间隔数)的 HMAC-SHA1 哈希,截断并提取出 6-8 位验证码。
首次设置 2FA 时交换密钥——通常通过编码了 otpauth:// URI 的二维码:
otpauth://totp/Example:user@example.com?secret=JBSWY3DPEHPK3PXP&issuer=Example&algorithm=SHA1&digits=6&period=30
你的验证器应用存储此密钥。每 30 秒,它重新计算验证码。服务器执行相同操作,如果匹配,则身份验证通过。
实际迁移:从 SMS 到 TOTP
以下是将账户从 SMS OTP 迁移到验证器应用的步骤:
- 安装验证器应用:Google Authenticator、Microsoft Authenticator、Authy 或 2FAS 是流行选择。开源选项:Aegis(Android)或 Raivo OTP(iOS)。
- 对于每个账户:进入安全设置 → 启用 2FA → 选择“验证器应用”而非“短信”。用你的应用扫描二维码。
- 备份你的密钥:大多数应用支持加密备份。Authy 跨设备同步;Microsoft Authenticator 备份到 iCloud/Google 账户。记下每个服务提供的恢复码。
- 在禁用短信前测试:保留短信作为备用,直到确认 TOTP 正常工作。
- 移除短信选项:一旦 TOTP 稳定,完全禁用短信 2FA。
实操示例:保护 GitHub 账户
让我们逐步演示将 GitHub 从 SMS 迁移到 TOTP:
- 进入 GitHub 设置 → 密码和身份验证 → 双因素认证。
- 点击“启用双因素认证”。
- 在“验证器应用”下,点击“使用应用设置”。
- GitHub 显示一个二维码。打开你的验证器应用,点击“+”扫描它。
- 应用添加一个名为“GitHub: yourusername”的条目,并开始生成 6 位验证码。
- 将应用中的当前验证码输入 GitHub 的验证字段。
- GitHub 显示一组恢复码——将它们保存在安全的地方(密码管理器或打印出来)。
- 通过输入应用中的另一个验证码来确认。
- 现在返回安全设置并移除之前启用的短信选项。
你的 GitHub 账户现在使用 TOTP 而非 SMS。密钥仅存储在你的手机和 GitHub 的服务器上——从不通过短信传输。
常见陷阱
- 未备份手机丢失:如果没有备份 TOTP 密钥,你将无法登录账户。务必保存恢复码或使用支持云备份的应用。
- 时钟偏差:TOTP 依赖于准确的时间。如果设备时间误差超过几秒,验证码将不匹配。大多数应用会自动同步,但如果验证码持续失败,请检查时间。
- 在多个设备上使用同一密钥:在多个手机间共享同一 TOTP 密钥虽然方便,但会降低安全性。请使用应用特定的备份方法。
- 钓鱼仍然有效:如果你在虚假网站上输入 TOTP 验证码,它仍然可能被盗。输入任何验证码前务必验证网址。
- 迁移后未禁用短信:保留短信作为备用会削弱安全性。攻击者仍可能通过 SIM 卡交换请求短信验证码。
常见问题
TOTP 会被破解吗?
TOTP 密钥存储在设备本地。如果攻击者物理访问了你未锁定的手机,他们可能导出密钥。否则,远程攻击非常困难。钓鱼仍然是最大的威胁——切勿在你未主动导航到的网站上输入 TOTP 验证码。
如果我丢失了手机怎么办?
如果你备份了恢复码或使用了支持加密云同步的应用(如 Authy、Microsoft Authenticator),你可以恢复访问。如果没有备份,你需要联系每个服务的支持团队以证明身份并禁用 2FA。
TOTP 比推送通知更好吗?
基于推送的 2FA(如 Duo、Microsoft Authenticator 推送)通常更防钓鱼,因为你批准登录请求而非输入验证码。然而,TOTP 仍然比 SMS 安全得多,并且可以离线工作。
我应该使用硬件安全密钥吗?
硬件密钥(FIDO2/WebAuthn)提供最强的保护——它们免疫钓鱼且需要物理持有。但需要花费金钱,且并非所有服务都支持。TOTP 在安全性和便利性之间取得了良好平衡。
如何从一个验证器应用迁移到另一个?
大多数应用允许以二维码或 otpauth:// URI 形式导出密钥。在 Google Authenticator 中,使用“传输账户” → “导出账户”。在 Microsoft Authenticator 中,你可以备份到 iCloud/Google 并在新应用中恢复。或者,通过从服务安全设置中重新扫描原始二维码来手动重新添加每个账户。
结论
SMS OTP 是一个正在消亡的标准。其漏洞已得到充分证实,监管机构正在推动更强的方法。迁移到 TOTP 验证器应用是一个简单、免费的步骤,能显著提高账户安全性。在我们的 OTP 生成器 中尝试直接在浏览器中生成和验证 TOTP 验证码。
请记住:没有单一的安全措施是完美的。将 TOTP 与强密码、设备绑定以及对可疑请求的警惕相结合。你的账户将安全得多。