TOTP/HOTP 验证码生成器(两步验证)
根据 Base32 密钥或 otpauth:// 链接生成 TOTP 和 HOTP 一次性验证码(RFC 6238 / RFC 4226),支持 SHA-1/256/512、6–8 位,可指定任意时间。
验证器应用里的六位验证码由两种公开算法生成:按计数递增的 HOTP(RFC 4226)和基于时钟的 TOTP(RFC 6238)。这个生成器接受与应用相同的 Base32 密钥(或二维码里的 otpauth:// 链接),显示当前、上一个和下一个验证码、剩余秒数以及相邻时间步的表格。可用来测试你自己的两步验证实现、检查某个时间点的验证码,或弄清验证码为何被拒绝。
使用方法
- 粘贴 Base32 密钥或完整的 otpauth:// 链接。
- 除非服务另有说明,保持 TOTP、SHA-1、6 位和 30 秒。
- 时间留空表示现在;输入 Unix 时间或 ISO 日期,可查看那一刻的验证码。
- 使用 HOTP 时,选择基于计数器的类型并输入计数器。
计算公式
HOTP(K, C) = Truncate(HMAC-SHA-1(K, C)) mod 10^d。TOTP 使用 C = floor((now − T0) / X),其中 T0 = 0(1970 年 1 月 1 日),X = 30 秒。
Truncate 取 HMAC 最后一个字节的低 4 位作为偏移量,从该处读取 4 个字节并清除最高位,得到一个 31 位的数;d 为位数。服务有要求时,用 SHA-256 和 SHA-512 代替 HMAC-SHA-1。计数器 C 写成 8 个字节,高位在前。
示例
RFC 6238 使用 ASCII 密钥 "12345678901234567890"、SHA-1 和 8 位。在 Unix 时间 59,时间步 T = 1,验证码为 94287082;在 1111111109(2005 年 3 月 18 日 01:58:29 UTC),T = 37037036,验证码为 07081804。同一个密钥写成 Base32 是 GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ,作为 HOTP 且计数器为 1 时得到 287082。
常见问题
把两步验证密钥粘贴到这里安全吗?
验证码在你的浏览器中计算,不会发送到任何地方,但密钥和密码一样敏感:拿到它的人都能生成你的验证码。请只在可信设备上用于测试和恢复,切勿分享密钥。
服务为什么拒绝我的验证码?
通常是设备时钟偏差超过一个时间步,或者设置不一致:大多数服务使用 SHA-1、6 位和 30 秒,其他取值会写在 otpauth:// 链接里。请查看“使用的时间”一行,并对照前一个和后一个验证码。
TOTP 和 HOTP 有什么区别?
TOTP 由时钟得出计数器,所以验证码在一个时间步后失效。HOTP 使用每次请求验证码就递增的计数器;服务器保存自己的计数器,并允许一个较小的向前窗口。
为什么密钥中的 0、1、8、9 会被拒绝?
Base32(RFC 4648)只使用 A–Z 和 2–7,所以 0 或 1 几乎总是把 O 或 I 输错了。
资料来源
最后更新:
包含这些输入的页面地址: https://kakao.mobile/zh/tools/totp-generator/
引用此工具
kakaoCalc. (2026, November 8). TOTP/HOTP 验证码生成器(两步验证). https://kakao.mobile/zh/tools/totp-generator/
“TOTP/HOTP 验证码生成器(两步验证).” kakaoCalc, 8 Nov. 2026, kakao.mobile/zh/tools/totp-generator/.