实用工具

TOTP 动态验证码生成器

由 Base32 密钥或 otpauth:// 链接算出当前和下一个两步验证码,也能为新账号生成配置链接和二维码。

浏览器本地运行哈希与加密1476
免费

输入

0 B

结果

结果会显示在这里。

开发或排查两步验证登录时,经常需要看到服务端此刻期望的验证码,又不想每次都掏手机。粘贴 Base32 密钥或完整的 otpauth:// 链接,这里会显示当前 30 秒窗口的验证码、还剩几秒,以及前后相邻两个窗口的码。输入留空时,会生成一个新的 160 位密钥和对应的 otpauth:// 链接,需要的话还能出一个身份验证器 App 可以直接扫的二维码。计算由 otpauth(hectorm/otpauth,MIT)完成,这是一个同时支持浏览器、Node、Deno 和 Bun 的 HOTP/TOTP 库,至今仍在维护。

它是怎么工作的

  • 按 RFC 6238 计算:Unix 时间除以周期得到计数器,用密钥对它做 HMAC-SHA1(或 SHA-256/512),再按 RFC 4226 的动态截断取 6 位或 8 位。
  • otpauth:// 链接自带算法、位数和周期,以链接为准、忽略下拉选项;只填 Base32 密钥时,由下拉选项和签发方、账号组装出链接。
  • 同时给出上一个验证码,因为多数服务端允许前后各一个周期的时钟偏差;如果手机上的码总等于「上一个」,通常是设备时间慢了。
  • 二维码预览编码的是完整的 otpauth:// 链接,只有打开开关时才调用 qrcode 库绘制。

你的数据去了哪里

哪也没去。本工具完全在你的浏览器里运行:你粘贴的文本由页面处理,不会传输到任何服务器,也不会写进任何日志。

本工具会接触密钥和凭证,因此任何一次运行都不会被保存,连你自己的历史里也不会有。

它要花多少

本工具完全免费,不需要登录,也不消耗积分。

常见问题

手机 App 上的验证码和这里不一样,为什么?
绝大多数是时间或参数问题。先确认手机开启了自动同步时间——慢 30 秒就会永远落后一个码。再核对算法、位数和周期:很多身份验证器 App 只认 SHA1、6 位、30 秒,遇到其他取值会悄悄忽略,于是服务端按 SHA-256 或 8 位配置时,App 显示的码会被拒绝。
TOTP 密钥应该多长?
RFC 4226 要求至少 128 位,推荐 160 位,也就是 32 个 Base32 字符,更短的会被标出。网上常见的演示密钥 JBSWY3DPEHPK3PXP 只有 80 位,千万不要用在真实账号上。
把真实账号的两步验证密钥贴在这里安全吗?
计算在页面内完成,不发送也不存储;但要清楚,密钥就是整个第二因素,拿到它的人可以永久生成有效验证码。在公用电脑上粘贴过的密钥应视为已泄露,有疑虑就重新绑定。二维码同理,它以明文包含了密钥,别截图发群。
otpauth:// 链接里都有什么?
格式来自 Google Authenticator 的 Key URI 文档:otpauth://totp/签发方:账号?secret=BASE32&issuer=签发方,可选 algorithm、digits、period 参数。签发方故意写两遍——标签里给老 App 看,参数里给新 App 看——这样两类 App 都能显示正确的名称。

背后的开源项目

本工具运行在 hectorm/otpauth 之上,以 MIT 许可发布。如果你需要在自己的程序里实现同样的能力,直接用这个库。

hectorm/otpauth

也常被称作

  • totp在线生成
  • 谷歌验证码在线
  • 两步验证码生成
  • otpauth链接
  • 2fa验证码
  • 动态口令