TOTP 调试台 是给正在实现两步验证的开发者用的。它不解决「我现在要一个验证码」,而解决「为什么我的码和对方对不上」。
按时间出码 —— 把时钟拨到任意时刻,看那一刻的码是什么。表格同时列出前后各两个时间窗,以及每个窗口的 counter 和起止时间。服务端日志里有时间戳和被拒的码,对照这张表几秒钟就知道是差了一个窗口还是完全对不上。
反查验证码 —— 反过来问:这个码是什么时候产生的?以填入的时间戳为中心搜索,命中就告诉你它落在第几个窗口、对应哪个时刻、两边时钟差多少。这是定位「时间不同步」和「密钥不对」的最快路径——前者会在正负一两个窗口命中,后者怎么找都找不到。
HOTP —— 基于计数器而非时间(RFC 4226)。列出从指定 counter 开始的连续几个码,用来排查客户端和服务端计数器跑偏了几步。
按实际遇到的频率排序:
floor(unix秒 / 周期),用毫秒忘了除 1000、或者用了四舍五入而非向下取整,都会偏。服务端验证时通常会容忍前后若干个窗口。这是个安全与体验的权衡:
用按时间出码面板把时钟前后拨几档,拿那些码去打自己的接口,就能实测出当前窗口到底开了多宽。
定位不同。TOTP 验证码页面是给普通用户的:粘密钥、拿当前的码,追求打开即会用。这一页是给正在实现两步验证的开发者的:指定任意时间戳、反查时间窗、模拟时钟偏移、HOTP 计数器——这些普通用户根本用不上,塞进那一页只会让它变复杂。
用匹配到的窗口偏移乘以周期。比如周期 30 秒、码落在 -2 窗口,就说明产生这个码的设备时间比你填的时间戳慢了 60 秒左右。注意这是个粗粒度估计:同一个窗口内的任何时刻算出来的码都一样,所以精度不会超过一个周期。
按可能性从大到小排:① 密钥不对,或者 Base32 里混进了非法字符;② 参数不一致,对方用的是 SHA256、8 位或 60 秒周期;③ 时间差得太远,超出了搜索范围,可以把范围调到正负 120 个窗口再试;④ 那个码本来就是错的。先用按时间出码面板确认自己这边算出来的码长什么样,再回头查。
因为调试时手边的东西就是时间戳——日志里、请求里、数据库里记的都是秒数。让你先把它转成年月日再选一遍,反而多绕一圈。旁边的正负三十秒按钮和现在按钮覆盖了最常用的几种拨动。
都支持。算法可选 SHA1/SHA256/SHA512,位数 6/7/8,周期 15/30/60 秒。密钥输入框左边可以切换 Base32、Hex、Base64 三种编码——不少自建服务发的是 Hex 密钥,展开密钥的其它编码形式还能看到三者的互转结果,点一下就复制。
不会。HMAC 计算用的是纯 JavaScript 实现,不依赖浏览器的 Web Crypto,全程在本机完成,不发任何网络请求。输入也不写入本地存储,刷新即清空。不过仍然请不要在这里填生产环境的真实密钥——调试用随机生成的就够了。