一句话回答: TOTP 和 HOTP 是验证器里那串六位数背后的两种算法。HOTP(基于 HMAC)用一个计数器,每生成一次码就加一,所以一个码在被用掉之前一直有效;TOTP(基于时间)把计数器换成时钟,所以码每 30 秒自动变一次。你用过的验证器 App 几乎都是 TOTP,HOTP 主要还留在硬件令牌里。

有没有想过:为什么验证器里的码半分钟就失效,而老式银行密钥器上的数字却能一直等你输完?这就是 TOTP 和 HOTP 的区别。它们同根同源,只在一件事上分道扬镳——是什么在推动计数器。下面讲清这带来的实际差异,以及它和你用短信验证码收到的码有什么关系。
一、同一个密钥,不同的计数器
两种算法都从一个共享密钥出发——一段随机密钥,同时存在你的设备和服务器上。生成码时,把这个密钥和一个「移动的数字」一起过一遍 HMAC 哈希,再截取成六位数。真正的区别只在于这个「移动的数字」从哪来:
- HOTP 用事件计数器。每生成一次码就加一。第 47 号码在被用掉之前一直有效,用掉后服务器就等第 48 号。
- TOTP 用时间。它把当前时间切成 30 秒一段,用「第几段」当计数器。段一翻过去,码就自己变了。
就这么简单。TOTP 本质上就是把时钟接到了 HOTP 计数器的插槽上。
二、实际差别
| 因素 | HOTP(计数器) | TOTP(时间) |
|---|---|---|
| 什么推动码变化 | 一次按键 / 事件 | 时钟,每 30 秒 |
| 一个码能用多久 | 直到被用掉 | 约 30 秒 |
| 是否要对时 | 不需要 | 需要(设备和服务器) |
| 码被偷后的风险 | 用掉前一直有效 | 很快过期 |
| 常见载体 | 硬件令牌 | 验证器 App |
TOTP 的「短命」正是它胜出的原因:偷到的码一分钟内基本作废。HOTP 的「一直有效」对时钟漂移更宽容,但泄漏的码会一直躺着等人用。
三、你到底在哪儿会碰到它们
打开 Google Authenticator、Authy,或密码管理器内置的验证码,你用的就是 TOTP——这是如今的默认方案,也正是我们在验证器 App 和短信验证码对比里拿来和短信比的那套机制。HOTP 更多出现在专用硬件里:银行读卡器、老式 RSA 密钥器、部分 FIDO 兜底设备——那些地方没有可信的时钟。
两者都不经过电话网络下发。这正是它和短信验证码最大的不同:短信的码是服务器生成后发给你的——所以短信码能用在线号码收,而 TOTP/HOTP 的码不行。
四、如果你用在线号码收码,这意味着什么
TOTP 和 HOTP 都是从存在你设备上的密钥算出来的——网络上没有东西可拦截,因此在线号码也帮不上忙。如果一个服务只提供「验证器 App」这一种方式,那接码服务根本不在这个流程里。
短信验证码正相反:它的密钥是一次性的、会送到某个手机号,所以无 SIM 卡在线收码对它才管用。当网站让你在「验证器 App」和「发短信给我」之间选时,短信那一项才是在线号码能完成的。
常见问题
Q:TOTP 比 HOTP 更安全吗? 多数场景下是的——30 秒过期大幅压缩了偷到的码还能用的时间。HOTP 的好处仅在于不用对时。
Q:为什么验证器的码有时候在切换的瞬间就被拒? 时钟漂移。如果手机时间和服务器差得超过容错窗口,TOTP 码就会失败。打开「自动网络对时」通常就好了。
Q:TOTP 的码能用短信收吗? 不能。TOTP 是本地用密钥算出来的,从不下发。只有短信验证码才会发到手机号。
小结
TOTP 和 HOTP 是同一个算法配了不同的时钟:HOTP 数事件、会一直等,TOTP 数秒、会过期。 两者都是设备本地生成的密钥,都不走电话网络——而下发到号码这件事,始终只有短信验证码在做,也只有它能用在线号码收到。