TOTP 验证码生成器
输入密钥即可在浏览器中生成 TOTP 两步验证码,兼容 Google Authenticator 等应用
TOTP 验证码就是每 30 秒变化一次的 6 位两步验证码:验证器应用和服务器各自用同一份共享密钥和当前时间独立算出它(RFC 6238)。把开启两步验证时拿到的 Base32 密钥粘贴进来——或者粘贴二维码背后的整条 otpauth:// 链接——本页就会实时显示当前验证码、下一个验证码和倒计时圆环,全部计算都在你的浏览器里完成:密钥不发送、不保存、不记录。配套指南《TOTP 验证码是怎么算出来的》讲清了原理与时钟问题;其他凭据可以搭配密码与令牌生成器和SSH 密钥套件一起打理。
最后更新:
🔒 所有计算均在浏览器本地完成,密钥不会发送到任何服务器,也不会被保存。
正在与服务器时间比对你的时钟…
你的验证码
还没有账号。在上方添加一个密钥,它的验证码就会出现在这里,并按周期刷新。这里不保存任何东西——刷新页面列表就会清空。
先把边界说清
本页是给你已经拥有的验证码打个方便——手机在另一个房间充电,或者正把密钥从一个验证器应用迁移到另一个。它不是长期保管密钥的安全场所:粘贴进来的内容会留在这个标签页的内存里,直到你关掉它,而这台机器上的其他软件同样能读到内存。
验证码生成器是否可信,取决于它运行的设备和浏览器。对重要的账号,把密钥放在专门的验证器应用或你掌控的硬件密钥里;只在你信任的设备上使用本页,绝不要在共享或公共电脑上用。
TOTP 只能证明你在登录那一刻持有密钥;它保护不了一份已经泄露的密钥。如果密钥曾被贴进聊天、工单或服务器端生成器,就当它已经烧掉了:去服务里把两步验证关掉再重新打开,换一份新密钥。
什么时候该用浏览器里的 TOTP 生成器
最典型的场景是配置和迁移。开启两步验证时,服务会显示一个二维码,并在“无法扫码?”链接后面给出原始的 Base32 密钥。把密钥输到这里,把生成的验证码和验证器应用里的对比一致,就证明两台设备持有的是同一份密钥——不用等到退出登录后才发现对不上的尴尬。同样的检查也适用于给账号换手机:逐个重新读取密钥、添加到本页,逐窗口确认与旧应用的验证码一致。
另一个实用场景是手机不在手边、但密钥妥善存在你的密码管理器里:取出密钥、在这里生成验证码、完成登录——不必为了应急去关掉两步验证、削弱账号。从 Google、GitHub 到 AWS 和你的域名注册商,所有服务用的都是同一套 RFC 6238 方案,所以一个生成器就能覆盖你持有密钥的每一个账号。
二维码里到底装了什么
每个验证器二维码都只是一行文本:一条 otpauth:// URI,装着密钥、发行方、你的账号名和验证码参数(算法、位数、周期)。这正是本页能接受整条链接的原因——粘贴进来,每个字段都会自动填好。也正因为如此,配置二维码的截图和密码本身一样敏感:扫到它的人就永久复制了你的第二因素。绝不要分享配置截图,也记得把它们从同步相册里删掉。
验证码能否被接受,取决于两个细节。第一是时钟:生成方和服务器必须落在同一个 30 秒窗口内,多数服务器只宽容前后各一个窗口,时钟差上一分钟就会次次失败。第二是参数:多数服务用 SHA-1、6 位、30 秒,但也有用 8 位或 60 秒周期的——如果这里的验证码始终对不上服务,就对照它配置页面写明的参数检查高级设置。
TOTP 术语,一次说清
TOTP. 基于时间的一次性密码(RFC 6238):对时间步计数器做 HMAC,再动态截断成一串短数字验证码。
HOTP. 基于计数器的父算法(RFC 4226)。TOTP 就是把计数器换成“自 Unix 纪元起的周期数”的 HOTP。
Base32. 多数 2FA 密钥使用的字母表(A–Z 和 2–7)。32 个字符的密钥装着 20 字节、即 160 位的密钥材料。
otpauth://. 每个配置二维码里装的 URI 格式:类型、标签、密钥、发行方、算法、位数和周期,全在一行里。
时间步. 通常是 30 秒。生成方和服务器必须落在同一时间步内;多数服务器还会接受前后各一个时间步。
动态截断. 把 20 多字节的 HMAC 变成短验证码的那一步:按摘要最后一个半字节给出的偏移,切出 4 个字节。
SHA-1. 至今仍是 TOTP 默认的 HMAC 哈希。这个构造在这里依然成立,因为 HMAC 的安全性不依赖抗碰撞性。
备用代码. 服务在配置时发的一次性恢复代码。它们完全绕过 TOTP——请像密码一样保管,且绝不要和密钥放在一起。
时钟偏差. 设备时钟与真实时间之间的差距。偏差超过一个周期,密钥再正确,生成的验证码也会全错。
常见问题
在浏览器里生成 2FA 验证码安全吗?
在本页,密钥不会离开你的浏览器:验证码用 WebCrypto 在页面内存中计算,不上传、不保存、不记录,刷新即清除密钥。不安全的模式是服务器端生成器——你的密钥会穿过网络,躺进别人的日志和数据库。即便在本地,也请只用你信任的设备——密钥的安全性取决于输入它的那台机器。
为什么我的验证码会被拒绝?
最常见原因是时钟:如果生成验证码的设备与服务器对当前 30 秒窗口的判断不一致,每个码都是错的。看本页的时钟卡,并打开自动设置日期与时间。接下来怀疑参数(有的服务用 8 位或 60 秒周期)和过期密钥——如果你重新开启过两步验证,旧密钥在那一刻就作废了。
TOTP 和 HOTP 有什么区别?
区别在计数器。HOTP(RFC 4226)每用一次就把计数器加一;TOTP(RFC 6238)从时钟推导计数器,所以验证码会自己过期。验证器应用和本页用的都是 TOTP。基于计数器的 HOTP 链接确实存在,但本页会明确拒绝它,而不是编一个验证码出来。
它能替代我的验证器应用吗?
页面打开期间,它生成的验证码完全一致——算法是同一套。但作为长期住所不行:这里按设计不持久保存任何东西,浏览器标签页也不是长命密钥该待的地方。把密钥留在验证器应用或密码管理器里,本页用于配置检查、迁移和应急。
我曾经把密钥贴进过聊天框,怎么办?
把它当作已经泄露。聊天记录会被记录、同步和搜索,拿到密钥的人可以永远生成你的验证码。去服务里把两步验证关掉再重新打开,换一份新密钥、重新绑定验证器,并检查账号的近期活动。然后用密码泄露检查顺手查一下密码本身。