技术原理
TOTP 与 HOTP 有什么区别?时间、计数器与共享密钥
看懂 TOTP 的时间窗口和 HOTP 的计数器,避免把所有动态验证码都当成同一种算法。
TOTP 使用时间步数作为变化输入,HOTP 使用递增计数器。两者都基于共享密钥与 HMAC,但双方保持同步的方式不同。
TOTP:时间驱动
按照 RFC 6238,时间步数可写成 T = floor((当前 Unix 时间 - T0) / X)。X 是周期,常见值为 30 秒。跨过时间窗口后,输入发生变化,验证码通常也会变化。
更换手机显示时区通常不会改变 Unix 时间,因此真正需要检查的是系统时钟是否准确,而不是仅调整时区。验证端如何接受相邻时间窗口,由具体服务决定。
HOTP:计数器驱动
HOTP 的变化输入是计数器,每次使用或生成后的递增规则需要与服务端约定。错误生成或反复消耗计数可能造成不同步,需要平台提供的重同步机制。
本网站生成工具目前只支持 TOTP,不提供 HOTP 计数器状态管理。
为什么有时出现相同验证码?
同一个时间窗口内,相同密钥与参数会输出相同 TOTP。即使输入不同,有限位数的输出也可能碰巧相同;不能通过观察几组验证码判断两个密钥相等。
参数必须逐项匹配
密钥、哈希算法、位数、时间周期都需要匹配。不要从“都是六位数字”推断任何平台都兼容。Steam Guard 等机制有自己的格式与约束。