ZH
我的工具

TOTP/HOTP 验证码生成器(两步验证)

根据 Base32 密钥或 otpauth:// 链接生成 TOTP 和 HOTP 一次性验证码(RFC 6238 / RFC 4226),支持 SHA-1/256/512、6–8 位,可指定任意时间。

服务在“无法扫描二维码?”下方显示的 Base32 密钥(空格和小写都可以),或二维码中完整的 otpauth:// 链接。
类型
留空表示使用当前时间。输入其他时间,可以查看那一刻的验证码(过去或未来)。
我的工具 →
广告

验证器应用里的六位验证码由两种公开算法生成:按计数递增的 HOTP(RFC 4226)和基于时钟的 TOTP(RFC 6238)。这个生成器接受与应用相同的 Base32 密钥(或二维码里的 otpauth:// 链接),显示当前、上一个和下一个验证码、剩余秒数以及相邻时间步的表格。可用来测试你自己的两步验证实现、检查某个时间点的验证码,或弄清验证码为何被拒绝。

使用方法

  1. 粘贴 Base32 密钥或完整的 otpauth:// 链接。
  2. 除非服务另有说明,保持 TOTP、SHA-1、6 位和 30 秒。
  3. 时间留空表示现在;输入 Unix 时间或 ISO 日期,可查看那一刻的验证码。
  4. 使用 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 输错了。

资料来源

最后更新:

引用此工具
APA

kakaoCalc. (2026, November 8). TOTP/HOTP 验证码生成器(两步验证). https://kakao.mobile/zh/tools/totp-generator/

MLA

“TOTP/HOTP 验证码生成器(两步验证).” kakaoCalc, 8 Nov. 2026, kakao.mobile/zh/tools/totp-generator/.

广告