⭐ 觉得好用?收藏备用,下次直接打开 ✨ 开通会员去广告 · 更多权益即将开放 ☕ 支持作者
🔒
密钥只在本机浏览器内参与计算,不上传、不联网,输入不写入本地存储,刷新即清空。 请勿填入生产环境或真实账户的 2FA 密钥;本工具用于开发调试,任何因在公共设备粘贴密钥导致的泄露,本工具不承担责任。
密钥的其它编码形式
改这个数就等于把时钟拨到那一刻 —— 服务端说「码不对」时,用它对照自己算出来的窗口。

TOTP 调试台 是给正在实现两步验证的开发者用的。它不解决「我现在要一个验证码」,而解决「为什么我的码和对方对不上」。

三个面板分别回答什么

按时间出码 —— 把时钟拨到任意时刻,看那一刻的码是什么。表格同时列出前后各两个时间窗,以及每个窗口的 counter 和起止时间。服务端日志里有时间戳和被拒的码,对照这张表几秒钟就知道是差了一个窗口还是完全对不上。

反查验证码 —— 反过来问:这个码是什么时候产生的?以填入的时间戳为中心搜索,命中就告诉你它落在第几个窗口、对应哪个时刻、两边时钟差多少。这是定位「时间不同步」和「密钥不对」的最快路径——前者会在正负一两个窗口命中,后者怎么找都找不到。

HOTP —— 基于计数器而非时间(RFC 4226)。列出从指定 counter 开始的连续几个码,用来排查客户端和服务端计数器跑偏了几步。

TOTP 出错的四个常见原因

按实际遇到的频率排序:

  1. 时钟不同步 —— TOTP 完全依赖双方系统时间。服务器没开 NTP、容器时区错乱、用户手机时间手动调过,差超过一个时间步就对不上。
  2. 参数不一致 —— 默认是 SHA1、6 位、30 秒,但不是所有服务都用默认值。对方换了 SHA256 或 8 位而你没跟着改,码永远对不上。
  3. Base32 解码 —— 密钥必须按 RFC 4648 Base32 解码成字节再做 HMAC。直接把 Base32 字符串当 ASCII 字节喂进去是最经典的实现 bug,自测能过(因为两边错得一样)、和标准验证器一对就穿帮。
  4. 时间步取整 —— counter 是 floor(unix秒 / 周期),用毫秒忘了除 1000、或者用了四舍五入而非向下取整,都会偏。

校验窗口该开多宽

服务端验证时通常会容忍前后若干个窗口。这是个安全与体验的权衡:

  • 只认当前窗口:用户在窗口边缘输入就会失败,体验很差
  • 正负 1 个窗口(即 ±30 秒):常见的默认值,能覆盖绝大多数时钟漂移
  • 正负 2 个以上:把重放窗口拉长到分钟级,除非你的用户群时钟普遍不准,否则不建议

用按时间出码面板把时钟前后拨几档,拿那些码去打自己的接口,就能实测出当前窗口到底开了多宽。

📍使用场景

  • 服务端说验证码不对,但用户说没输错把用户报的那个码粘进反查面板,它会告诉你这个码属于第几个时间窗、对应哪个时刻。落在正负一两个窗口就是时钟没同步,完全找不到才是密钥或参数不一致。
  • 对照自己实现的 TOTP 算法后端写完出码逻辑,用同一个密钥、同一个时间戳在这里算一遍,逐个时间步比对。位数、周期、算法、Base32 解码任何一环错了都能立刻定位。
  • 验证校验窗口开得够不够宽把时间戳前后拨几档,看看哪些码会被你的服务端接受。窗口太窄会误拒手机稍慢的用户,太宽则拉长了重放窗口。
  • 调试 HOTP 的计数器不同步HOTP 按次数递增,用户多点几下按钮客户端就跑到服务端前面去了。列出从某个 counter 开始的连续几个码,能直接看出对方停在哪一步。

常见问题

它和 TOTP 验证码那个工具有什么区别?

定位不同。TOTP 验证码页面是给普通用户的:粘密钥、拿当前的码,追求打开即会用。这一页是给正在实现两步验证的开发者的:指定任意时间戳、反查时间窗、模拟时钟偏移、HOTP 计数器——这些普通用户根本用不上,塞进那一页只会让它变复杂。

反查里的「时钟差」是怎么算的?

用匹配到的窗口偏移乘以周期。比如周期 30 秒、码落在 -2 窗口,就说明产生这个码的设备时间比你填的时间戳慢了 60 秒左右。注意这是个粗粒度估计:同一个窗口内的任何时刻算出来的码都一样,所以精度不会超过一个周期。

为什么反查说没匹配上?

按可能性从大到小排:① 密钥不对,或者 Base32 里混进了非法字符;② 参数不一致,对方用的是 SHA256、8 位或 60 秒周期;③ 时间差得太远,超出了搜索范围,可以把范围调到正负 120 个窗口再试;④ 那个码本来就是错的。先用按时间出码面板确认自己这边算出来的码长什么样,再回头查。

为什么用 Unix 时间戳而不是日期选择器?

因为调试时手边的东西就是时间戳——日志里、请求里、数据库里记的都是秒数。让你先把它转成年月日再选一遍,反而多绕一圈。旁边的正负三十秒按钮和现在按钮覆盖了最常用的几种拨动。

支持 SHA256 和 SHA512 吗?密钥能填 Hex 吗?

都支持。算法可选 SHA1/SHA256/SHA512,位数 6/7/8,周期 15/30/60 秒。密钥输入框左边可以切换 Base32、Hex、Base64 三种编码——不少自建服务发的是 Hex 密钥,展开密钥的其它编码形式还能看到三者的互转结果,点一下就复制。

密钥会上传吗?

不会。HMAC 计算用的是纯 JavaScript 实现,不依赖浏览器的 Web Crypto,全程在本机完成,不发任何网络请求。输入也不写入本地存储,刷新即清空。不过仍然请不要在这里填生产环境的真实密钥——调试用随机生成的就够了。