TOTP / HOTP 双因素验证码生成器
加密从 Base32 密钥或 otpauth:// URI 生成基于时间(TOTP)或计数器(HOTP)的一次性密码。实时倒计时与可扫描二维码——全部在浏览器本地处理。
不获取远程 URL;请直接粘贴你的 JSON。
可用 Google Authenticator、Authy、1Password 等任意 TOTP 应用扫描。
本页内容
什么是 TOTP?#
基于时间的一次性密码(TOTP),就是你认证器 App 里每个账号旁边那个不断轮换的 6 位数字。它本质上是一个 HMAC:把共享密钥和当前时间窗口一起哈希,再把结果截成一段短数字码。因为依赖于时钟,它每 30 秒会自行滚动——这正是「你拥有的东西」(那把密钥)能在无需手机与服务之间任何网络往返的情况下、充当第二因素的原因。
本页是一个完整可用的 TOTP 与 HOTP 生成器。TOTP 从当前时间派生验证码,并随周期流逝自行刷新;HOTP 则从一个「每次使用后递增的计数器」派生。你可以直接输入 Base32 密钥,也可以粘贴一段 otpauth:// URI(开启 2FA 时服务给你看的二维码里编码的就是这串),让所有字段自动填好。本页还会产出规范的 otpauth:// URI 并渲染可扫描的二维码,方便你直接在这里把一个新账号配进手机 App。
一切都在本地运行:密钥绝不离开本页,也无需向任何认证服务发起在线请求。
怎么使用#
- 选择模式:TOTP(基于时间,自行刷新)或 HOTP(基于计数器,手动推进)。
- 提供密钥。要么把 Base32 密钥粘进 secret 字段,要么把
otpauth://URI 粘进 URI 字段,一次性自动填好全部参数。 - 填写 issuer 与 account 标签(这俩只影响该条目在认证器 App 里的命名,不影响验证码本身)。
- 选择 algorithm(SHA-1 / SHA-256 / SHA-512,SHA-1 是通用默认)、digits(6 / 7 / 8,6 是标准),以及——TOTP 下——以秒为单位的 period(默认 30)。HOTP 下设置 counter,并在每次使用后点 +1 推进。
- 点 Generate。验证码以大号字体出现,并配有倒计时环显示当前周期还剩几秒;下方是
otpauth://URI 与可扫描的二维码。
核心特性#
- TOTP 与 HOTP 同处一屏。 在基于时间与基于计数器两种变体之间切换,无需重新输入密钥。
- 宽容的 Base32 处理。 空格、连字符、小写、杂散字符都会被自动清理,从各种奇怪格式复制来的密钥照样能用。
- URI 导入与导出。 粘贴
otpauth://URI 一次性填满所有字段,或复制生成的 URI 去别处配账号。 - 实时二维码。 由 URI 在页面内渲染,扫进任何认证器 App 即可。
- 倒计时环。 用图形显示距离下次滚动还有多久,让你判断即将输入的验证码是否还有足够时间。
- 零上传。 生成、解析、渲染二维码全部本地完成,密钥绝不外发。
实战示例#
RFC 6238 的参考种子是 ASCII 串 12345678901234567890,对应 Base32 为 GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ。输入该密钥,设置 digits 8、period 30,验证码将与公开的测试向量完全吻合:
- SHA-1,时刻 = 纪元后第 59 秒 →
94287082 - SHA-256,同一时刻 →
46119246 - SHA-512,同一时刻 →
90693936
在时刻 = 1111111109(遥远未来的某个时间点),SHA-1 给出 07081804。这些正是本工具自身测试套件所校验的已知答案,因此是确认一个生成器正确与否的可靠依据。日常 2FA 场景下,服务普遍用 6 位、SHA-1、30 秒周期——把 digits 切回 6,同一把密钥就会产出认证器 App 会显示的那种滚动验证码。
常见问题#
我算出来的码和手机 App 对不上,哪里出了问题?#
几乎总是密钥或时钟的问题。首先确认 Base32 密钥完全一致——从服务的设置页重新复制一次,因为错一个字符就全变了。然后核对参数:多数服务用 SHA-1、6 位、30 秒周期;如果服务用的是 SHA-256 或 8 位,而你这头选的是 SHA-1 / 6 位,码自然对不上。最后,确保设备时钟准确——TOTP 能容忍一点偏差,但偏离约 30 秒以上就会失效。
TOTP 和 HOTP 有什么区别?#
TOTP 用「当前时间」作为推进因子,所以它每个周期自动滚动。HOTP 用一个简单计数器,每消费一个码就加一,因此双方必须就「已经用了多少个码」保持同步。如今几乎所有的消费者 2FA 都用 TOTP,因为除了时钟之外它不需要任何同步。
把密钥放进网页安全吗?#
密钥绝不离开本页——生成、解析、渲染二维码全部在浏览器本地完成,没有任何网络请求。话虽如此,对于你自有的生产级 2FA 密钥,最稳妥的做法是在你完全信任的环境里生成并保存,而不是粘进任何网页;同时务必妥善保管服务给你的恢复码。
为什么粘贴 otpauth:// URI 就能把所有字段填好?#
因为认证器 App 之间交换的就是这种标准格式:它把类型、issuer、account、密钥、算法、位数、周期(或计数器)编码进一串字符串。解析器把这些字段读出来填进表单,这与你用手机扫二维码是完全一样的事——二维码就是这段 URI 被渲染成了图像。