一个纯静态、浏览器本地运行的 TOTP 验证器。它使用 Web Crypto API 根据 Base32 密钥生成 RFC 6238 动态验证码,支持扫描 otpauth:// 二维码、多账户管理和离线 PWA。
- 本地生成验证码:HMAC-SHA1 计算在浏览器内完成
- 标准 TOTP:6 位验证码、30 秒周期,兼容 RFC 6238
- 二维码导入:识别本地
otpauth://二维码图片 - 多账户管理:账户数据保存在当前浏览器
- 离线 PWA:首次加载后可由 Service Worker 缓存静态资源
- 严格网络边界:Vercel CSP 将
connect-src限制为'self'
- 打开 2fa.userhali.com。
- 输入 Base32 密钥,或上传
otpauth://二维码图片。 - 填写账户名称并保存。
- 点击验证码卡片复制当前 6 位动态码。
git clone https://github.com/haliChina/2fa.git
cd 2fa
python3 -m http.server 8080然后访问 http://localhost:8080。直接双击 HTML 可能会限制 Service Worker,建议通过本地 HTTP 服务运行。
Important
TOTP 密钥等价于生成验证码的长期凭据。任何能读取当前浏览器存储或执行同源脚本的人,都可能读取这些密钥。
- 账户主副本保存在
localStorage,并写入同源 Cookie 作为恢复副本。 - Cookie 不是
HttpOnly,因为浏览器端 JavaScript 需要读取;它不应被视为加密存储。 - 项目没有后端,但部署平台仍会提供静态文件并可能记录常规访问日志。
- 浏览器扩展、XSS、设备失窃或被攻陷的浏览器环境仍可能暴露密钥。
- 清除站点数据或更换设备会丢失账户,请保留独立恢复码或安全备份。
当前实现支持 Google Authenticator 兼容的 TOTP:
HMAC-SHA1 · 30-second period · 6 digits
暂不支持 HOTP、Steam Guard 等非标准或不同参数格式。
仓库包含 vercel.json,可直接部署到 Vercel。安全响应头包括 CSP、HSTS、X-Frame-Options: DENY、nosniff 与受限 Permissions Policy。
当前仓库未包含明确的开源许可证文件。在复制、修改或再分发代码前,请先向维护者确认授权范围。