个人安全

TOTP/HOTP 代码生成器

本地运行

该工具本身是英文的;本页面将用您的语言对它进行说明。

使用 TOTP/HOTP 代码生成器

功能介绍

像身份验证应用那样,根据时间(TOTP)或计数器(HOTP)为 Base32 密钥生成一次性密码,并验证代码是否匹配。此功能可用于测试您自己的双因素认证(2FA)配置。

它完全在您的浏览器中运行:您输入的任何内容都不会被上传。

如何使用TOTP/HOTP 代码生成器

  1. 输入密钥. 把你自己测试账户的 Base32 密钥粘贴到 Secret key (Base32)(密钥)中,或按 Random(随机)生成一个 32 个字符的新密钥。
  2. 根据您的应用设置进行调整. 选择验证码类型(基于时间的TOTP或基于计数器的HOTP)、算法以及位数。大多数身份验证应用使用TOTP、HMAC-SHA-1和6位验证码。
  3. 显示代码. 对于 TOTP,请点击“开始 TOTP”:代码会随倒计时显示,并每秒重新计算一次。对于 HOTP,请设置计数器并点击“显示 HOTP 代码”;点击“下一步”将跳转到下一个计数器。
  4. 验证代码. 在“验证代码”中输入来自您的应用或服务器的代码,然后点击“验证”。验证结果将显示该代码是否匹配,以及匹配的是哪个时间步或计数器。
  5. 停止并清理. 操作完成后按“停止”键;屏幕上将保留最后一条代码。请自行清空隐藏字段。

示例

RFC 6238 测试密钥

输入
GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ
输出(捕获于2026-10-20)
412568

这是已发布的 RFC 6238 测试密钥 12345678901234567890 的 Base32 表示形式。 该页面显示了当前的六位数代码以及距离下一个代码还有多少秒,这与身份验证器应用对此密钥显示的代码一致;切换到计数器为 0 的 HOTP 模式后,页面显示 755224,这是 RFC 4226 的第一个测试值。

检查内容

信号其含义
代码时间步长(TOTP)或计数器(HOTP)的HMAC,根据RFC 4226和RFC 6238的规定截取为6位或8位。只有当类型、算法和位数完全一致时,才会与应用程序匹配。
以纳秒为单位的刷新 · 时间步长 N当前30秒时间窗口内剩余的秒数,以及根据设备时钟计算的步骤编号。如果时钟不准确,则会显示上一个或下一个代码。
计数器 N · 点击“下一步”在 HOTP 模式下,该代码属于该计数器。每个代码仅使用一次;随后,服务器将期待下一个计数器。
非Base32:...该密码包含 A–Z 和 2–7 以外的字符,例如 0、1、8 或 9。空格、连字符和 = 将被忽略,且允许使用小写字母。
密钥只有 N 位该密钥的长度短于 RFC 4226 要求的 128 位(26 个 Base32 字符)。虽然代码仍然会显示出来,但这样的密钥更容易被猜中。
有效:与……匹配验证字段中是否包含当前时间步的代码或HOTP计数器。
适用于上一步或下一步该代码对应于当前时间前后一个30秒的时间步长(以琥珀色显示)。通常两台设备之间存在微小的时差。
未找到匹配项无论是检查的时间步长还是计数器都不匹配。请检查密钥、时钟、算法和位数。

更多示例

RFC 4226 测试密钥,HOTP

输入
GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ
结果

当代码类型为 HOTP、HMAC-SHA-1、6 位数字且计数器为 0 时,代码为 755224;Next 给出的计数器为 1 时的值为 287082,这是 RFC 4226 中公布的测试值。

验证比当前位置前一个计数器的代码

输入
GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ
结果

在 HOTP 模式下,当计数器为 0 时,在“验证代码”中输入 287082 会显示:该代码对计数器 1 有效,比计数器字段大 1。

不是 Base32 密钥

输入
0189
结果

出现错误,提示信息为“非Base32格式:‘0’、‘1’、‘8’、‘9’”,因为Base32仅使用字母A–Z和数字2–7。

常见问题解答

它具体计算什么?

基于当前时间、以30秒为间隔生成的TOTP验证码(RFC 6238),或基于您设置的计数器生成的HOTP验证码(RFC 4226),采用HMAC-SHA-1、SHA-256或SHA-512算法,且长度为6位或8位; 大多数身份验证应用使用 SHA-1 和 6 位代码。验证时,系统会尝试当前时间步及其前后各一步的时间步,或 HOTP 计数器及其后续 9 个计数器;若密钥中包含 A-Z 以外的字母或 2-7 以外的数字,系统将显示提示信息并拒绝该密钥。

TOTP 验证码能防范钓鱼吗?

不能完全防范。中间人(Adversary-in-the-middle)钓鱼工具包会在你输入验证码时把它转发给真实网站,因此验证码会和密码一起被截获;通行密钥(passkey)和 FIDO2 安全密钥能抵御这种攻击,因为它们与真实域名绑定。

密钥会被发送或存储到任何地方吗?

不。验证码是在您的浏览器中通过 Web Crypto API 生成的,密钥绝不会被上传或保存。TOTP 依赖于您的设备时钟,因此如果时钟不准确,生成的验证码也会不同。

如何对照RFC规范核对这些代码?

使用测试密钥 12345678901234567890,其 Base32 表示形式为 GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ。 在 HOTP 模式下,计数器 0 的值为 755224,计数器 1 的值为 287082(RFC 4226)。 RFC 6238 列出了 1970 年 1 月 1 日 UTC 时间 59 秒后 8 位数的值 94287082;TOTP 模式始终使用当前时间。

TOTP 和 HOTP 之间有什么区别?

HOTP(RFC 4226)采用计数机制:每个代码都关联一个计数器,该计数器每次增加1。TOTP(RFC 6238)是HOTP的一种变体,其计数器被设置为当前30秒的时间步长,因此代码会随时间变化而变化。

为什么我的应用显示的验证码不同?

请先检查时钟,因为仅30秒的误差就会导致代码发生变化。然后检查密钥是否有拼写错误,以及该账户是使用SHA-256、SHA-512、8位数字,还是使用计数器代替时间,并在此处设置相同的选项。

我应该在这里粘贴真实的 2FA 密钥吗?

最好不要。密钥虽然只留在你的浏览器中,但任何看到或复制它的人,在你重置该账户的 2FA 之前都能生成你的验证码。要把 2FA 迁移到新手机,请使用该账户自身的转移或重置选项。

术语说明

PhishDestroy 研究