dlamarre-dev/StegoShard
GitHub: dlamarre-dev/StegoShard
一款将文件零知识加密并转换为纠错 QR 图像、隐写照片或伪装数据库的隐私存储工具,兼顾数据可恢复性与合理可否认性。
Stars: 0 | Forks: 0
# StegoShard
StegoShard 会对你的文件进行加密(零知识),然后为你提供**两种互补的存储模型**——以及它们之间的桥梁。**弹性存储**(Resilient Storage)保持机密的可恢复性:这些图像是公开的人造产物,经过纠错处理,能够在重压缩和打印后幸存;对于较大的机密,则提供单一的不透明二进制文件。**可否认存储**(Deniable Storage)隐藏机密,使其存在性本身可被否认:将数据伪装成普通照片中的碎片,或者包装成一个读取起来平淡无奇的诱饵数据库(一种 `.db` 文件)。**混合模式**(Hybrid)结合了两者:以弹性方式存储归档,并仅将恢复密钥隐藏在日常照片中。
```
StegoShard offers two complementary storage models — plus a bridge between them.
🛡 Resilient Storage error-corrected images, or one opaque file · survives cloud, print, copy
🎭 Deniable Storage inside ordinary photos, or a decoy database · hides that data exists
🔗 Hybrid store the archive resiliently, hide only the recovery key in a photo
```
## 两种存储模型
从对你的机密真正重要的问题开始:
```
StegoShard
Which property matters?
┌────────────────────┴────────────────────┐
│ │
It must survive Nobody must know
everything it even exists
(loss · print · cloud) (plausible deniability)
│ │
▼ ▼
🛡 Resilient Storage 🎭 Deniable Storage
│ │
└────────────────────┬────────────────────┘
▼
🔗 Hybrid Mode
(resilient archive + deniable recovery key)
```
这**不是同一 continuum 上的两个点——它们是两种互不兼容的保证**,选择其中一种是一种深思熟虑的权衡:
| 模型 | 主要目标 | 抵抗重压缩 | 合理的可否认性 |
| ------------------------ | -------------------------------- | :--------------------: | :-------------------: |
| 🛡 **弹性存储** | 可靠的备份 | ✅ 是 | ❌ 否 |
| 🎭 **可否认存储** | 隐藏数据的存在本身 | ❌ 否 | ✅ 是 |
你越是优化以在转换中幸存,载体就越容易被检测到;你越是优化可否认性,存储就越是脆弱。这不是一个 bug——可否认通道**本质上是脆弱的**,StegoShard 让这个选择变得明确,而不是假装一个设置就能兼顾两者。
**🔗 混合模式** 在两者之间架起桥梁。以弹性方式存储加密归档(公开的人造图像),并将**仅恢复密钥**隐藏在一张普通照片中:
```
Archive (≤ 100 MB)
│
▼
StegoShard — Resilient Storage
│
├── resilient images (visibly artificial, survive the cloud)
│
└── recovery key
│
▼
Ordinary photo — Deniable Storage
(key hidden deniably, fragile by design)
```
如果那张照片被复制到社交网络,重压缩会破坏隐藏的密钥——这是设计使然。可否认通道是可消耗的;弹性归档保持完整。小机密(约 2 KB——种子、密钥、密码)可以完全独立地存在于可否认存储中。
### 输出形式
安全目标是一个 axis;**载体**是另一个。每种模型都提供不止一种输出形式,因此你需要同时选择——你想要什么保证,以及结果在磁盘上是什么样子:
| 输出形式 | 模型 | 是什么 |
| ----------- | :---: | ---------- |
| **QR 网格图像**(磁盘 / 纸张 / 云端) | 🛡 弹性 | 公开的人造图像;能在重压缩、打印和云存储中幸存。 |
| **不透明二进制文件** (`.ssbn`) | 🛡 弹性 | 用于较大机密(最大 100 MB,无图像数量上限)的一个紧凑文件。不可否认——显然是一个 StegoShard vault。 |
| **诱饵数据库** (`.db`) | 🎭 可否认 | 相同的二进制字节包装上有效的 SQLite header,因此文件类型分类会将其读取为普通数据库。能承受复制;但如果使用实际打开它的工具进行分类,其可否认性会暴露。 |
| **普通照片**(隐写密钥 / Gallery Mode) | 🎭 可否认 | 机密(或仅密钥)隐藏在看起来真实的照片中。完全融入其中,但**脆弱**——重压缩会破坏它。 |
二进制文件和诱饵数据库是图像输出的同级产物,而不是事后的补充:当图像数量变得不切实际时,它们是你以弹性或可否认方式存储**更大**机密(最大 100 MB)的途径。
## 快速开始
使用 StegoShard 的三种方式;所有方式都运行**相同的 `@core` 格式**,因此使用其中一种方式制作的 vault 可以用任何其他方式(以及 [Python 解码器](python/README.md))恢复。
**1. Web 应用程序——无需安装,数据不离开你的设备。** 最快的试用方式:离线核心(磁盘 + 纸张)完全在你的浏览器中运行。
**2. 浏览器扩展。** 在 Beta 期间,构建它并加载已解压的扩展程序(应用商店上架待定,参见[状态](#status)):
```
npm install
npm run build # → dist/chrome/ (also: npm run build:firefox, build:edge)
```
然后 `chrome://extensions` → 开发者模式 → **加载已解压的扩展程序** → 选择 `dist/chrome/`
(Firefox:`about:debugging` → 此 Firefox → **加载临时附加组件** → 它的 `manifest.json`)。
**3. 命令行工具。** 从克隆的代码库运行,无需全局安装:
```
npm install
npm run cli -- save secret.txt --out ./vault # → PNG images
npm run cli -- restore ./vault --out ./restored # ← images / folder / .zip / .pdf
```
有关关键模式、纸张、二进制和 Gallery Mode,请参阅[命令行参考](docs/CLI.md)。(发布的 `npm i -g stegoshard` 和独立二进制文件将在 1.0 版本推出。)
## 它的作用
**保存(导出)**
```
file → unlock (password → KEK → DEK) → compress → encrypt (AES-GCM)
→ erasure code (k data + m parity shards, Reed-Solomon)
→ render each shard as a resilient image (profile per destination)
→ disk (PNG/ZIP) | paper (printable PDF) | cloud album (optional)
```
**恢复(导入)**
```
import images (any source) → decode each (self-describing header → shard)
→ Reed-Solomon reconstruct (tolerates up to m missing/corrupt images)
→ unlock → decrypt → decompress → original file, byte-for-byte
```
区别在于:**只要至少有 `k` 张图像幸存,丢失一页、删除相册图像或代码无法读取都不会阻止恢复**。
## 性能
StegoShard 的目标是**小型、高价值的机密**,因此唯一刻意的成本就是保护你的成本:**密钥派生**。每次解锁都会运行 Argon2id,参数为 **256 MiB, t=4**(固定在 [SPEC.md](SPEC.md) 中),旨在在典型的桌面硬件上实现 **~1–2 秒**的解锁,同时在浏览器标签页和手机上保持可用性。这种缓慢是关键所在——它使得离线密码搜索的成本变得昂贵。
除此之外的其他开销都可以忽略不计。Payload 被限制在较小的范围内(每个图像/PDF vault ≤ 1 MiB,二进制/诱饵数据库输出 ≤ 100 MB),因此与密钥派生步骤相比,加密、Reed-Solomon 纠删码(erasure coding)以及图像编码/解码几乎可以瞬间完成。所有操作都在**本地**运行——浏览器中使用 WebAssembly,CLI 中使用捆绑的 runtime——没有网络往返(除了可选的云端目的地)。为 Argon2id 分配大约 **256 MiB 的瞬态内存**预算;一旦密钥派生完成,它就会立即被释放。
## 设计原则
- **互不兼容的保证,被明确区分。** 弹性和可否认性 pull in 相反的方向(参见[两种存储模型](#two-storage-models))。弹性存储看起来像编码后的噪点,而不是度假照片——这是刻意为之的;可否认存储融入其中,但本质上是脆弱的。StegoShard 让你做出选择,而不是假装一个设置就能兼顾两者,并且记录了各自真实的局限性。
- **小型机密。** 作为图像存储时大约有 4 倍的大小开销;大型二进制文件不在范围内。
- **不信任任何单一支撑。** 弹性(多个目的地 + 纠删码)是其价值主张。
- **离线核心(文件 → 图像 → 磁盘/纸张)不依赖于任何第三方服务或网络。** Google Photos 仅作为可选目的地。
- **可审计。** 开源(MIT),受 PR 门控,具有版本化格式规范和独立的 Python 参考解码器,因此即使扩展程序失效,你的数据也能幸存。
## 状态
🧪 **Beta 版——功能已完备,正在为公开发布 1.0 版进行加固。** 产品的每一部分都已构建、测试和交叉验证;在 1.0 版本之前剩下的只是发布物流和外部审查,而不是功能。
**已完成并测试:**
- **加密核心** —— Argon2id KEK/DEK,AES-256-GCM,机会性 gzip,Reed-Solomon 纠删码,QR 网格图像编解码器,以及自描述 header。该层记录在面向审计员的[加密审查档案](docs/CRYPTO-REVIEW.md)中(声明 → 在哪里强制执行 → 哪个测试证明了它),具有冻结的跨实现测试向量和详尽的负面/模糊测试。
- **目的地** _(🛡 弹性存储)_ —— **磁盘**(一组 PNG 图像,或单个 `.zip`),**纸张**(可打印的 PDF,每页一个高 ECC QR,可读的 header + 可选的说明页,可通过扫描或照片恢复),以及**可选的 Google Photos** 相册(通过 Picker API 上传 + 恢复);云端是为了方便,绝不是唯一的副本。
- **关键模式** —— **embedded**(密钥块随图像传输),**keyfile**(独立的 `.key` 文件),以及 **可否认隐写** _(🎭/🔗 —— 可否认与混合模式的构建块)_:隐藏在普通照片中的密钥——基准 JPEG cover 通过 DCT 系数嵌入保持为同等大小的 JPEG,PNG cover 保持为 PNG。与弹性目的地结合,这就**是**混合模式。此外,在选项页面还有一个**托管的 vault 密钥**(创建/按会话解锁/更改密码/导出/导入/擦除);解锁的会话是易失性的,并在弹出窗口重开时持续存在,直到浏览器关闭。
- **非图像输出** —— 用于较大机密(最大 100 MB,无图像数量上限)的**二进制容器**:一个紧凑、不透明的 `.ssbn` 文件 _(🛡 弹性)_,或者将相同的字节包装成一个带有有效 SQLite header 的**诱饵数据库**,以便文件类型分类将其读取为普通的 `.db` _(🎭 可否认)_ (SPEC §8)。此外还有 **Gallery Mode** _(🎭 可否认)_ (SPEC §9),它将一个小机密分散到包含诱饵的一组普通照片文件夹中,受 Reed-Solomon 保护并盲目解码。
- **独立恢复** —— 一个独立的 **[Python 参考解码器](python/README.md)** 可以在没有扩展程序的情况下恢复 vault,并在 CI 中作为跨实现一致性测试运行;同时有一个无头(headless) **CLI**(见下文)创建并恢复相同的格式。
- **本地化** —— UI、隐私政策和服务条款已本地化为 8 种语言
(en, fr, it, de, es, pt, ja, zh_TW;参见 [docs/LOCALIZATION.md](docs/LOCALIZATION.md)),
全部经过母语审校。
图像上的格式已在 [SPEC.md](SPEC.md) 中**冻结**(`FORMAT_VERSION = 1`)。该扩展已为 Chrome Web Store、Edge Add-ons 和 Firefox 打包(`npm run package`);请参阅 [docs/STORE.md](docs/STORE.md) 和[隐私政策](docs/PRIVACY.md)。
**在公开发布 1.0 之前剩余的工作:** 本地化的商店截图,Google 的 OAuth 验证(仅针对公开的 Google Photos 目的地),以及可选的外部加密审查。
## 开发
需要 Node.js ≥ 20。
```
npm install
npm run typecheck # tsc --noEmit
npm run lint # eslint
npm test # vitest
npm run build # build the Chrome/Edge extension into dist/
npm run build:firefox
```
每个 target 都会构建到自己的目录中。还有一个**独立的 Web 应用程序**(离线核心——磁盘 + 纸张——无需安装,数据不离开设备),使用 `npm run build:web` / `npm run dev:web` 构建,并部署到 GitHub Pages。它还兼作独立于扩展程序的恢复工具。
## 文档
| 文档 | 包含的内容 |
| --- | ------------ |
| [为什么选择 StegoShard?](docs/WHY.md) | 解决的问题,以及双模型设计背后的原因。 |
| [适用场景](docs/COMPARISON.md) | 与种子备份、加密归档、VeraCrypt 和隐写工具的引用对比图。 |
| [命令行参考](docs/CLI.md) | 完整的 CLI:保存/恢复,密钥模式,纸张,二进制,Gallery Mode,打包。 |
| [威胁模型](docs/THREAT-MODEL.md) | 对手,每种模型防御什么,以及刻意的非目标。 |
| [格式规范](SPEC.md) | 冻结的磁盘 / 图像格式 (`FORMAT_VERSION = 1`)。 |
| [加密审查档案](docs/CRYPTO-REVIEW.md) | 面向审计员的:声明 → 在哪里强制执行 → 哪个测试证明了它。 |
| [路线图](docs/ROADMAP.md) · [隐私](docs/PRIVACY.md) · [条款](docs/TERMS.md) | 方向,隐私政策,使用条款。 |
| [本地化](docs/LOCALIZATION.md) · [商店指南](docs/STORE.md) · [版本控制](docs/VERSIONING.md) | 翻译设置,商店提交,格式版本策略。 |
| [贡献](CONTRIBUTING.md) · [安全](SECURITY.md) | 如何贡献;如何报告漏洞。 |
## 贡献与安全
请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 和 [SECURITY.md](SECURITY.md)。所有的贡献都要经过带有必需检查(lint、类型检查、测试、构建)的 pull request。请通过 GitHub Security Advisories 私下报告漏洞——千万不要在公开的 issue 中讨论加密。
标签:AI工具, DNS 反向解析, HTTP工具, MITM代理, 信息隐藏, 密码学, 手动系统调用, 抗否认性, 数据加密, 数据可视化, 浏览器扩展, 自动化攻击, 逆向工具, 隐写术