Skip to content

TOTP / 2FA 验证码生成器

从 Base32 密钥即时生成 TOTP/2FA 验证码 — 100% 在你的浏览器中运行,密钥绝不离开你的设备。支持二维码设置 + 验证码校验。免费,无需注册。

无追踪 浏览器中运行 免费
在你的浏览器中本地计算 —— 你的密钥绝不离开你的设备
高级选项
当前验证码
------
下一个验证码: ------
遵循 RFC 6238 / RFC 4226 行为,输出已与已发布的测试向量及一个独立的身份验证器应用交叉核验 — Go Tools 安全团队 · 2026年6月12日

什么是 TOTP / 2FA 验证码生成器?

TOTP 生成器把一把共享密钥转换成驱动双因素认证的那个轮换的一次性验证码。TOTP —— 基于时间的一次性密码,定义于 RFC 6238 —— 接收一个 Base32 密钥和当前时间,把时间划分为固定步长(默认 30 秒),并对步数计数器运行 HMAC 以推导出一个短数字验证码。由于你的身份验证器应用和服务器持有相同的密钥、读取相同的时钟,它们无需通过网络交换便能算出完全相同的验证码。这正是 2FA 的全部意义:即使你的密码泄露,攻击者仍然需要那个只有你的密钥才能在此刻生成的验证码。

「TOTP 算法是 HOTP 算法的一种基于时间的变体……TOTP = HOTP(K, T),其中 T 是一个整数,表示初始计数器时间 T0 与当前 Unix 时间之间的时间步数。」—— RFC 6238,第 4 节

本工具在一个页面上完成三件事。它从任意 Base32 密钥生成一个带倒计时和下一个验证码预览的实时验证码;它设置一个全新的密钥,构建 otpauth:// URI 和你扫描进身份验证器应用的二维码;它还以 ±1 时间步的容差验证某个验证码是否匹配密钥,与真实服务器接受刚刚轮换过的验证码的方式一致。所有这一切都通过浏览器原生的 Web Crypto API 运行,零依赖、零网络调用。

开发者经常用到 TOTP 生成器:在调试 2FA 登录时重现用户应用显示的确切验证码、为新账户生成密钥和二维码、确认服务器上的验证窗口与用户体验一致,或为双因素流程的端到端测试构建确定性的测试夹具。由于密钥是一把长期有效的密钥 —— 任何持有它的人都能生成未来的每一个验证码 —— 它必须像密码一样受到保护。把本工具与我们的随机密码生成器搭配使用,以生成 2FA 旁边的强密码和恢复码;当你需要一张独立的录入图片时,则搭配二维码生成器。要为常常附着在已认证会话之上的 JSON Web Token 签名,请参见 JWT 编码器

// Generate a TOTP code in the browser with the Web Crypto API
// (SHA-1, 6 digits, 30s period — RFC 6238 defaults)
async function generateTotp(base32Secret, time = Date.now()) {
  // Decode the Base32 secret to raw bytes (A-Z, 2-7)
  const alpha = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
  let bits = '';
  for (const c of base32Secret.replace(/=+$/, '').toUpperCase())
    bits += alpha.indexOf(c).toString(2).padStart(5, '0');
  const bytes = new Uint8Array(
    bits.match(/.{8}/g).map((b) => parseInt(b, 2)));

  // Counter = number of 30s steps since the Unix epoch (8-byte big-endian)
  const counter = Math.floor(time / 1000 / 30);
  const msg = new Uint8Array(8);
  let c = counter;
  for (let i = 7; i >= 0; i--) { msg[i] = c & 0xff; c = Math.floor(c / 256); }

  const key = await crypto.subtle.importKey(
    'raw', bytes, { name: 'HMAC', hash: 'SHA-1' }, false, ['sign']);
  const hmac = new Uint8Array(await crypto.subtle.sign('HMAC', key, msg));

  // Dynamic truncation (RFC 4226) -> 6-digit code
  const off = hmac[hmac.length - 1] & 0x0f;
  const bin = ((hmac[off] & 0x7f) << 24) | (hmac[off + 1] << 16) |
              (hmac[off + 2] << 8) | hmac[off + 3];
  return (bin % 1_000_000).toString().padStart(6, '0');
}

const code = await generateTotp('JBSWY3DPEHPK3PXP');
// -> a 6-digit code that rotates every 30 seconds

核心功能

带倒计时的实时验证码

粘贴一个 Base32 密钥,当前的 TOTP 验证码会立即出现,带有 30 秒倒计时环以及下一个验证码的预览 —— 无需生成按钮,无需等待。

密钥与二维码设置

生成一个随机 Base32 密钥,随后获得 otpauth:// URI 和一个可直接扫描进 Google Authenticator、Authy 或 1Password 的二维码。

内置验证码校验器

以与真实服务器相同的 ±1 时间步容差对照密钥校验某个验证码,因此刚刚轮换过的验证码依然有效。

可配置算法与位数

在 SHA-1、SHA-256 和 SHA-512 之间切换,选择 6 位或 8 位,并设置 30 秒或 60 秒周期,以匹配任何服务商的要求。

密钥绝不离开你的浏览器

每个验证码都通过原生 Web Crypto API 在本地计算。没有任何东西被上传、记录或存储 —— 这一点可验证,即使离线也成立。

零依赖

仅基于浏览器的 Web Crypto API 构建 —— 没有第三方库、没有遥测,也没有任何形式的网络调用。

TOTP 生成器示例

标准 6 位 TOTP(SHA-1,30 秒)

secret: JBSWY3DPEHPK3PXP
algorithm: SHA-1
digits: 6
period: 30s
Code: 282760  ·  expires in 30s

这是经典的 RFC 6238 测试密钥,使用所有主流应用都采用的默认设置 —— SHA-1、6 位数字、30 秒周期。验证码基于时间,因此具体数值取决于当前时间;工具会显示实时倒计时以及下一个验证码。

8 位企业级 TOTP(SHA-256)

secret: JBSWY3DPEHPK3PXP
algorithm: SHA-256
digits: 8
period: 30s
Code: 31094217  ·  expires in 30s

一些企业和高安全性系统会签发使用 SHA-256(而非默认的 SHA-1)的 8 位验证码。算法、位数和周期必须与服务器期望的完全一致,否则生成的验证码将无法通过校验。

用于身份验证器应用的 otpauth:// 设置 URI

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

工具会构建标准的 otpauth:// URI 并将其渲染为二维码。用 Google Authenticator、Authy 或 1Password 扫描它 —— 或直接粘贴该 URI —— 即可将密钥录入你的设备。

如何使用 TOTP 生成器

  1. 1

    粘贴一个 Base32 密钥

    在「生成」标签页中,粘贴你的 Base32 密钥(例如 JBSWY3DPEHPK3PXP)。当前的 TOTP 验证码会立即出现并带有 30 秒倒计时 —— 无需生成按钮。

  2. 2

    调整高级选项(可选)

    打开高级选项可以更改算法(SHA-1/256/512)、位数(6 或 8)或周期(30 或 60 秒),以匹配你服务商签发的参数。

  3. 3

    设置或验证

    使用「设置」标签页为身份验证器应用生成密钥和二维码,或使用「验证」标签页以 ±1 时间步的容差对照密钥校验某个验证码。

常见错误

算法或位数不匹配

为 SHA-256 或 8 位签发的密钥在 SHA-1 / 6 位默认设置下会生成完全不同的验证码。请精确匹配服务商的参数。

✗ 错误
secret + SHA-1/6 digits  // but server expects SHA-256/8
✓ 正确
algorithm: SHA-256, digits: 8  // match the otpauth:// URI

时钟漂移

如果设备时钟相差超过一个时间步,验证码将无法通过校验。在比较验证码前请同步系统时钟。

✗ 错误
system clock 90s fast  // code is two steps ahead
✓ 正确
enable NTP / automatic time  // code aligns with server

无效的 Base32 密钥

Base32 只使用 A–Z 和 2–7。打印密钥中的空格没问题,但 0、1 或 8 不是有效的 Base32,会解码失败。

✗ 错误
secret: "JBSW 0NE8"  // contains 0 and 8
✓ 正确
secret: "JBSWY3DPEHPK3PXP"  // valid Base32

常见用例

调试 2FA 登录流程
重现用户身份验证器应用显示的确切验证码,从而追踪双因素登录被拒绝的原因。
录入新账户
生成一个全新的 Base32 密钥和二维码,然后把它扫描进 Google Authenticator、Authy 或 1Password 来设置 2FA。
验证服务器的窗口
对照密钥验证验证码,以确认你的后端接受刚刚轮换过的验证码并拒绝已过期的验证码。
构建端到端测试夹具
从已知密钥计算确定性的 TOTP 验证码,以驱动双因素认证流程的自动化测试。
匹配企业设置
当服务商偏离 SHA-1 / 6 位默认设置时,重现 8 位或 SHA-256 验证码,以调试不匹配问题。
快速恢复访问
当手机不可用时,从备份的密钥生成当前验证码 —— 使用密钥的一次性副本。

技术细节

符合 RFC 6238 / RFC 4226
在 RFC 4226 的 HOTP 动态截断算法之上按 RFC 6238 实现 TOTP,可选 SHA-1、SHA-256 和 SHA-512。
原生 Web Crypto HMAC
验证码通过 crypto.subtle HMAC 对大端序的时间步计数器推导得出。Base32 解码和截断完全在浏览器中运行。
标准 otpauth:// URI,零依赖
设置 URI 遵循 Key Uri Format(otpauth://totp),带有颁发者、算法、位数和周期参数。没有外部库,没有网络调用。

最佳实践

把密钥当作密码对待
任何持有 Base32 密钥的人都能生成未来的每一个验证码。把它存放在密钥管理器中,绝不要放进源代码控制,并在此处优先使用测试密钥。
保持时钟同步
TOTP 依赖准确的时间。在服务器和设备上启用网络时间同步,使验证码落在验证窗口之内。
除非必要否则坚持默认设置
SHA-1、6 位数字和 30 秒周期能最大化应用兼容性。仅在服务商强制要求时才切换为 8 位或 SHA-256/512。

TOTP / 2FA 生成器常见问题

在线 TOTP / 2FA 生成器使用起来安全吗?
用这个工具,是安全的 —— 原因在于任何数据都不会离开你的浏览器。你输入的 Base32 密钥、otpauth:// URI 以及生成的验证码全都使用原生 Web Crypto API 在本地计算。没有任何网络请求、日志记录、存储,也没有与你输入相关的分析追踪 —— 你可以断开网络连接、观察工具仍能正常运行来验证这一点。这与那种把你的密钥 POST 到服务器的可疑生成器恰恰相反,在那种情况下,运营者可能永久地生成你的验证码。TOTP 密钥是一把长期有效的共享密钥,因此最安全的习惯依然是:当你只需要做实验时,优先使用一次性或测试密钥。
什么是 TOTP,什么是 Base32 密钥?
TOTP(基于时间的一次性密码,定义于 RFC 6238)是身份验证器应用中那些轮换的 6 位验证码背后的算法。它通过 HMAC 将共享密钥与划分为固定步长(通常为 30 秒)的当前时间结合起来,生成一个短验证码,你的设备和服务器都能各自独立地算出它。密钥就是那把共享密钥,它几乎总是写成 Base32 —— 大写字母 A–Z 和数字 2–7 —— 因为这套字母表不区分大小写,并且便于输入或编码进二维码。字符串 JBSWY3DPEHPK3PXP 就是著名的 RFC 测试密钥。
为什么生成的验证码和我手机身份验证器应用里的不一样?
两个 TOTP 验证码要一致,必须有四样东西匹配。第一,时钟:TOTP 依赖当前时间,因此如果你的电脑或手机时钟相差超过一个步长,验证码就会偏离 —— 同步系统时钟后再试。第二,算法:本工具默认使用 SHA-1(大多数应用所用),但如果你的密钥是为 SHA-256 或 SHA-512 签发的,你必须在这里也选择相应算法。第三,位数和周期:6 位与 8 位,或 30 秒与 60 秒窗口,会产生完全不同的验证码。第四,密钥本身 —— 一个 Base32 字符输错就会改变每一个验证码。把这四样都对齐,验证码就会一致。
TOTP 和 HOTP 有什么区别?
两者都出自同一个基于 HMAC 的一次性密码家族,但驱动验证码的因素不同。HOTPRFC 4226)是基于计数器的:每个验证码都绑定到一个递增的计数器,因此验证码在被使用、计数器推进之前一直有效。TOTP(RFC 6238)是基于时间的:它用划分为固定步长的当前时间取代计数器,因此验证码每 30 秒自动轮换一次。TOTP 本质上就是把计数器设为自 Unix 纪元以来的时间步数的 HOTP。本工具生成 TOTP,这正是 Google Authenticator、Authy 和 1Password 默认使用的。
我可以使用 8 位验证码或 SHA-256 / SHA-512 吗?
可以。打开高级选项,把算法切换为 SHA-256 或 SHA-512,把位数设为 8,或把周期改为 60 秒。这些开关之所以存在,是因为某些企业和银行系统要求更长的验证码或更强的哈希。话虽如此,绝大多数服务 —— 以及所有主流的消费级身份验证器应用 —— 都使用 SHA-1、6 位数字、30 秒周期的默认设置,因此除非你的服务商的设置说明另有要求,否则请保持原样。无论你如何选择,工具生成的 otpauth:// URI 都会记录这些参数,以便你的应用正确录入密钥。
我如何把这个密钥添加到 Google Authenticator、Authy 或 1Password 里?
切换到设置标签页来生成(或粘贴)一个密钥,然后扫描二维码或复制 otpauth:// URI。在 Google Authenticator 或 Authy 中,点击添加按钮并选择扫描二维码把摄像头对准屏幕上的二维码,或选择输入设置密钥并粘贴 Base32 密钥及对应的账户名和算法。在 1Password 中,编辑一个登录项,添加一个一次性密码字段,然后直接粘贴 otpauth:// URI。需要一张独立的二维码图片用于文档?可以使用我们的 二维码生成器,而对于其周边的随机密钥和恢复码,则可使用随机密码生成器

Bcrypt 哈希生成器与验证器

安全工具

在线生成并验证 bcrypt 密码哈希——可调成本因子,支持 $2b$/$2a$/$2y$ 前缀。100% 在浏览器中运行,密码绝不上传。

JWT 解码器 · 在线解码工具

安全工具

免费 JWT 解码器,在线即时解码 JWT 令牌。查看头部、载荷、签名以及过期时间、算法和声明详情。100% 浏览器本地运行——令牌绝不离开你的设备。无需注册、无跟踪。

JWT 编码器与生成器

安全工具

免费在线 JWT 生成器与编码器。构建头部和载荷,使用 HS256、RS256 或 ES256 即时签名。100% 浏览器本地运行——你的密钥和私钥绝不离开设备。

免费 JWT 密钥生成器 — HS256/384/512

安全工具

为 HS256/384/512 生成强壮、符合 RFC 规范的 JWT 密钥——100% 在浏览器中运行,绝不发往服务器。支持 base64url、base64 或 hex,可复制到 .env。

在线 MD5 哈希生成器与文件校验工具

安全工具

在线生成 MD5、SHA-256、SHA-1、SHA-512 哈希值 — 完全免费,浏览器本地运算,无需注册。支持文本和文件哈希、校验和验证、哈希值对比,一键复制,数据绝不离开你的设备。

随机密码生成器 — 自定义长度、强度与安全性

安全工具

免费在线随机密码生成器,一键生成高强度安全密码。支持自定义长度、字符类型,批量生成多个密码。所有密码仅在浏览器本地生成,不上传不存储。