在线 2FA 验证码生成器:浏览器本地计算 TOTP,支持密钥与验证器链接
调试自己应用的二步验证,或者核对验证器配置时,不一定需要安装一个新应用。本页提供可以直接使用的 TOTP 验证码生成器:输入 Base32 密钥或 otpauth://totp/ 链接,在浏览器中计算当前验证码,并按周期刷新。
页面形式参考 2fa.run,代码为本站独立实现,不调用该站接口。面向普通用户和开发者,默认采用 SHA1、6 位、30 秒;也支持手动调整参数。
先点击公开示例,不要直接粘贴重要账户的真实密钥。 本地计算不等于没有风险;重要账户优先使用可信验证器或通行密钥。
1. 在线工具:输入密钥,生成验证码
工具区不加载第三方脚本;嵌入版本限制在沙箱中。若浏览器拦截嵌入工具或剪贴板,请使用独立页面,或下载后在 localhost 运行。博客页面本身可能包含统计、广告等资源,不能把整篇博客说成完全无网络请求。
方法一:使用 Base32 密钥
- 点击“公开示例”,先确认可以显示验证码和倒计时。
- 仅在可信环境中输入属于自己的 Base32 密钥。它是开启二步验证时提供的长期密钥,不是登录密码,也不是手机短信。
- 如账户使用特殊参数,展开“高级设置”,选择算法、6/8 位及周期,再点击“生成验证码”。
- 使用当前验证码;临近刷新时可等下一个周期。用完点击“清除”。
下面是公开测试密钥,不能用于真实账户:
GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ
方法二:粘贴验证器链接
也可以输入这种格式的公开示例:
otpauth://totp/Bobobk:demo?secret=GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ&issuer=Bobobk&algorithm=SHA1&digits=6&period=30
链接内的 algorithm、digits 和 period 优先于手动设置;未指定时回到 SHA1、6 位、30 秒。支持 SHA1、SHA256、SHA512,周期限 1–300 秒。工具不扫描二维码,不支持 otpauth://hotp/、短信验证码或推送确认。
把验证器链接粘贴到工具输入框,不要放进浏览器地址栏,也不要附在本页 URL 后面。 本页没有通过网址传入密钥的功能。
2. 准备:在自己的电脑上运行
在线使用不需要安装依赖;需要支持 Web Crypto 的现代浏览器,并通过 HTTPS 访问。Web Crypto 的 sign() 接口用于 HMAC 计算,受安全上下文限制。
希望检查源码或在本机使用时,安装 Python 3,在一个新目录执行:
mkdir bobobk-2fa-demo
cd bobobk-2fa-demo
curl -fS https://www.bobobk.com/downloads/online-2fa-totp.zip -o online-2fa-totp.zip
python3 -m zipfile -e online-2fa-totp.zip .
python3 -m http.server 8000 --bind 127.0.0.1 --directory online-2fa
打开 http://127.0.0.1:8000/?lang=cn。停止服务用 Ctrl+C。运行包只含 HTML、CSS 和 JavaScript,不需要 npm、CDN 或后端接口;下载和本机资源加载完成后,验证码计算不需要联网。使用 localhost 比直接双击 HTML 更容易避免浏览器的本地文件限制。
3. 实现:密钥和时间怎样变成验证码
TOTP 使用共享密钥和时间步生成短期验证码,默认时间步为 30 秒,具体定义见 RFC 6238。本工具在 core.js 中解码 Base32,调用 Web Crypto 进行 HMAC,再做动态截断;ui.js 负责输入、刷新和显示。
想独立核对算法,可以运行以下 Python 标准库示例。这里固定时间为 Unix 时间戳 59,固定使用公开密钥、SHA1、8 位和 30 秒,不是当前登录验证码:
import base64
import hashlib
import hmac
import struct
secret = "GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ"
timestamp = 59
period = 30
digits = 8
key = base64.b32decode(secret)
counter = struct.pack(">Q", timestamp // period)
digest = hmac.new(key, counter, hashlib.sha1).digest()
offset = digest[-1] & 0x0F
value = int.from_bytes(digest[offset:offset + 4], "big") & 0x7FFFFFFF
print(str(value % (10 ** digits)).zfill(digits))
4. 验证:先核对测试向量,再核对账户设置
上面的程序应输出:
94287082
这是 RFC 6238 附录 B 的 SHA1 测试值。同样参数改为 6 位得到 287082。在线工具使用当前系统时间,直接点击公开示例不会一直显示这个固定值。
核对真实配置时,在相同时间、相同密钥、相同算法、位数和周期下,与原验证器比较。可以再检查:
- 倒计时归零后自动刷新,不需要再次提交。
- 修改输入或设置后,旧验证码立即消失,必须重新生成。
- “清除”移除本页输入和输出;刷新后不自动载入密钥。
- 用公开示例打开开发者工具 Network 面板,清空资源记录,再生成验证码:计算过程不应产生新的请求。不要截图或导出含真实密钥的调试信息。
5. 排错与安全边界
| 问题 | 处理方法 |
|---|---|
| 提示输入无效 | 检查是否为 Base32 密钥或 TOTP 链接,而非密码、短信、二维码图片;字母不区分大小写,允许空白,不接受任意符号。 |
| 验证码与手机不同 | 校准电脑和手机时间,核对算法、位数和周期;时区显示本身不改变 Unix 时间。不要为凑出相同验证码随意改参数。 |
| 提示无法使用 Web Crypto | 使用 HTTPS 独立页面或上述 localhost 方式,更新浏览器;不要关闭浏览器安全策略。 |
| 复制失败 | 嵌入沙箱或浏览器权限可能限制剪贴板。打开独立工具页,或手动选中验证码复制。 |
| 没有原始密钥 | 本工具无法从旧验证码反推出密钥,也不能绕过账户验证。使用原验证器、恢复码或服务商的账户恢复流程。 |
长期密钥一旦泄露,对方就可能持续生成验证码,因此不能把密钥当作一次性验证码分享。本工具不将输入写入 Cookie、localStorage、sessionStorage 或 URL,也不主动上传;但这不是安全审计结论,浏览器扩展、恶意软件、被修改的页面仍是风险。
“清除”不会擦除操作系统剪贴板、其他应用记录,也不保证浏览器内存被安全覆写。若真实密钥曾被发到不可信位置,请在账户安全设置中重新绑定二步验证,使旧密钥失效,并更新恢复码。
6. 总结
这个页面适合测试自己的 TOTP 配置、核对参数或短时生成验证码,不负责创建账户的二步验证,也不替代账户恢复。先用公开示例确认功能,再决定是否在可信环境中使用;重要账户继续使用可信验证器或通行密钥。
- 原文作者:春江暮客
- 原文链接:https://www.bobobk.com/online-2fa-totp.html
- 版权声明:本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。