两种算法的核心差异
HOTP使用共享密钥和递增计数器生成验证码。每触发一次,验证器与服务器的计数值都需要向前移动。TOTP则把当前Unix时间换算成时间步长,可以理解为自动变化的计数器。
因此HOTP验证码不会因为等待而过期,但可能因为多次按键导致双方计数不同步;TOTP通常每30秒变化,对设备时间准确性更敏感。
使用体验对比
- TOTP无需用户手动递增,适合手机验证器和日常登录。
- HOTP适合某些实体令牌或事件驱动场景,但需要管理计数器同步。
- TOTP输入太慢会过期;HOTP输错后原验证码可能仍有效,取决于服务端策略。
- 两者的密钥都必须保密,截获一次验证码并不等于获得长期密钥。
为什么不能把两者混用
相同密钥放入不同类型的验证器,也会得到不同结果。手动添加时若把HOTP误选成TOTP,验证码不会通过;反过来也一样。
标准otpauth地址会在路径中标明totp或hotp。HOTP还需要counter参数,TOTP常见参数则包括period、digits和algorithm。
服务端如何处理同步
TOTP验证器通常允许当前时间窗口前后有限范围,以容忍网络延迟和少量时钟误差。HOTP服务端则可能向前检查有限个计数值,成功后把计数器推进到对应位置。
窗口开得越大,可接受的候选验证码越多,安全性也会下降。服务端还必须设置尝试次数限制,防止暴力猜测短验证码。
如何判断自己使用哪一种
手机身份验证器中每隔固定秒数自动刷新的6位码,通常是TOTP。需要按硬件按钮才产生新验证码的设备可能使用HOTP,也可能使用其他协议,最终应以服务官方说明为准。
不要只根据验证码位数判断类型,因为TOTP和HOTP都可以配置不同位数。
常见问题
TOTP比HOTP更安全吗?
不能只按算法名称判断。TOTP缩短了单个验证码的自然有效期,HOTP避免时间偏差,但实际安全性还取决于密钥保护、重试限制、验证窗口和恢复流程。
Google Authenticator通常使用TOTP还是HOTP?
常见网站绑定场景主要使用TOTP,但具体类型由服务提供的配置决定,标准otpauth地址会明确标识。