TOTP / 2FA 验证码生成器
从 Base32 密钥即时生成 TOTP/2FA 验证码 — 100% 在你的浏览器中运行,密钥绝不离开你的设备。支持二维码设置 + 验证码校验。免费,无需注册。
高级选项
什么是 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
粘贴一个 Base32 密钥
在「生成」标签页中,粘贴你的 Base32 密钥(例如 JBSWY3DPEHPK3PXP)。当前的 TOTP 验证码会立即出现并带有 30 秒倒计时 —— 无需生成按钮。
- 2
调整高级选项(可选)
打开高级选项可以更改算法(SHA-1/256/512)、位数(6 或 8)或周期(30 或 60 秒),以匹配你服务商签发的参数。
- 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 生成器使用起来安全吗?
otpauth:// URI 以及生成的验证码全都使用原生 Web Crypto API 在本地计算。没有任何网络请求、日志记录、存储,也没有与你输入相关的分析追踪 —— 你可以断开网络连接、观察工具仍能正常运行来验证这一点。这与那种把你的密钥 POST 到服务器的可疑生成器恰恰相反,在那种情况下,运营者可能永久地生成你的验证码。TOTP 密钥是一把长期有效的共享密钥,因此最安全的习惯依然是:当你只需要做实验时,优先使用一次性或测试密钥。 什么是 TOTP,什么是 Base32 密钥?
JBSWY3DPEHPK3PXP 就是著名的 RFC 测试密钥。 为什么生成的验证码和我手机身份验证器应用里的不一样?
TOTP 和 HOTP 有什么区别?
我可以使用 8 位验证码或 SHA-256 / SHA-512 吗?
otpauth:// URI 都会记录这些参数,以便你的应用正确录入密钥。 我如何把这个密钥添加到 Google Authenticator、Authy 或 1Password 里?
相关工具
查看所有工具 →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 哈希值 — 完全免费,浏览器本地运算,无需注册。支持文本和文件哈希、校验和验证、哈希值对比,一键复制,数据绝不离开你的设备。
随机密码生成器 — 自定义长度、强度与安全性
安全工具
免费在线随机密码生成器,一键生成高强度安全密码。支持自定义长度、字符类型,批量生成多个密码。所有密码仅在浏览器本地生成,不上传不存储。