blazenxt/vault100

GitHub: blazenxt/vault100

一款免费开源的零知识本地文件加密工具,通过级联加密与多平台互通的保险库格式保护用户文件隐私。

Stars: 0 | Forks: 0

# 🔐 Vault100 — 最高安全级别、零知识文件加密 **将任何文件封装为 `.v100` 保险库 — 在浏览器中、通过 CLI 或在桌面上进行。文件、密码和密钥永远不会离开您的设备。** [![版本](https://img.shields.io/badge/release-v2.0.16-e15555)](https://github.com/blazenxt/vault100/releases) [![许可证: MIT](https://img.shields.io/badge/license-MIT-6dbb92)](LICENSE) [![Python ≥ 3.10](https://img.shields.io/badge/python-%E2%89%A5%203.10-blue)](#installation) [![Web app](https://img.shields.io/badge/web-vault100.blazenxt.in-c9a227)](https://vault100.blazenxt.in/) [![测试](https://img.shields.io/badge/tests-55%20passed-6dbb92)](#testing) 🌐 **在线零知识 Web app:** **[vault100.blazenxt.in](https://vault100.blazenxt.in/)** — 可作为离线 PWA 安装 · 也可通过一个零依赖的 Node 服务器[自托管](#self-hosting) | 🖥 桌面 GUI | 💻 CLI 引擎 | 🌐 网页柜台 (PWA) | |---|---|---| | Tkinter 应用 — 拖拽文件,选择强度,封装 | `python -m vault100 encrypt …` | 5 个窗口,108 个 KDF 档位,基准测试仪器 | 三个载体,同一种机制 — **保险库在 Web、CLI 和 GUI 之间完全互通**。 - [为什么选择 Vault100](#why-vault100) - [安全架构](#-security-architecture) - [网页柜台](#-the-web-counter) - [安装说明](#-install) · [命令行](#-command-line) · [自托管](#-self-hosting-zero-knowledge) - [测试](#-testing) · [诚实的局限性](#-honest-limitations) - [贡献](CONTRIBUTING.md) · [安全政策](SECURITY.md) ## 为什么选择 Vault100 * **设计即为零知识** — 所有加密操作均在本地运行(Web Worker / 原生)。没有账号,没有遥测,没有托管,没有上传 — 可在源码和 DevTools 中验证。 * **分层且真正的安全** — XChaCha20-Poly1305 secretstream,可选的 AES-256-GCM 级联,具有 **108 个可调档位**的 Argon2id 内存硬化 KDF,以及针对不同设备的基准测试(“计时器”)。 * **实用的便利功能** — 无需重新加密主体即可即时更改密码,256 位 keyfile,保险库内置 gzip 压缩,整文件夹封装,文件名恢复,离线 PWA。 * **开放且文档齐全** — MIT 许可证,完全规范的容器格式,55 个自动化测试,CLI↔web 字节级精确兼容性验证。 ## 🌐 网页柜台 **在线访问 [vault100.blazenxt.in](https://vault100.blazenxt.in/)** — 封印局的五个窗口,端到端零知识,并可作为离线优先的 PWA 安装: | 窗口 | 功能 | |---|---| | Form 100-B · 封印 | 文件 & 整个文件夹 → `.v100` · 108 个 KDF 档位 · 级联 · keyfile · gzip | | Form 100-C · 开启 | 本地解密 · 恢复原始名称 · 窥视详情 · 检查托盘预览 | | Form 100-R · 重组 | 即时更改密码/keyfile — 重新封装头部,主体保持不变 | | Annex D · 仪器 | keyfile 压制 · 密码生成 · 检查镜 · **计时器**设备基准测试 · 办公室清除策略 | | 随处按下 Esc, Esc | 应急演练 — 清除柜台并销毁记录簿 | ![Annex D instruments — the timekeeper](https://static.pigsec.cn/wp-content/uploads/repos/cas/09/0985ef8e82dedf3c94c3eb19bc0808cb5e80c93b3cc801e038459099b135a48b.png) ![Five inks × day/night shifts](https://static.pigsec.cn/wp-content/uploads/repos/cas/32/3296583d0740b9a6cc2a1df5f1cbb42919842e44403358039d5f7a0097a9f566.png) 柜台能做的一切,CLI 和桌面应用也能做 — 并且**在所有三者之间打开保险库时,字节级完全一致**。 ## 为什么选择 Vault100 * **设计即为零知识** — 所有加密操作均在本地运行(Web Worker / 原生)。没有账号,没有遥测,没有托管,没有上传 — 可在源码和 DevTools 中验证。 * **分层且真正的安全** — XChaCha20-Poly1305 secretstream,可选的 AES-256-GCM 级联,具有 **108 个可调档位**的 Argon2id 内存硬化 KDF,以及针对不同设备的基准测试(“计时器”)。 * **实用的便利功能** — 无需重新加密主体即可即时更改密码,256 位 keyfile,保险库内置 gzip 压缩,整文件夹封装,文件名恢复,离线 PWA。 * **开放且文档齐全** — MIT 许可证,完全规范的容器格式,55 个自动化测试,CLI↔web 字节级精确兼容性验证。 ## 🛡️ 安全架构 ``` password ──► Argon2id ──┐ ├─► HKDF-SHA256 ──► KEK ─┐ keyfile ──► BLAKE2b ────┘ (optional 2nd factor) │ ▼ random FEK ──────────────────────────────────── XChaCha20-Poly1305 wrap │ ▼ ┌─────────────────┐ optional ┌────────────────┐ │ AES-256-GCM ────┼─────────────►│ XChaCha20- │──► .v100 vault │ (cascade layer) │ per chunk │ Poly1305 │ └─────────────────┘ │ secretstream │ └────────────────┘ ``` | 层级 | 选择 | 为您带来的优势 | |---|---|---| | **信封密钥 (Envelope keys)** | 随机的每文件密钥 (FEK),由您的 KEK 封装 | 即时更改密码;永远无需批量重新加密 | | **第二因素** | `--keyfile` — 256 位随机文件(任何文件均可,VeraCrypt 风格) | 攻击者需要*同时具备*两个因素;仅靠密码猜测无效 | | **外部加密** | XChaCha20-Poly1305 (libsodium secretstream) | AEAD,192 位 nonces,自动重新加密,防截断 | | **级联层** | `--cascade`:AES-256-GCM 封装在 XChaCha20 *内部* | 如果其中一个算法被破解,另一个依然有效 | | **KDF** | Argon2id · 128 MiB×3 (`standard`) · 512 MiB×4 (`paranoid`) · **根据您的机器自动调整** (`max`) | GPU/ASIC 每秒只能进行数千次猜测,而非数十亿次 | | **Salt** | 每个保险库随机生成 32 字节 | 相同文件 + 相同密码 ⇒ 生成完全不同的保险库 | | **完整性** | 每 1 MiB 数据块一个 AEAD 标签;将不可变的流上下文作为 AAD;通过 Poly1305 校验密钥封装 | 防止位翻转、重排、截断、头部编辑 — 全都会被明确拒绝 | | **隐私** | 原始文件名 + 元数据在保险库内加密 | 攻击者甚至无法看到文件原来的名字 | | **抗 DoS** | 对不受信任的头部 KDF 参数进行合理的上限限制 | 恶意文件无法强制分配 4 GiB 内存 | | **原子写入** | 临时文件 + 重命名 | 操作中途崩溃绝不会产生损坏的文件 | ### v2 文件格式 (`.v100`) ``` 0 8 magic "V100ENC2" 8 1 format version (2) ← v1 files still decrypt forever 9 1 KDF id (1 = Argon2id) 10 4 KDF memory (KiB) 14 4 KDF time cost 18 1 KDF parallelism 19 1 flags (bit0 cascade · bit1 keyfile-required) 20 32 salt (KEK derivation) ← rewritten by `passwd` 52 24 wrap nonce ← rewritten by `passwd` 76 48/80 wrapped FEK (+Poly1305 tag) ← rewritten by `passwd` 24 secretstream header ← immutable; anchors all chunk AAD .. chunks: [uint32 len][ciphertext] … (last chunk tagged FINAL) chunk 1 (encrypted ×2 in cascade): metadata JSON {name, size, mtime} chunk 2..N: your data ``` ## 📦 安装说明 ``` cd vault100 pip install -r requirements.txt # PyNaCl + argon2-cffi + cryptography # GUI 需要 tkinter(随 Python 提供;Debian/Ubuntu:python3-tk) ``` ## 💻 命令行 ``` # 经典模式 — 包含强度计 python -m vault100 encrypt secret.pdf # 全副武装:dual cipher + auto-tuned KDF + shred originals python -m vault100 encrypt ./vault-folder/ --cascade --security max --shred # 双因素:创建一个 keyfile,然后用它锁定一个 vault python -m vault100 keygen /mnt/usb/my.v100key python -m vault100 encrypt wallet.dat --keyfile /mnt/usb/my.v100key # 锁定 / 解锁 python -m vault100 decrypt wallet.dat.v100 --keyfile /mnt/usb/my.v100key # 在约一秒内更改密码(仅 124-byte 的 key wrap 会被重新封装) python -m vault100 passwd wallet.dat.v100 # 关于 vault 的非机密事实 python -m vault100 info wallet.dat.v100 # 强密码 / passphrase 生成器 python -m vault100 genpass --count 3 python -m vault100 genpass --passphrase --words 8 # 计时器 — 设备速度测试(cipher 吞吐量 + Argon2id cost) python -m vault100 bench # 安全删除任何内容 python -m vault100 shred old_keys.pem --passes 7 ``` 环境/自动化:`VAULT100_PASSWORD`,`--password-file`,`-q`。 ## 🖥️ 桌面 GUI ``` python -m vault100.gui ``` **Encrypt** 标签页 — 文件夹,keyfile 选择器,级联开关,安全级别 (包含机器自动调整),实时强度计,封装后粉碎 · **Decrypt** 标签页 — 批量解锁,keyfile,原始文件名恢复 · **Shred** 标签页 — 多遍销毁器 · **Tools** 标签页 — keyfile 生成器,即时密码更改,保险库检查器。 ## ✅ 经过测试的安全属性(55/55 通过) ``` VAULT100_FAST_KDF=1 python3 -m pytest tests/test_crypto.py -v ``` * ✔ 往返测试:空文件 / 边界 / 多数据块 / 级联 / keyfile * ✔ 密码错误、keyfile 错误、keyfile 缺失 → 拒绝 * ✔ 封装的 FEK 篡改 → 拒绝(密钥封装上有 Poly1305) * ✔ 任何位翻转、截断、尾部垃圾数据、头部编辑 → 拒绝 * ✔ 恶意 DoS 头部(4 GiB KDF 声明,未知标志) → 低成本拒绝 * ✔ `passwd` 会即时重新封装密钥;旧密码失效;数据字节不受影响 * ✔ 随后可通过 `passwd` 添加 keyfile — 保险库升级为双因素验证 * ✔ v1 保险库永远可解密(已测试向下兼容) * ✔ 相同输入两次 → 生成不同的密文(随机 salt + FEK) ## ⚠️ 诚实的局限性 * **`passwd` 注意事项:** 任何持有*旧保险库文件副本*以及 旧密码的人,仍然可以解密该副本(这对于 LUKS/VeraCrypt 也是一样的)。 如果这对您很重要,请粉碎旧副本。 * **keyfile = 房屋钥匙:** 请分开存放,并保留备份 — 如果丢失, 保险库将永远被封死。密码也是如此。不存在任何后门。 * 粉碎操作在 HDD 上是可靠的;闪存/SSD 的磨损均衡可能会保留残留 副本 — 尽可能在数据写入磁盘*之前*进行加密。 * Python 无法保证密钥会从 RAM 中擦除(由 OS 管理);在面对 国家级威胁模型时,请配合使用全盘加密。 * 尚未经过专业审计。请备份所有重要数据。 ## 🌐 自托管(零知识) `web/` 是一个静态的、**零知识** Web app:所有的加密过程都在 访问者的浏览器中进行(WASM libsodium + Argon2,WebCrypto AES-GCM 级联),而 服务器仅仅是一个无状态文件托管商。保险库与**此 CLI 字节级兼容** — 已在测试实验室中进行双向验证。有关交钥匙部署方案(Caddy/Nginx,自动 HTTPS,强化的 CSP/HSTS headers)以及 确保其保持零知识特性的运维规则,请参阅 `web/DEPLOY.md`。 ``` docker build -t vault100 . && docker run -p 8080:8080 vault100 # — 或者,zero-dependency — node web/server.mjs # serves on :8080 (honors $PORT), /health for checks ``` ## 🆕 更新日志亮点 **v2.0.x 系列**(所有版本请见 [发布页面](https://github.com/blazenxt/vault100/releases)): * **2.0.16** — 公开发版优化:SEO(robots/sitemap/OG/JSON-LD),录制了章程 + FAQ,发布文档 * **2.0.15** — 计时器设备基准测试 · 穿孔批量收据序列号 · CLI `bench` · GUI gzip * **2.0.14** — 文件夹→tar 封装 · 保险库内置 gzip · 检查托盘预览 * **2.0.13** — 空闲清除 · Esc-Esc 应急演练 · 剪贴板熔炉 · 保险库窥视 * **2.0.12** — Form 100-R 即时密码更改 (Web) * **2.0.11** — 主题套件:5 种柜台墨水 × 白班/夜班 * **2.0.10** — 针对内存紧张的浏览器自动调整 KDF * **2.0.0** — 信封加密 (KEK/FEK) · keyfile 第二因素 · 级联双密码 · 自动调整的 `max` KDF 配置文件 · 即时 `passwd` · v1 保险库兼容性 · 零知识 Web 版本,实现字节级精确的 CLI 互操作(双向验证: Argon2id,HKDF,BLAKE2b,AES-GCM,完整保险库)
标签:AI工具, DNS 反向解析, MITM代理, PWA, Python, 后端开发, 密码学, 手动系统调用, 文件加密, 无后门, 桌面应用, 请求拦截, 逆向工具, 零知识证明