HireforFire/stegabyte

GitHub: HireforFire/stegabyte

一个完全在浏览器中运行的隐私优先的 PNG 图像隐写与 AES-256-GCM 加密平台,无需后端即可实现消息的隐藏与提取。

Stars: 0 | Forks: 0

# Stegabyte Stegabyte 是一个完全在浏览器中运行的隐私优先的隐写平台。使用最低有效位(LSB)编码将 AES-256-GCM 密文隐藏在 PNG 图像中。任何明文、密码或载体图像都不会离开你的设备。 [![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE) [![Browser-Only](https://img.shields.io/badge/browser-only-22d3ee)](#architecture) [![Tests](https://img.shields.io/badge/tests-92%20passing-emerald)](#tests) [![TypeScript](https://img.shields.io/badge/TypeScript-strict-3178c6)](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, 前端, 可视化界面, 密码学, 手动系统调用, 特征检测, 网络安全, 网络流量审计, 自动化攻击, 隐写术, 隐私保护