HireforFire/stegabyte
GitHub: HireforFire/stegabyte
一个完全在浏览器中运行的隐私优先的 PNG 图像隐写与 AES-256-GCM 加密平台,无需后端即可实现消息的隐藏与提取。
Stars: 0 | Forks: 0
# Stegabyte
Stegabyte 是一个完全在浏览器中运行的隐私优先的隐写平台。使用最低有效位(LSB)编码将 AES-256-GCM 密文隐藏在 PNG 图像中。任何明文、密码或载体图像都不会离开你的设备。
[](LICENSE)
[](#architecture)
[](#tests)
[](tsconfig.json)
**在线演示:** _即将推出_
## 目录
- [为什么选择 Stegabyte?](#why-stegabyte)
- [功能](#features)
- [架构](#architecture)
- [工作原理](#how-it-works)
- [安全模型](#security-model)
- [技术栈](#tech-stack)
- [快速开始](#getting-started)
- [脚本](#scripts)
- [测试](#tests)
- [部署](#deployment)
- [法律条款](#legal)
- [路线图](#roadmap)
- [贡献](#contributing)
- [许可证](#license)
## 为什么选择 Stegabyte?
大多数“安全通讯”工具都依赖于服务器。Stegabyte 没有服务器。它以静态资源包的形式发布,在你的浏览器中运行,并直接使用平台的 `SubtleCrypto` 接口。再加上图像 LSB 隐写术,消息的存在本身就会变得与其内容一样隐秘。
- **无后端。** 没有可传唤的数据,也没有可被攻破的服务器。
- **无第三方脚本。** 严格的 CSP 会拦截除你源点之外的所有内容。
- **无遥测。** 没有 cookies,没有分析,没有追踪像素。
- **可审计。** 整个代码库足够精简,在一个周末内即可读完。
## 功能
| 功能 | 描述 |
| ---------------------- | ------------------------------------------------------------------ |
| AES-256-GCM | 行业标准的认证加密 |
| PBKDF2 (SHA-512, 600k) | 使用每张图像独立的 32 字节盐值进行强密钥拉伸 |
| PNG LSB 嵌入 | 3 通道位级嵌入(R、G、B;保留 alpha 通道) |
| Web Worker 加密 | 离开主线程的 SubtleCrypto —— 保持 UI 流畅 |
| 取证分析 | 熵、LSB 嫌疑度、直方图、容量、payload 检测 |
| 严格 CSP | 开发/生产环境分离,`upgrade-insecure-requests`,禁用 `'unsafe-eval'` |
| 零遥测 | 无 cookies,无分析,无服务器 |
| 无障碍 | 键盘导航、ARIA、焦点陷阱、减少动态效果支持 |
| 严格 TypeScript | 启用 `strict`、`noUncheckedIndexedAccess`、`exactOptionalPropertyTypes` |
| 液态玻璃美学 | 极简的黑 + 靛 + 青配色 UI |
## 架构
```
src/
├── app/ # Next.js App Router pages
│ ├── layout.tsx # Root layout (sidebar, navbar, mobile drawer)
│ ├── page.tsx # Landing page
│ ├── encrypt/ # /encrypt
│ ├── extract/ # /extract
│ ├── analyze/ # /analyze
│ ├── dashboard/ # /dashboard
│ ├── settings/ # /settings
│ ├── about/ # /about
│ ├── privacy/ # /privacy
│ ├── terms/ # /terms
│ ├── security/ # /security
│ ├── license/ # /license
│ └── not-found.tsx # 404
├── components/
│ ├── ui/ # Reusable UI primitives (button, glass-panel, input, ...)
│ ├── layout/ # Sidebar, navbar, command palette, mobile drawer
│ └── landing/ # Landing page composition
├── features/ # Feature-scoped page logic (encrypt, extract, analyze, ...)
├── hooks/ # React hooks (use-crypto-worker, use-focus-trap, ...)
├── lib/
│ ├── crypto/ # AES-256-GCM + PBKDF2 (encrypt.ts — pure, worker-safe)
│ ├── stego/ # PNG LSB encoder/decoder
│ │ ├── png-lsb-core.ts # Pure encode/decode (no DOM)
│ │ └── png-lsb.ts # DOM/Canvas wrapper
│ └── utils.ts # cn(), formatBytes(), hex helpers
├── stores/ # Zustand stores (encrypt)
├── styles/ # Tailwind + globals.css
├── types/ # TypeScript types (crypto, stego)
├── workers/ # Web Workers (stegabyte-crypto.worker.ts)
└── lib/stego/wasm-loader.ts # Lazy-loads the Rust-compiled WASM core
crates/
└── stegabyte-stego-core/ # Rust crate compiled to WebAssembly
```
`lib/crypto/` 和 `lib/stego/png-lsb-core.ts` 中的纯核心特意与感知 DOM 的包装器分离,这样就可以在不改变 API 的情况下将其替换为 WebAssembly 模块。**Rust 编译的 WASM 核心开箱即用**,并在每个涉及 PNG 的页面上透明地加速 `encode`、`decode`、`entropy`、`lsbSuspicion` 和 `histogram`。在 WebAssembly 不可用的环境中,会自动运行纯 JS 回退方案。具体数据请参阅 [`docs/BENCHMARKS.md`](docs/BENCHMARKS.md)。
## 工作原理
### 加密 pipeline
1. **密钥派生** — 使用每张图像独立的 32 字节盐值的 PBKDF2-SHA512 对用户的密码进行拉伸(60 万次迭代)。
2. **加密** — 使用全新的 12 字节 IV 的 AES-256-GCM 对明文进行加密。
3. **打包** — IV + salt + ciphertext 被拼接成一个单一的字节串。
4. **头部** — 14 字节的 `CRYX` 头部编码了格式版本、payload 长度和原始明文长度。
5. **嵌入** — 头部 + payload 字节被拆分为位,并被写入载体图像的 R、G、B LSB 中(alpha 通道保持不变)。
6. **渲染** — 修改后的像素缓冲区通过 Canvas 渲染,生成全新的 PNG `Blob`。
### 解密 pipeline
1. **LSB 解码** — 从 LSB 流中读回 14 字节的 `CRYX` 头部和 payload 字节。
2. **Bundle 提取** — 将恢复的 bundle 拆分为 IV、salt 和 ciphertext。
3. **密钥重派生** — 使用恢复的 salt 和用户密码的 PBKDF2 生成相同的密钥。
4. **AES-GCM 解密** — 认证解密可恢复明文并验证完整性。篡改图像会导致解密明确失败。
### 隐写格式
```
HEADER (14 bytes)
[0..3] Magic "CRYX"
[4..5] Version (uint16 LE)
[6..9] Payload length (uint32 LE)
[10..13] Original plaintext length (uint32 LE)
PAYLOAD (variable)
IV (12 bytes) | Salt (32 bytes) | AES-GCM ciphertext
```
## 安全模型
- **无后端。** 该应用是一个静态资源包。没有服务端状态,没有用于处理用户数据的 API 路由,没有分析端点。
- **Web Crypto API。** 所有原语(PBKDF2、AES-GCM、SHA-256)均来自浏览器的 `SubtleCrypto` 接口。不加载任何第三方加密库。
- **严格 CSP。** `default-src 'self'`,`connect-src 'self'`,`frame-ancestors 'none'`,HSTS preload,`X-Frame-Options: DENY`,启用 COEP/COOP,开发/生产 CSP 分离(生产环境移除 `unsafe-eval`)。
- **每张图像独立的盐值。** 不同图像中的相同消息会产生不相关的密文。salt 是通过 `crypto.getRandomValues` 生成的。
- **认证加密。** AES-GCM 保证机密性和完整性;篡改图像会导致解密明确失败。
- **零遥测。** 没有 cookies,没有分析,没有第三方脚本。
- **Permissions-Policy。** 明确禁用了 22 项功能,以限制嵌入式 iframe(目前没有,但属于纵深防御)可能发起的请求。
### Stegabyte 无法防范的威胁
- **忘记密码。** PBKDF2 使得暴力破解变得不切实际,因此丢失密码就意味着丢失消息。请妥善保管密码。
- **受过训练的隐写分析。** LSB 隐写术可以通过统计分析被检测到。Stegabyte 提供了 LSB 嫌疑度指标,让你能看到分析人员会看到的情况。
- **有损重压缩。** PNG 是无损的,但转换为 JPEG 会破坏 payload。Stegabyte 仅支持 PNG 载体。
- **被入侵的设备。** Stegabyte 在你的浏览器中运行;如果你的 OS 或浏览器已经被入侵,没有任何客户端工具能拯救你。
## 技术栈
| 层级 | 工具 |
| ------------- | ------------------------------------- |
| 框架 | Next.js 16 (App Router) + React 19 |
| 语言 | TypeScript (严格模式) |
| 样式 | Tailwind CSS 3 + CSS 变量 |
| UI 原语 | 手写兼容 shadcn 的组件 |
| 图标 | Lucide |
| 状态 | Zustand |
| 表单 | React Hook Form + Zod |
| 加密 | Web Crypto API (SubtleCrypto) |
| 隐写术 | Canvas API + Rust 编译的 WASM 核心 |
| 测试 | Vitest + Testing Library + Playwright |
| Lint/格式化 | ESLint + Prettier |
## 快速开始
### 前置条件
- Node.js >= 20.9(参见 `.nvmrc`)
- npm >= 10
### 安装
```
npm install
```
### 开发
```
npm run dev # http://localhost:3000
```
### 生产构建
```
npm run build
npm start
```
## 脚本
| 命令 | 作用 |
| -------------------------- | ------------------------------------------------ |
| `npm run dev` | 启动开发服务器 |
| `npm run build` | 生产环境构建 |
| `npm start` | 运行生产环境构建 |
| `npm test` | 运行一次 Vitest 单元测试 |
| `npm run test:watch` | 在 watch 模式下运行 Vitest |
| `npm run test:coverage` | 运行 Vitest 并生成 v8 覆盖率 |
| `npm run test:e2e` | 运行 Playwright e2e 测试(需要先执行 `test:e2e:install`) |
| `npm run test:e2e:install` | 安装 Playwright 浏览器 |
| `npm run lint` | 运行 ESLint |
| `npm run lint:fix` | 运行带 `--fix` 的 ESLint |
| `npm run typecheck` | 运行 `tsc --noEmit` |
| `npm run format` | 运行 Prettier `--write` |
| `npm run check` | 运行 lint + typecheck + 测试 |
## 测试
8 个文件中共有 92 个单元测试。覆盖率报告通过 `npm run test:coverage` 生成,并会暴露任何回归问题。覆盖率亮点:
- `lib/crypto/encrypt.ts` — 100%
- `lib/stego/png-lsb-core.ts` — ~99%
- `lib/utils.ts` — ~86%
E2E 测试 (Playwright) 覆盖了完整的 UI 正常路径:加密 → 提取的往返过程。
## 部署
Stegabyte 配置为支持在 [Vercel](https://vercel.com) 上一键部署。
```
vercel deploy --prod
```
完整的部署指南 —— GitHub 仓库设置、环境变量、自定义域名、部署后验证 —— 位于 [`DEPLOY.md`](DEPLOY.md) 中。简短版本如下:
- `vercel.json` 和 `next.config.ts` 在 Next.js 层和 Vercel 边缘节点配置了框架(`nextjs`)、区域(`iad1`)以及安全响应头(CSP、HSTS、X-Frame-Options、COEP、COOP、CORP、Permissions-Policy)。
- 没有必需的密钥。唯一可选的环境变量是 `NEXT_PUBLIC_SITE_URL`(用作 OG 标签的 `metadataBase`)。
- WASM 构件被提交在 `public/wasm/` 下,因此 Vercel 可以在没有 Rust 工具链的情况下进行构建。
## 法律条款
- [隐私政策](/privacy) — 我们(不)收集什么
- [服务条款](/terms) — 使用条款
- [安全](/security) — 威胁模型 + 负责任的披露政策
- [许可证](/license) — MIT
如需了解权威的披露政策,请参阅 [`SECURITY.md`](SECURITY.md)。
## 路线图
### v1.0 (当前)
- PNG LSB 隐写术
- AES-256-GCM + PBKDF2-SHA512(60 万次迭代)
- Web Worker 加密(离开主线程)
- 取证分析(熵、LSB 嫌疑度、直方图、容量)
- 仪表板、加密、提取、分析、设置、关于
- Rust 编译的 WebAssembly 隐写核心(带 JS 回退)
- `/benchmark` 页面,用于在真实浏览器中进行 WASM 与 JS 的对比
- 102 个单元测试 + Playwright e2e
- 严格的 CSP、COEP/COOP、无障碍审计
### v1.1
- BMP 载体支持
- WAV 载体支持(16 位 PCM)
- 额外的图像格式
### v1.2
- 二维码嵌入(像素级完美叠加)
- 零宽 Unicode 文本编码
- 批量处理(多图像/文件)
### v2.0
- 安全的本地保险库(IndexedDB,加密)
- 热力图可视化
- 元数据擦除工具
- PWA + 离线模式
- 对 LSB 热点路径进行 SIMD128 加速(Rust target-feature)
- 用于社区格式的插件 API
## 许可证
MIT。详情请参阅 [`LICENSE`](LICENSE)。
版权所有 (c) 2026 Stegabyte 贡献者。
用心打造,献给关心隐私的你。
标签:AI工具, DNS 反向解析, Rust, WebAssembly, 前端, 可视化界面, 密码学, 手动系统调用, 特征检测, 网络安全, 网络流量审计, 自动化攻击, 隐写术, 隐私保护