术语表

什么是一次性密码(OTP)?TOTP/HOTP/SMS 的区别与局限

一次性密码(OTP)是只能使用一次、短时间内有效的验证码。讲解 TOTP、HOTP 与 SMS 验证码的区别,它为何能防御泄露的密码,以及中间人钓鱼仍能突破的局限。

发布于 2026-07-02 更新于 2026-10-06 3 分钟阅读
本页目录

一次性密码(OTP)是一次使用、用后即弃的验证码。下面梳理它的类型,以及人们常常忽略的一个局限:钓鱼仍能将其攻破(不写攻击手法)。

类型:TOTP / HOTP / SMS-OTP

它们都被笼统地归为「一次性验证码」,但按生成方式可分为三类。

TOTP(基于时间)

应用用共享密钥 + 当前时间算出。约每 30 秒切换一次。可离线工作。

HOTP(计数器)

按计数而非时间推进。每按一次给出下一个验证码。硬件令牌常用。

SMS-OTP

通过短信发送验证码。方便,但易受 SIM 交换和中继攻击——最脆弱的方式。

OTP 的三种主要方式。强度归根结底看『能不能交给假网站』。

它们都具有「一次性、短命」的特性,所以即使固定密码泄露,验证码本身也难以重用。尤其是 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 或密码。不在通过邮件或短信链接打开的页面上输入验证码,是用户能采取的最可靠的一步

此后,日本的证券公司和银行正在推进把通行密钥等在假网站上无法完成的认证设为必须(什么是通行密钥)。

如何检查自己的账户和服务

1

把使用 SMS 的账户迁移到身份验证器应用

打开邮箱、密码管理器、GitHub、云服务等重要账户的双因素认证设置。如果使用的是 SMS,添加身份验证器应用(TOTP)并设为首选方式。如果支持通行密钥,也一并添加。GitHub 请参阅设置 GitHub 双因素认证。

2

为换新手机或丢失手机做准备

确认身份验证器应用可以迁移到其他设备(它的备份或转移功能)。把各服务的恢复码保存在手机以外的地方,例如密码管理器中。

3

确认二维码和密钥没有随处留存

在相册、云存储或聊天中查找设置二维码或密钥字符串的截图,找到就删除。

4

如果你在开发服务,复查验证规则

验证验证码时限制失败次数(否则 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 月的件数和损失、一次性密码等信息被窃取)

接下来阅读

FAQ

Q一次性密码和普通密码有什么区别?
A

普通密码在你更改之前一直不变(固定),所以一旦泄露,在你轮换它之前都会被滥用。一次性密码(OTP)是一次性的——只在一次、且只在短时间内有效——用过的那一刻就失效。这使它即使被看到也难以重用,弥补了固定密码的弱点(泄露和重用)。许多服务把它作为密码之外的第二重证明,作为双因素认证的一种方式。

QSMS 一次性密码安全吗?
A

它明显强于仅有密码,但属于 OTP 里最弱的一种。SMS 可能被 SIM 交换(劫持你的手机号)截获,或被假网站中继的中间人钓鱼抽走。在条件允许处,请迁移到身份验证器应用的 TOTP;对重要账户,则迁移到通行密钥。

Q为什么身份验证器应用的验证码大约每 30 秒变一次?
A

因为它是 TOTP(基于时间的一次性密码)。应用和服务各自用共享的密钥与当前时间,按固定间隔(常为 30 秒)计算出相同的验证码。间隔一过,旧验证码就失效,由新的接替。保持短命,能缩小被盗验证码可用的时间窗口。

Q在假网站上输入了一次性密码,该怎么办?
A

假定这个验证码已经被用掉了。通过书签或官方应用登录——不要用邮件或短信里的链接——并更改密码。然后查看已登录的设备和会话列表,确认注册的邮箱、手机号和收款人没有被更改。如果是银行或证券公司,立即联系该公司。

Q为什么身份验证器应用的验证码总是被拒绝?
A

常见原因是手机的时间不准。TOTP 根据当前时间计算验证码,所以设备时钟一旦偏移,算出的验证码就会与服务端不同。把手机的日期和时间设为自动,然后试一下显示的下一个验证码。

Q一次性密码和通行密钥,哪个更安全?
A

通行密钥。一次性密码由人读取并输入,所以在假网站上输入后就会被原样中继。NIST 也指出,手动输入的一次性密码不可能具备抗钓鱼能力。通行密钥的签名绑定到网站的域名,所以在假网站上登录无法完成。