wuzf/2fa
GitHub: wuzf/2fa
基于 Cloudflare Workers 的自托管两步验证密钥管理系统,提供免费的全球部署、加密存储和多端离线访问。
Stars: 342 | Forks: 147
# 🔐 2FA
基于 Cloudflare Workers 的两步验证密钥管理系统。免费部署、全球加速、支持 PWA 离线使用。
**[English](README_EN.md)**



**主要特性:** TOTP/HOTP 验证码自动生成 · 二维码扫描/图片识别/粘贴截图/拖拽图片添加密钥 · AES-GCM 256 位加密存储 · 从 Google Authenticator、Aegis、2FAS、Bitwarden 等应用批量导入 · 多格式导出(TXT/JSON/CSV/HTML/Google 迁移二维码) · 自动备份与还原 · WebDAV/S3/OneDrive/Google Drive 远程备份同步 · 设置面板(密码修改/同步设置) · 深色/浅色主题 · 响应式设计适配手机/平板/桌面
## 📸 截图预览
| 桌面端 | 平板端 | 手机端 |
| :-------------------------------------------: | :------------------------------------------: | :------------------------------------------: |
|  |  |  |
## 🚀 快速部署
### 在线体验
访问演示站点(密码 `2fa-Demo.`):**[https://2fa-dev.wzf.workers.dev](https://2fa-dev.wzf.workers.dev)**
### 一键部署(推荐)
[](https://deploy.workers.cloudflare.com/?url=https://github.com/wuzf/2fa)
1. 点击上方按钮,使用 GitHub 登录并授权
2. 登录 Cloudflare 账户,点击 **Deploy** 等待部署完成(KV 存储自动创建)
3. 打开 Cloudflare 给你的 Workers 链接,**设置管理密码**即可开始使用
#### 推荐:启用数据加密
部署后,在 **Cloudflare Dashboard → Worker → Settings → Variables** 中添加 Secret `ENCRYPTION_KEY`:
# 生成加密密钥(任选一种)
openssl rand -base64 32
node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"
#### 版本更新
一键部署生成的是独立仓库(非 Fork),升级统一使用 **Sync Upstream** 工作流原地完成。
1. 打开一键部署时在你 GitHub 上生成的 2fa 仓库
2. 进入 **Actions** → **Sync Upstream**
3. 点击 **Run workflow**
4. 等待工作流把上游最新代码同步到当前仓库
5. 工作流会自动以最新上游配置为基础,合并你当前仓库里的 Worker 名称、KV 绑定和常见部署配置
6. Cloudflare 会基于当前仓库重新部署**同一个 Worker**
这种方式不会动现有 Worker、KV 绑定或 Secrets。**如果你已经设置了 `ENCRYPTION_KEY`,升级时无需重新填写;如果你没设置,也照样用这套流程升级。**
#### 如果你想检查合并结果
`Sync Upstream` 的设计目标是始终在**同一仓库、同一 Worker**上完成升级。现在工作流会自动合并 `wrangler.toml`,并在摘要中展示与上游的差异,便于你确认哪些值来自本地部署配置:
1. 在 GitHub Actions 的运行摘要里查看 `wrangler.toml` diff
2. 打开当前仓库里的 `wrangler.toml`
3. 确认 Worker 名称、KV 绑定、路由和现有部署设置仍然正确
4. 如果你自己维护了非常特殊的 `wrangler.toml` 配置,再按需要补充提交
## 📖 使用指南
### 添加密钥
点击右下角 **➕** 悬浮按钮:
- **扫二维码** — 摄像头扫描 2FA 二维码,自动填入
- **选择图片** — 上传二维码截图,自动识别
- **粘贴截图** — Ctrl+V 粘贴剪贴板中的二维码截图(适合无摄像头的 PC 用户)
- **拖拽图片** — 直接将二维码图片拖入弹窗,自动识别
- **手动添加** — 输入服务名称和 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 迁移二维码**(可直接扫码导入)。
标准 TXT / JSON / CSV / HTML 导出在在线时优先使用统一后端格式;离线或请求体过大时会自动回退到本地兼容导出,继续保证 PWA 可用性。
### 备份与还原
系统自动备份(数据变化后自动触发 + 每天定时检查),保留最近 100 个备份(可在设置中调整)。
新创建的备份文件格式会跟随 **设置 → 默认导出格式**;远程自动备份也会使用相同的扩展名(`txt` / `json` / `csv` / `html`)。
点击悬浮按钮 → **🔄 还原配置** 查看备份列表、预览内容、还原或导出。
#### 远程备份
支持将备份同步到远程存储,数据变更时自动推送,可配置多个备份目标:
- **WebDAV** — 支持标准 WebDAV 协议的网盘或自建服务(⚠️ 不支持经 Cloudflare 代理的服务如坚果云,会触发 520 回环错误)
- **S3 兼容存储** — 支持 AWS S3、Cloudflare R2、MinIO、阿里云 OSS 等 S3 兼容服务
- **OneDrive** — 通过 Microsoft OAuth 授权后,将备份写入 OneDrive 应用专用目录下的子路径
- **Google Drive** — 通过 Google OAuth 授权后,将备份写入 Google Drive 指定目录
在 **设置 → 同步设置** 中添加和管理远程备份目标。
详细配置步骤见:[网盘备份配置指南](docs/CLOUD_DRIVE_SETUP.md)
### 设置
点击悬浮按钮 → **⚙️ 设置**:
- **修改密码** — 更改管理密码
- **登录有效期** — 自定义 JWT 过期时间
- **默认导出格式** — 控制导出按钮默认格式,也用于新建备份文件和远程自动备份的文件扩展名
- **备份保留数量** — 调整自动备份保留份数
- **远程备份** — 配置 WebDAV/S3/OneDrive/Google Drive 备份目标
### 安装为手机应用(PWA)
- **iOS**:Safari 打开 → 分享按钮 → 添加到主屏幕
- **Android**:Chrome 打开 → 菜单(⋮)→ 添加到主屏幕
安装后可像原生应用一样全屏使用,支持离线访问。
## 🔒 安全
- **密码**:PBKDF2-SHA256(100,000 次迭代)加盐哈希,JWT 存储在 HttpOnly + Secure + SameSite=Strict Cookie 中
- **数据加密**:配置 `ENCRYPTION_KEY` 后所有密钥、备份以及 WebDAV/S3/OneDrive/Google Drive 凭据使用 AES-GCM 256 位加密;请务必保存原始密钥,丢失后无法解密已有数据
- **传输**:全程 HTTPS,TLS 1.2+
- **隐私**:OTP 在客户端生成,不收集使用数据,完全开源
- **登录有效期**:默认 30 天,可在设置中自定义,活跃使用自动续期(剩余 < 7 天时自动延长)
## 🔗 公开 OTP API
无需登录,通过 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 用)
## 📚 更多文档
| 文档 | 说明 |
| --------------------------------------------- | -------------------------------------------------- |
| [部署指南](docs/DEPLOYMENT.md) | 手动部署、KV 配置、Secrets 管理 |
| [网盘备份配置指南](docs/CLOUD_DRIVE_SETUP.md) | OneDrive / Google Drive 中文配置步骤与简化设计建议 |
| [API 参考](docs/API_REFERENCE.md) | 完整 API 端点文档 |
| [架构设计](docs/ARCHITECTURE.md) | 系统架构与技术实现 |
| [开发指南](docs/DEVELOPMENT.md) | 本地开发、测试、代码规范 |
| [PWA 指南](docs/PWA_GUIDE.md) | PWA 安装与离线功能 |
## 🤝 参与贡献
欢迎提交 [Issue](https://github.com/wuzf/2fa/issues) 和 [Pull Request](https://github.com/wuzf/2fa/pulls)。开发相关请参考 [开发指南](docs/DEVELOPMENT.md)。
## 📄 许可证
[MIT License](LICENSE)
标签:256位加密, 2FA, 2FAS, Aegis, AES-GCM, Authenticator, Bitwarden, Edge Computing, Google Authenticator, Google Drive, HOTP, JSONLines, MFA, MIT License, OneDrive, Progressive Web App, PWA, S3, Serverless, TOTP, UI/UX, WebDAV, 两步验证, 二维码扫描, 云存储同步, 剪贴板, 加密存储, 双因素认证, 响应式设计, 图片识别, 多因素认证, 密码学, 开源, 手动系统调用, 批量导入, 数据可视化, 数据导出, 数据还原, 浅色主题, 深色模式, 漏洞探索, 登录保护, 离线应用, 程序员工具, 网络安全, 自动备份, 自定义脚本, 自托管, 账号安全, 身份安全, 身份验证器, 边缘计算, 运维工具, 隐私保护, 零信任, 验证码生成器