祈灵工具箱

🗝️TOTP 动态验证码生成器 - 2FA 双因素认证密钥与二维码测试

开发两步验证(2FA)功能时,需要一个能随时对照的验证码生成器:粘贴 Base32 密钥,或者直接粘贴 otpauth://totp/… 链接(会自动读取发行方、账户、算法、位数和步长),就能看到当前验证码、倒计时圆环以及上一个和下一个验证码,方便排查服务器与手机时间不同步的问题。算法支持 SHA-1、SHA-256、SHA-512,位数 6~8 位,时间步长可自定义;也支持基于计数器的 HOTP。需要给新账户开通 2FA 时,可以一键生成随机密钥,得到标准的 otpauth:// 链接和二维码,用 Google Authenticator、Microsoft Authenticator、1Password 等 App 扫码即可。还能输入用户提交的验证码,在 ±N 个时间步的容差窗口内校验,并告诉你匹配的是哪一步。计算使用浏览器 WebCrypto 的 HMAC,通过 RFC 6238 与 RFC 4226 的全部测试向量;“使用指定时间”可以直接复现 RFC 里的例子。密钥只在本页内存中,不上传、不保存,但仍不建议在公用电脑上粘贴真实的生产密钥。

免费 · 无需注册 · 浏览器本地处理最后更新:

正在加载工具...

如何使用TOTP 动态验证码

  1. 1粘贴 Base32 密钥或 otpauth:// 链接,或点击“生成随机密钥”
  2. 2按需调整算法、位数、时间步长,查看当前、上一个、下一个验证码
  3. 3复制 otpauth 链接或扫描二维码,在“验证一个验证码”里测试容差窗口

常见问题

为什么我算出的验证码和手机 App 上的不一样?
最常见的原因是时间不同步:TOTP 用当前时间除以步长(通常 30 秒)作为计数器,电脑或手机时钟偏差超过一个步长,验证码就会不同,可以对照“上一个 / 下一个”验证码判断偏差方向。其次检查算法和位数:大多数 App 只支持 SHA-1、6 位、30 秒,使用 SHA-256/512 或 8 位时部分 App 会忽略参数。
otpauth:// 链接的格式是什么?
标准格式是 otpauth://totp/发行方:账户?secret=BASE32密钥&issuer=发行方&algorithm=SHA1&digits=6&period=30。secret 必填,其余可省略(默认 SHA1、6 位、30 秒);HOTP 把 totp 换成 hotp,并用 counter 参数代替 period。工具生成的链接就是这种格式,二维码里装的也是这串链接。
服务器校验时容差窗口应该设多大?
一般设为 ±1 步(前后各 30 秒)即可兼顾时钟误差和用户输入耗时,RFC 6238 也建议不超过一个步长的网络延迟。窗口越大,被暴力猜中的概率越高。另外要记录已经用过的时间步,防止同一个验证码在有效期内被重复使用。
在这里粘贴密钥安全吗?
所有计算都在浏览器本地完成,密钥不会发送到任何服务器,也不会写入本地存储,关闭页面即消失。但 TOTP 密钥等同于第二个密码,任何能看到屏幕、截图或剪贴板的人都能生成验证码,所以不要在公用或他人的电脑上处理真实的生产密钥,测试时最好使用新生成的随机密钥。