Adilx05/StegoForge
GitHub: Adilx05/StegoForge
一款模块化的 .NET 隐写术平台,支持在图像和音频文件中嵌入、提取隐藏数据,提供 CLI 和 WPF 双界面。
Stars: 0 | Forks: 0
# StegoForge
_最后核对源码日期:2026-03-07 (`0fd7c07`)。_
StegoForge 是一个模块化的 .NET 隐写术平台,用于跨图像和音频载体的可靠、可测试的嵌入与提取工作流。该仓库目前包含可工作的应用服务、生产级格式处理器 (PNG/BMP/WAV)、可用的 CLI 界面、可用的 WPF 桌面工作流以及多项目测试套件。
## 项目概览
该解决方案围绕清晰的边界进行组织:
- **核心契约 (`StegoForge.Core`)**:共享模型、服务抽象和错误契约。
- **应用层 (`StegoForge.Application`)**:用于嵌入/提取/容量/信息查询及策略验证的编排服务。
- **提供者实现**:
- 格式 (`StegoForge.Formats`)
- 加密 (`StegoForge.Crypto`)
- 压缩 (`StegoForge.Compression`)
- 基础设施 (`StegoForge.Infrastructure`)
- **交付应用**:CLI (`StegoForge.Cli`) 和桌面 GUI (`StegoForge.Wpf`)。
- **测试**:单元、集成、CLI 和 WPF 测试项目。
这种结构允许添加新的格式/提供者,而无需将传输/UI 逻辑与隐写术内部细节耦合。
## 支持的格式(当前)
目前已实现并接入嵌入/提取/容量/信息流程:
- PNG (`png-lsb-v1`, `PngLsbFormatHandler`)
- BMP (`bmp-lsb-v1`, `BmpLsbFormatHandler`)
- WAV (`wav-lsb-v1`, `WavLsbFormatHandler`)
这些处理器在 `src/StegoForge.Formats/FormatServiceCollectionExtensions.cs` 中注册,并由 `tests/StegoForge.Tests.Unit/` 和 `tests/StegoForge.Tests.Integration/` 中的单元测试和集成测试覆盖。
未来的格式扩展仍记录在 `docs/roadmap.md` 中。
## 架构概要
采用分层架构:
1. **UI/入口点** (CLI/WPF) 收集用户输入并显示结果。
2. **应用服务** 验证请求并协调编排。
3. **核心抽象/模型** 定义嵌入/提取/容量/信息契约。
4. **提供者实现** (格式/加密/压缩/基础设施) 执行载荷处理和载体字节操作。
参见:
- `docs/architecture.md` 了解组件级详情。
- `docs/payload-format.md` 了解载荷信封结构和版本控制。
## 版本控制基础
StegoForge 现在将 **MinVer** 作为所有项目中语义版本解析的唯一来源。
- 带前缀 `v` 的标签驱动官方版本(例如 `v1.2.0` 或 `v1.3.0-beta.1`)。
- `Version` 根据 `$(MinVerVersion)` 设置,以保持包/显示的一致性。
- `AssemblyVersion` 特意稳定为 `Major.Minor.0.0`,以减少程序集绑定冲突。
- `FileVersion` 是数字型的,映射为 `Major.Minor.Patch.0`,用于 Windows 文件元数据。
- `InformationalVersion` 设置为解析后的语义 `Version`,用于运行时显示界面。
- `AssemblyVersion`/`FileVersion` 是通过解析 `Version` (`X.Y.Z`) 派生的,以便即使在早期评估中 MinVer 组件属性不可用时,也能保持 WPF/WindowsDesktop 构建的稳定性。
在本地构建时 **如果没有匹配的发布标签**,MinVer 会输出一个合理的预发布/开发版本(使用默认的预发布标识符 `alpha.0`),以便贡献者无需手动编辑版本即可进行构建和测试。
## 构建前提条件
- .NET SDK **10.0.100**(固定在 `global.json` 中;CI 使用 `10.0.x` 并启用了预发布功能)。
- Git。
- 构建/运行 WPF (`src/StegoForge.Wpf`) 和 WPF 测试需要 **Windows**。
## 贡献者快速入门
有关完整的贡献流程和策略要求,请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。
## 网站文档和部署
基于 Astro 的项目网站位于 [`website/`](website/)。有关本地开发、内容编辑(英雄区/功能/路线图/链接)以及部署/基础路径详情,请参阅 [`website/README.md`](website/README.md)。
GitHub Pages 部署由 [`.github/workflows/pages.yml`](.github/workflows/pages.yml) 处理,该工作流从 `actions/configure-pages` 设置 `BASE_PATH`,以便生产构建自动使用正确的仓库子路径。对于自定义域,请设置 `BASE_PATH=/`。
从仓库根目录运行。
### 仅 CLI / 核心(跨平台)
此代码块与 CI `core-cli` 使用的还原/构建/测试流程相同。
```
# 恢复
dotnet restore src/StegoForge.Core/StegoForge.Core.csproj
dotnet restore src/StegoForge.Application/StegoForge.Application.csproj
dotnet restore src/StegoForge.Cli/StegoForge.Cli.csproj
dotnet restore tests/StegoForge.Tests.Unit/StegoForge.Tests.Unit.csproj
dotnet restore tests/StegoForge.Tests.Integration/StegoForge.Tests.Integration.csproj
dotnet restore tests/StegoForge.Tests.Cli/StegoForge.Tests.Cli.csproj
# 构建
dotnet build src/StegoForge.Core/StegoForge.Core.csproj --configuration Release --no-restore
dotnet build src/StegoForge.Application/StegoForge.Application.csproj --configuration Release --no-restore
dotnet build src/StegoForge.Cli/StegoForge.Cli.csproj --configuration Release --no-restore
dotnet build tests/StegoForge.Tests.Unit/StegoForge.Tests.Unit.csproj --configuration Release --no-restore
dotnet build tests/StegoForge.Tests.Integration/StegoForge.Tests.Integration.csproj --configuration Release --no-restore
dotnet build tests/StegoForge.Tests.Cli/StegoForge.Tests.Cli.csproj --configuration Release --no-restore
# 测试
dotnet test tests/StegoForge.Tests.Unit/StegoForge.Tests.Unit.csproj --configuration Release --no-build
dotnet test tests/StegoForge.Tests.Integration/StegoForge.Tests.Integration.csproj --configuration Release --no-build
dotnet test tests/StegoForge.Tests.Cli/StegoForge.Tests.Cli.csproj --configuration Release --no-build
```
### 仅 WPF(仅限 Windows)
此代码块与 CI `wpf` 使用的还原/构建/测试流程相同。
```
# 恢复
dotnet restore src/StegoForge.Wpf/StegoForge.Wpf.csproj
dotnet restore tests/StegoForge.Tests.Wpf/StegoForge.Tests.Wpf.csproj
# 构建
dotnet build src/StegoForge.Wpf/StegoForge.Wpf.csproj --configuration Release --no-restore
dotnet build tests/StegoForge.Tests.Wpf/StegoForge.Tests.Wpf.csproj --configuration Release --no-restore
# 测试
dotnet test tests/StegoForge.Tests.Wpf/StegoForge.Tests.Wpf.csproj --configuration Release --no-build
```
### 完整解决方案(仅限 Windows)
`StegoForge.sln` 包含 WPF 项目/测试,因此请在 Windows 上使用此选项。
```
dotnet restore StegoForge.sln
dotnet build StegoForge.sln --configuration Release
dotnet test StegoForge.sln --configuration Release
```
## CI/发布命令映射
| 本地命令集 | 工作流映射 |
| --- | --- |
| 上方的 CLI/核心 还原/构建/测试代码块 | `.github/workflows/ci.yml` → `core-cli` (`Restore core/CLI projects`, `Build core/CLI projects`, `Test core/CLI projects`) |
| 上方的 WPF 还原/构建/测试代码块 | `.github/workflows/ci.yml` → `wpf` (`Restore WPF projects`, `Build WPF projects`, `Test WPF smoke project`) |
| `dotnet publish src/StegoForge.Cli/StegoForge.Cli.csproj --configuration Release --output artifacts/cli` | `.github/workflows/release.yml` → `package-cli` → `Publish CLI` |
| `dotnet publish src/StegoForge.Wpf/StegoForge.Wpf.csproj --configuration Release --output artifacts/wpf` | `.github/workflows/release.yml` → `package-wpf` → `Publish WPF` |
| `sha256sum ` / `Get-FileHash -Algorithm SHA256` | `.github/workflows/release.yml` → `package-cli` / `package-wpf` → 校验和清单生成 + 上传前验证 |
| `cosign sign-blob ...` + `cosign verify-blob ...` | `.github/workflows/release.yml` → `package-cli` / `package-wpf` → 分离签名生成 + 上传前签名验证 |
环境注意事项:
- WPF 构建/测试/发布需要 Windows。
- 全面加固模糊测试活动 (`Campaign=Fuzz-Full`) 在 CI 中特意设为仅计划执行,在本地运行可能耗时较长。
## 发布流程
StegoForge 对所有带标签的发布使用 **语义版本控制**。
### 版本号递增规则 (SemVer 策略)
- **主版本号 (`X.0.0`)**:在引入破坏性的 API/契约/行为更改时递增(包括 CLI 契约中断、载荷格式不兼容或不兼容的默认值)。
- **次版本号 (`X.Y.0`)**:在向后兼容的功能和新增能力时递增。
- **修订号 (`X.Y.Z`)**:在向后兼容的错误修复、加固和不改变公共契约的仅文档发布调整时递增。
如果在 MINOR/PATCH 之间不确定,仅当增加了用户可观察到的能力时才默认为 MINOR;否则使用 PATCH。
### 标签格式
- 发布标签 **必须** 使用确切格式 `vX.Y.Z`(例如:`v1.2.3`)。
- 工作流会验证标签和版本元数据,如果 `tag != v{version}` 则会失败。
### 变更日志要求
- 每次发布必须在打标签前更新 `CHANGELOG.md`。
- 为发布版本和日期添加专门的标题,并附上分类要点(如适用,包括 Added/Changed/Fixed/Security)。
- 为每个发布包含一个 **迁移说明** 小节;如果不需要任何操作,请明确说明 `None`。
- 发布工作流会验证发布版本在 `CHANGELOG.md` 中是否有对应的部分,并且已提供变更日志摘要作为工作流元数据。
### 发布工件完整性验证
每次发布会发布确定性的工件名称、校验和清单和分离签名:
- `stegoforge-cli-vX.Y.Z-linux-x64.tar.gz`
- `stegoforge-cli-vX.Y.Z-linux-x64.sha256`
- `stegoforge-cli-vX.Y.Z-linux-x64.tar.gz.sig`
- `stegoforge-cli-vX.Y.Z-linux-x64.sha256.sig`
- `stegoforge-wpf-vX.Y.Z-windows-x64.zip`
- `stegoforge-wpf-vX.Y.Z-windows-x64.sha256`
- `stegoforge-wpf-vX.Y.Z-windows-x64.zip.sig`
- `stegoforge-wpf-vX.Y.Z-windows-x64.sha256.sig`
- `stegoforge-cosign.pub`
验证校验和:
```
sha256sum --check stegoforge-cli-vX.Y.Z-linux-x64.sha256
```
```
$line = Get-Content .\stegoforge-wpf-vX.Y.Z-windows-x64.sha256 -Raw
$parts = $line.Split('*', 2)
$expected = $parts[0].Trim().ToLowerInvariant()
$actual = (Get-FileHash -Path $parts[1].Trim() -Algorithm SHA256).Hash.ToLowerInvariant()
if ($expected -ne $actual) { throw "Checksum verification failed." }
```
验证签名:
```
cosign verify-blob --key stegoforge-cosign.pub --signature stegoforge-cli-vX.Y.Z-linux-x64.tar.gz.sig stegoforge-cli-vX.Y.Z-linux-x64.tar.gz
cosign verify-blob --key stegoforge-cosign.pub --signature stegoforge-cli-vX.Y.Z-linux-x64.sha256.sig stegoforge-cli-vX.Y.Z-linux-x64.sha256
```
```
cosign verify-blob --key .\stegoforge-cosign.pub --signature .\stegoforge-wpf-vX.Y.Z-windows-x64.zip.sig .\stegoforge-wpf-vX.Y.Z-windows-x64.zip
cosign verify-blob --key .\stegoforge-cosign.pub --signature .\stegoforge-wpf-vX.Y.Z-windows-x64.sha256.sig .\stegoforge-wpf-vX.Y.Z-windows-x64.sha256
```
信任锚和密钥轮换指南:
- `stegoforge-cosign.pub` 是分离签名的发布验证信任锚。
- 在信任新密钥之前,请验证发布说明中公布的密钥指纹是否与 `stegoforge-cosign.pub` 匹配。
- 在密钥轮换期间,至少在一个发布周期内保持重叠(发布旧密钥 + 新密钥),然后在随后的发布说明中停用旧密钥。
- 如果发生紧急密钥撤销,请将被撤销密钥的签名视为不受信任,并仅依赖使用替换密钥重新签名的工件。
特定平台的签名限制:
- Windows Authenticode 签名(通过仓库机密配置时)仅覆盖已签名的 Windows 可执行文件,不证明 Linux/macOS 工件。
- 跨平台完整性由 SHA-256 清单和针对工件及校验和文件的 cosign 分离签名提供。
## CLI 命令状态
已实现的根命令:
- `embed`
- `extract`
- `capacity`
- `info`
- `version`
- `help`
快速示例:
```
# 将 payload 嵌入 carrier
dotnet run --project src/StegoForge.Cli -- embed --carrier in.png --payload secret.bin --out out.png
# 提取 payload
dotnet run --project src/StegoForge.Cli -- extract --carrier out.png --out recovered.bin
# 估算容量和 embeddability
dotnet run --project src/StegoForge.Cli -- capacity --carrier in.png --payload 1024
# 检查 carrier metadata
dotnet run --project src/StegoForge.Cli -- info --carrier out.png
# 打印版本/help
dotnet run --project src/StegoForge.Cli -- version
dotnet run --project src/StegoForge.Cli -- help
```
诊断模式:
- `--quiet` 用于最少的面向用户输出。
- `--verbose` 用于扩展的操作细节。
- `--json` 用于机器可读的诊断/错误契约。
格式错误/损坏的输入处理是确定性的:失败映射到稳定的 `StegoErrorCode` 值和可预测的进程退出代码,因此脚本可以根据格式错误的头部/载荷条件可靠地进行分支。
## WPF 状态(当前)
**现已可用(里程碑 11):**
- 嵌入和提取视图已实现并连接到应用服务。
- WPF 测试覆盖了验证、命令启用、进度生命周期和确定性错误映射。
- Windows CI 会还原/构建/测试 WPF 应用和测试项目。
**发布就绪范围(当前):**
- 里程碑 14 关于发布流程加固和打包/签名验证指南的文档已在 `README.md`、`docs/building.md` 和 `docs/testing.md` 中完成。
- 超出当前嵌入/提取工作流的未来 UX 扩展仍由路线图驱动。
详情请参阅 `docs/gui.md` 和 `docs/roadmap.md`。
## 按里程碑划分的当前状态
与 `docs/roadmap.md` 检查清单对齐:
| 里程碑 | 状态摘要 |
| --- | --- |
| 1 — Solution scaffolding | ✅ 完成 |
| 2 — Core contract finalization | ✅ 完成 |
| 3 — Payload envelope v1 | ✅ 完成 |
| 4 — Compression provider integration | ✅ 完成 |
| 5 — Crypto provider integration | ✅ 完成 |
| 6 — PNG format handler (v1) | ✅ 完成 (`png-lsb-v1`) |
| 7 — BMP format handler | ✅ 完成 (`bmp-lsb-v1`) |
| 8 — WAV format handler | ✅ 完成 (`wav-lsb-v1`) |
| 9 — Application orchestration and policy rules | ✅ 完成 |
| 10 — CLI command surface v1 | ✅ 完成 |
| 11 — WPF GUI v1 | ✅ 完成 |
| 12 — Hardening and robustness | ✅ 大部分已实现并积极测试中 |
| 13 — Documentation and developer experience | ✅ 完成 |
| 14 — Release readiness (v1.0) | ✅ 文档和发布门控标准已定稿 |
## 里程碑 12:加固和安全诊断
里程碑 12 将质量关口从正确性扩展到了对抗弹性和操作员安全诊断。
### 模糊测试和负面路径范围
- 序列化器、载荷信封和载体处理器的模糊测试活动包括确定性的有界 PR 覆盖率和更深入的夜间活动。
- 负面路径覆盖率明确针对截断、损坏的长度字段、无效标志、不支持的格式组合和取消行为。
- 加固测试同时断言类型化异常类和映射的 `StegoErrorCode` 结果,以实现确定性的失败语义。
### 资源使用限制和可配置保障措施
- 处理限制(`MaxPayloadBytes`、`MaxBytes`、`MaxEnvelopeBytes`、可选的 `MaxCarrierSizeBytes`)被视为一等安全控制,而非可选的附加项。
- 限制检查发生在昂贵的分配/解压缩路径之前,以减少因格式错误的载体而导致的内存压力和拒绝服务风险。
- 贡献者应渐进地调整限制,并保持 CI 默认值保守;更大的阈值应属于专用的压力/模糊测试环境。
### 秘密安全诊断策略
- 诊断默认经过清理,同时保留操作上下文和关联标识符以提供支持能力。
- 敏感材料(密码、明文载荷字节、派生密钥)始终从 CLI/UI/日志输出中删除。
- 面向用户的错误保持可操作性但不包含秘密,内部故障通过稳定的代码/消息契约呈现。
交叉参考:[docs/testing.md#ci-hardening-strategy](docs/testing.md#ci-hardening-strategy)、[docs/testing.md#hardening-and-cancellation-test-guidance](docs/testing.md#hardening-and-cancellation-test-guidance)、[docs/architecture.md#processing-hardening-limits](docs/architecture.md#processing-hardening-limits) 以及 [docs/architecture.md#security-logging-policy](docs/architecture.md#security-logging-policy)。
## 安全与滥用说明
StegoForge 严格 intended 用于合法用途,例如水印、数据溯源、安全归档工作流程和教育研究。项目范围不包括恶意软件隐藏和未经授权的逃避活动。
### 允许/预期用途
- 在合法授权下保护敏感信息。
- 嵌入可追溯的所有权/来源标记。
- 经明确许可进行的内部测试和红队演习。
### 禁止/滥用场景
- 隐藏恶意软件、命令和控制指令或数据外泄载荷。
- 绕过法律控制、策略控制或取证监控。
- 任何非法监视、骚扰或未经授权的数据访问。
### 设计护栏
- 确定性的错误契约和显式的失败模式。
- 对提取载荷的完整性验证。
- 版本化的载荷帧结构,用于安全的向后兼容性处理。
- CLI/UI 工作流中的审计友好命令日志(在可行的情况下)。
有关质量和治理里程碑,请参阅 `docs/testing.md` 和 `docs/roadmap.md`。
## 文档验证
- 文档验证发布版本:**2026-03-07T00:00:00Z**(里程碑 14 文档完成通过,涵盖 `README.md` 和 `docs/`)。
标签:BMP处理, DNS 反向解析, DNS枚举, DNS解析, LSB隐写, PNG处理, Steganography, StegoForge, WAV处理, WPF, 信息隐藏, 图片隐写, 开源项目, 数据嵌入, 文件隐藏, 文档结构分析, 桌面应用, 网络安全, 网络安全工具, 隐写术, 隐私保护, 音频隐写