一次性密码(OTP)是一次使用、用后即弃的验证码。下面梳理它的类型,以及人们常常忽略的一个局限:钓鱼仍能将其攻破(不写攻击手法)。
类型:TOTP / HOTP / SMS-OTP
它们都被笼统地归为「一次性验证码」,但按生成方式可分为三类。
TOTP(基于时间)
应用用共享密钥 + 当前时间算出。约每 30 秒切换一次。可离线工作。
HOTP(计数器)
按计数而非时间推进。每按一次给出下一个验证码。硬件令牌常用。
SMS-OTP
通过短信发送验证码。方便,但易受 SIM 交换和中继攻击——最脆弱的方式。
它们都具有「一次性、短命」的特性,所以即使固定密码泄露,验证码本身也难以重用。尤其是 TOTP,它在应用内计算、不经过任何网络往返,因此没有 SMS 那样的截获路径。
强项与局限:假网站能窃取你输入的验证码
OTP 修补了固定密码的弱点,但它并不是完整的防护。决定性的局限在于:由人读取并输入验证码。
OTP 起作用的场景
- 挡下因密码泄露 / 重用而来的账户被盗
- 即使被看到,也会很快失效、难以重用
- 身份验证器应用的 TOTP 可离线工作,比 SMS 更能抵御截获
OTP 被攻破的场景
- 中间人(AiTM)钓鱼:假网站把 OTP 中继给真网站并登录
- SIM 交换:劫持手机号并抽走 SMS-OTP
- 根本原因 = 人能把验证码交给假网站(它没有绑定到域名)
送达方式如何改变风险
「一次性密码」包含多种方式,弱点取决于验证码在哪里生成、以及如何送到你手上。
| 方式 | 验证码在哪里生成 | 如何送到你手上 | 主要弱点 |
|---|---|---|---|
| 身份验证器应用(TOTP) | 你的手机上 | 不经传输(在设备上计算) | 在假网站上输入、手机丢失后的恢复 |
| 硬件令牌 | 小型专用设备 | 不经传输(显示在其屏幕上) | 在假网站上输入、设备丢失 |
| SMS | 服务的服务器 | 移动电话网络 | 在假网站上输入、SIM 交换、短信被截获 |
| 邮件 | 服务的服务器 | 电子邮件 | 在假网站上输入、邮箱账户被盗 |
所有方式共同的弱点是被输入到假网站上。美国国家标准与技术研究院(NIST)的认证指南 SP 800-63B(第 4 版,2025 年 8 月)指出,手动输入的一次性密码不可能具备抗钓鱼能力,并把 SMS 等使用电话网络的方式列为「受限」。美国网络安全和基础设施安全局(CISA)也在 2024 年 12 月建议不要把 SMS 用作第二因素。
双因素认证、两步验证和通行密钥这些术语之间的关系,汇总在什么是双因素认证的比较表中。
TOTP 的原理:二维码里装着密钥
设置身份验证器应用时扫描的二维码,包含服务与应用共享的一个密钥值。应用根据这个值和当前时间计算验证码,服务端做同样的计算来核对是否一致。
- 标准(RFC 6238)推荐 30 秒的时间步长
- 为了容许网络延迟,服务通常也接受上一个步长的验证码(标准建议最多一个步长)
- 基于计数器的 HOTP(RFC 4226)则在每次例如按下按钮时向前推进
由此可知,持有二维码或密钥字符串的人,可以生成相同的验证码。把设置画面的截图保存在云端或聊天里,就等于把密码写下来放着。
真实案例:网上银行的未授权转账
2023 年,日本的网上银行未授权转账激增。据日本金融厅称,2023 年 1 月至 11 月的损失达到 5,147 起、约 80.1 亿日元(截至 12 月 8 日),两项均创历史新高。金融厅描述的手法是:用冒充银行的邮件或短信把用户引到假网站,窃取网上银行的 ID、密码、一次性密码等信息,然后把钱转走。
这个案例的两点教训:
- 一旦把验证码输入到假网站,一次性密码就挡不住:无论验证码的有效期多短,只要在你输入的那一刻就被使用,就来得及
- 能挡下它的地方在输入之前:银行表示不会通过邮件或短信索要 ID 或密码。不在通过邮件或短信链接打开的页面上输入验证码,是用户能采取的最可靠的一步
此后,日本的证券公司和银行正在推进把通行密钥等在假网站上无法完成的认证设为必须(什么是通行密钥)。
如何检查自己的账户和服务
把使用 SMS 的账户迁移到身份验证器应用
打开邮箱、密码管理器、GitHub、云服务等重要账户的双因素认证设置。如果使用的是 SMS,添加身份验证器应用(TOTP)并设为首选方式。如果支持通行密钥,也一并添加。GitHub 请参阅设置 GitHub 双因素认证。
为换新手机或丢失手机做准备
确认身份验证器应用可以迁移到其他设备(它的备份或转移功能)。把各服务的恢复码保存在手机以外的地方,例如密码管理器中。
确认二维码和密钥没有随处留存
在相册、云存储或聊天中查找设置二维码或密钥字符串的截图,找到就删除。
如果你在开发服务,复查验证规则
验证验证码时限制失败次数(否则 6 位验证码在现实中可以被暴力尝试)。即使在有效期内,同一个验证码也只接受一次。把容许的时钟偏差控制在约一个步长。为管理员账户提供比一次性密码更强的通行密钥。
本站的观点:OTP 是中间步骤,目标是通行密钥
OTP 是走出「只有密码」的一个绝佳第一步。事实上,无论 SMS 还是 TOTP,光是开启就能挡下大多数账户被盗。但本站把 OTP 视为中间步骤,而非最终目标。只要中间人钓鱼仍是现实威胁,目标就是签名绑定到域名、在结构上无法对假网站出示的通行密钥(FIDO2)。
优先级很清楚:先在所有账户开启 OTP,再把最重要的账户(邮箱、域名、支付)迁移到通行密钥。要点是不要依赖「靠小心识破假网站」。
出处(一手资料)
- IETF RFC 6238,“TOTP: Time-Based One-Time Password Algorithm” — rfc-editor.org(30 秒时间步长,为网络延迟最多容许一个步长)
- IETF RFC 4226,“HOTP: An HMAC-Based One-Time Password Algorithm” — rfc-editor.org(基于计数器的一次性密码、限制失败次数)
- NIST SP 800-63B-4(2025 年 8 月) — pages.nist.gov(手动输入的 OTP 不可能抗钓鱼、电话网络方式为受限、同一 OTP 只接受一次、速率限制)
- CISA,“Mobile Communications Best Practice Guidance”(2024 年 12 月) — cisa.gov(PDF)(不要把 SMS 用作第二因素)
- 日本金融厅,关于钓鱼导致的网上银行未授权转账激增的提醒(日文) — fsa.go.jp(2023 年 1–11 月的件数和损失、一次性密码等信息被窃取)
接下来阅读
- 术语:什么是双因素认证(2FA)(OTP 作为「第二重证明」被使用的语境)· 什么是通行密钥(比 OTP 更强的抗钓鱼能力)
- 术语:什么是钓鱼(理解中继 OTP 的中间人 AiTM 攻击)
- 入门:如何正确选择 MFA(在实务中选定方式)· 设置 GitHub 双因素认证(身份验证器应用与恢复码)
- 案例:7pay 盗刷事件(2019)(因没有 2FA 而被接管的支付应用实例)