DevToolPal
简

TOTP / HOTP 验证码生成器

根据 Base32 密钥或 otpauth:// URI 生成双因素认证验证码(TOTP 和 HOTP),支持 SHA-1/256/512、6–8 位和实时倒计时。

本地处理,不上传

选项

类型
位数
时间步长

密钥(Base32)或 otpauth:// URI

验证码

结果会显示在这里

功能说明

Google Authenticator、Microsoft Authenticator、1Password 等双因素认证 App 显示的是每 30 秒变化一次的 6 位验证码。每个验证码都是根据共享密钥算出的一次性密码:TOTP(RFC 6238)基于时间,HOTP(RFC 4226)基于计数器。本工具用同样的方法根据密钥计算验证码,可用来测试双因素认证配置、调试服务器实现,或确认某一时刻的验证码应该是多少。

结果包括当前验证码和实时倒计时,以及上一个和下一个验证码(服务器常常也接受它们,以容忍少量时钟误差)。

使用方法

  1. 粘贴 Base32 密钥(字母 A–Z 和数字 2–7,空格和大小写不影响),或者粘贴二维码中的完整 otpauth:// URI。点击示例可以试用。
  2. 选择 TOTP 或 HOTP,并设置与账号一致的算法、位数和时间步长。otpauth URI 中的设置优先。
  3. 使用 HOTP 时输入计数器,点击计数器 +1 逐个查看验证码。
  4. 复制当前验证码,倒计时显示它还能用多久。

示例

演示密钥 JBSWY3DPEHPK3PXP 是字节 “Hello!” 加上 0xDEADBEEF 的 Base32 形式。下面这个 URI(就是二维码里编码的内容)描述了一个使用它、采用默认设置的账号:

otpauth://totp/Example:alice@example.com?secret=JBSWY3DPEHPK3PXP&issuer=Example&algorithm=SHA1&digits=6&period=30

在 Unix 时间 1700000000,这个密钥对应的验证码是 324 550,当前时间窗口还剩 10 秒。

验证码是怎么算出来的

先把 Base32 密钥解码成字节。TOTP 的计数器是以秒为单位的 Unix 时间除以时间步长后向下取整。计数器写成 8 个字节,用密钥做 HMAC 签名。动态截断根据 HMAC 结果最后半个字节选出其中 4 个字节,再对所需位数取模,保留前导零。

常见问题

› 为什么算出的验证码和身份验证器 App 里的不一样?

TOTP 依赖时钟,先确认设备时间是自动同步的。再确认算法、位数和时间步长与账号一致。大多数服务使用 SHA-1、6 位、30 秒;除非二维码里写明,身份验证器 App 会忽略其他设置。

› TOTP 和 HOTP 有什么区别?

TOTP(RFC 6238)用当前时间除以时间步长作为计数器,所以验证码每 30 秒变化一次。HOTP(RFC 4226)使用一个计数器,每用掉一个验证码就加一。两者都把密钥和计数器做 HMAC,再取最后 6 到 8 位数字。

› 我的密钥会被保存或发送出去吗?

不会。验证码在浏览器中通过 Web Crypto API 计算。密钥不会保存、不会写进地址栏,也不会包含在分享链接里,分享链接只带设置。不过双因素密钥等同于第二重验证本身,请只粘贴属于你自己的密钥。

› 能用它给自己的应用接入双因素认证吗?

可以。点击“随机密钥”生成一个 160 位的 Base32 密钥,把它放进 otpauth:// URI 或二维码交给用户,再把服务器算出的验证码和这里显示的对比。服务器通常还会接受上一个和下一个验证码,以容忍时钟误差。