基于 Cloudflare Workers 的两步验证密钥管理系统。免费部署、全球加速、支持 PWA 离线使用。
主要特性: TOTP/HOTP 验证码自动生成 · 二维码扫描/图片识别添加密钥 · AES-GCM 256 位加密存储 · 从 Google Authenticator、Aegis、2FAS、Bitwarden 等应用批量导入 · 多格式导出(TXT/JSON/CSV/HTML/Google 迁移二维码) · 自动备份与还原 · 深色/浅色主题 · 响应式设计适配手机/平板/桌面
| 桌面端 | 平板端 | 手机端 |
|---|---|---|
![]() |
![]() |
![]() |
访问演示站点(密码 2fa-Demo.):https://2fa-dev.wzf.workers.dev
- 点击上方按钮,使用 GitHub 登录并授权
- 登录 Cloudflare 账户,点击 Deploy 等待部署完成(KV 存储自动创建)
- 打开 Cloudflare 给你的 Workers 链接,设置管理密码即可开始使用
部署后,在 Cloudflare Dashboard → Worker → Settings → Variables 中添加 Secret ENCRYPTION_KEY:
# 生成加密密钥(任选一种)
openssl rand -base64 32
node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"不配置也可正常使用,但建议配置以加密保护 2FA 密钥数据。
点击右下角 ➕ 悬浮按钮:
- 扫二维码 — 摄像头扫描 2FA 二维码,自动填入
- 选择图片 — 上传二维码截图,自动识别
- 手动添加 — 输入服务名称和 Base32 密钥(可展开高级设置调整位数/周期/算法)
- 复制验证码:直接点击验证码数字
- 管理密钥:点击卡片右上角 ⋯ → 编辑 / 删除 / 查看二维码
- 搜索:顶部搜索框按服务名或账户名实时搜索
- 排序:按添加时间或名称排序
- 主题:右下角 🌓 切换浅色/深色/跟随系统
点击悬浮按钮 → 📥 批量导入,支持文件导入或文本粘贴。
兼容格式:
| 来源 | 格式 |
|---|---|
| 通用 | otpauth:// URI 文本(TXT)、CSV、HTML |
| Google Authenticator | 迁移二维码(otpauth-migration://) |
| Aegis | JSON 导出文件 |
| 2FAS | .2fas 导出文件 |
| Bitwarden | JSON 导出文件 |
| LastPass Authenticator | JSON 导出文件 |
| andOTP | JSON 导出文件 |
| Ente Auth | 导出文件 |
点击悬浮按钮 → 📤 批量导出,支持 TXT、JSON、CSV、HTML 格式,以及生成 Google Authenticator 迁移二维码(可直接扫码导入)。
系统自动备份(数据变化后自动触发 + 每天定时检查),保留最近 100 个备份。
点击悬浮按钮 → 🔄 还原配置 查看备份列表、预览内容、还原或导出。
为了让 GitHub Actions 备份工作流正常运行,请在你的 GitHub 仓库设置中配置以下 Secrets:
| Secret 名称 | 说明 | 是否必填 |
|---|---|---|
CLOUDFLARE_API_TOKEN |
具有 KV 读取权限的 API 令牌 | 必填 |
CLOUDFLARE_ACCOUNT_ID |
你的 Cloudflare 账户Account Details ID(32位) | 必填 |
KV_NAMESPACE_ID |
你的 KV 命名空间 ID (例如:863764*c***41f6b*b03*5*0d8d97341) |
必填 |
BACKUP_ENCRYPTION_KEY |
用于备份文件加密的密码(不填则不加密) | 可选 |
S3_ACCESS_KEY_ID |
S3 凭证 | 可选 |
S3_SECRET_ACCESS_KEY |
S3 凭证 | 可选 |
S3_BUCKET |
S3 配置 | 可选 |
S3_REGION |
S3 配置 | 可选 |
S3_ENDPOINT |
S3 配置 | 可选 |
WEBDAV_URL |
WebDAV 连接信息 | 可选 |
WEBDAV_USER |
WebDAV 连接信息 | 可选 |
WEBDAV_PASSWORD |
WebDAV 连接信息 | 可选 |
GH_BACKUP_TOKEN |
具有备份仓库写入权限的 PAT (Token) | 可选 |
GH_BACKUP_USER |
GitHub 备份用户名 | 可选 |
GH_BACKUP_REPO |
GitHub 备份仓库名 | 可选 |
如何创建 CLOUDFLARE_API_TOKEN 并配置权限:
- 登录到你的 Cloudflare Dashboard。
- 点击右上角的个人图标,选择 "My Profile" (我的个人资料)。
- 在左侧导航栏中,选择 "API Tokens" (API 令牌)。
- 点击 "Create Token" (创建令牌)。
- 选择 "Create Custom Token" (创建自定义令牌)。
- 令牌名称 (Token Name):输入一个易于识别的名称,例如
2FA-Backup-Action。 - 权限 (Permissions):配置以下权限:
- Account (账户):
- Workers KV Storage:
Edit(或至少Read)
- Workers KV Storage:
- Zone (区域):
- Workers Routes:
Read - Workers Scripts:
Read
- Workers Routes:
- Account (账户):
- 客户端 IP 地址过滤 (Client IP Address Filtering):保持默认或根据需要配置。
- TTL (Time to Live):保持默认或根据需要配置。
- 点击 "Continue to summary" (继续到摘要)。
- 确认权限无误后,点击 "Create Token" (创建令牌)。
- 复制生成的 API Token。这个 Token 只会显示一次,请务必妥善保存。
- 将此 Token 添加到你的 GitHub 仓库 Secrets 中,名称为
CLOUDFLARE_API_TOKEN。
| S3 备份相关 | | |
| S3_ACCESS_KEY_ID, S3_SECRET_ACCESS_KEY | S3 凭证 | 可选 |
| S3_BUCKET, S3_REGION, S3_ENDPOINT | S3 配置 | 可选 |
如何配置 S3 备份:
- 创建 S3 兼容存储:在 AWS S3、Cloudflare R2、MinIO 等服务中创建一个存储桶。
- 获取凭证:
S3_ACCESS_KEY_ID和S3_SECRET_ACCESS_KEY:这是你的存储服务的访问密钥和秘密访问密钥。S3_BUCKET:你创建的存储桶的名称。S3_REGION:存储桶所在的区域(例如us-east-1)。对于 R2,通常是auto。S3_ENDPOINT:如果使用 S3 兼容服务(如 R2),需要提供其 API 端点(例如https://<ACCOUNT_ID>.r2.cloudflarestorage.com)。AWS S3 通常不需要此项。
- 将这些凭证和配置作为 GitHub Secrets 添加到你的仓库中。
| WebDAV 备份相关 | | |
| WEBDAV_URL, WEBDAV_USER, WEBDAV_PASSWORD | WebDAV 连接信息 | 可选 |
如何配置 WebDAV 备份:
- 准备 WebDAV 服务:你需要一个可用的 WebDAV 服务器,例如自建的 Nextcloud、AList,或者一些支持 WebDAV 的云存储服务。
- 获取连接信息:
WEBDAV_URL:WebDAV 服务器的完整 URL,例如https://dav.example.com/remote.php/webdav/。WEBDAV_USER和WEBDAV_PASSWORD:用于登录 WebDAV 服务器的用户名和密码。
- 将这些连接信息作为 GitHub Secrets 添加到你的仓库中。
| GitHub 备份相关 | | |
| GH_BACKUP_TOKEN | 具有备份仓库写入权限的 PAT (Token) | 可选 |
| GH_BACKUP_USER, GH_BACKUP_REPO | 备份目标用户名和仓库名 | 可选 |
如何配置 GitHub 备份:
- 创建备份仓库:创建一个新的 GitHub 私有仓库,用于存储备份文件。
- 生成 Personal Access Token (PAT):
- 前往 GitHub Settings (设置) → Developer settings (开发者设置) → Personal access tokens (个人访问令牌) → Tokens (classic)。
- 点击 "Generate new token" (生成新令牌)。
- Note (备注):输入一个描述性名称,例如
2FA-Backup-PAT。 - Expiration (有效期):选择一个合适的有效期。
- Select scopes (选择范围):勾选
repo权限(这将允许访问私有仓库)。 - 点击 "Generate token" (生成令牌)。
- 复制生成的 PAT。这个 Token 只会显示一次,请务必妥善保存。
- 配置 GitHub Secrets:
GH_BACKUP_TOKEN:将你生成的 PAT 添加到 GitHub Secrets。GH_BACKUP_USER:你的 GitHub 用户名。GH_BACKUP_REPO:你创建的备份仓库的名称。GH_BACKUP_DIR(可选):备份文件在仓库中存储的目录,默认为2fa-backups。
- 将这些信息作为 GitHub Secrets 添加到你的仓库中。
如果当天存在多份备份,系统会自动将它们打包成一个 .tar.gz 文件(如果配置了 BACKUP_ENCRYPTION_KEY,则后缀为 .tar.gz.enc)。
-
解密文件 (仅限已加密的情况):
# 将 <encrypted_bundle> 替换为你的备份文件名 (如 2fa_backups_2026-02-28.tar.gz.enc) # 将 <password> 替换为你的 BACKUP_ENCRYPTION_KEY 值 openssl enc -aes-256-cbc -d -salt -pbkdf2 -iter 100000 -in <encrypted_bundle> -out backup_bundle.tar.gz -pass pass:<password>
-
解压打包文件:
# 解压后你会得到当天所有的 .json 原始备份文件 tar -xzf backup_bundle.tar.gz
- iOS:Safari 打开 → 分享按钮 → 添加到主屏幕
- Android:Chrome 打开 → 菜单(⋮)→ 添加到主屏幕
安装后可像原生应用一样全屏使用,支持离线访问。
- 密码:PBKDF2-SHA256(100,000 次迭代)加盐哈希,JWT 存储在 HttpOnly + Secure + SameSite=Strict Cookie 中
- 数据加密:配置
ENCRYPTION_KEY后所有密钥和备份使用 AES-GCM 256 位加密 - 传输:全程 HTTPS,TLS 1.2+
- 隐私:OTP 在客户端生成,不收集使用数据,完全开源
- 登录有效期:30 天,活跃使用自动续期(剩余 < 7 天时自动延长 30 天)
无需登录,通过 URL 直接生成验证码:
https://your-worker.workers.dev/otp/YOUR_SECRET_KEY
https://your-worker.workers.dev/otp/YOUR_SECRET_KEY?digits=8&period=60
https://your-worker.workers.dev/otp/YOUR_SECRET_KEY?type=hotp&counter=5
参数:type(totp/hotp)、digits(6/8)、period(30/60/120)、algorithm(sha1/sha256/sha512)、counter(HOTP 用)
| 文档 | 说明 |
|---|---|
| 部署指南 | 手动部署、KV 配置、Secrets 管理 |
| API 参考 | 完整 API 端点文档 |
| 架构设计 | 系统架构与技术实现 |
| 开发指南 | 本地开发、测试、代码规范 |
| PWA 指南 | PWA 安装与离线功能 |
欢迎提交 Issue 和 Pull Request。开发相关请参考 开发指南。
如果这个项目对您有帮助,请给一个 ⭐
Made with ❤️ by wuzf


