| Crates.io | secra-pluginctl |
| lib.rs | secra-pluginctl |
| version | 0.2.0 |
| created_at | 2025-12-24 13:26:13.703914+00 |
| updated_at | 2025-12-24 13:26:13.703914+00 |
| description | 生产级插件打包工具 - 安全可信的插件产物管理(支持加密、签名、并发处理) |
| homepage | https://github.com/BadassFree/secra-pluginctl |
| repository | https://github.com/BadassFree/secra-pluginctl |
| max_upload_size | |
| id | 2003170 |
| size | 116,310 |
生产级、安全可信的插件打包工具 - Production-Grade Secure Plugin Packaging Tool
ring 加密库,支持 AES-256-GCM 加密和 Ed25519 数字签名.spk 二进制文件cargo install secra-pluginctl
# 1. 初始化配置文件
pluginctl init --name com.example.my-plugin
# 2. 编辑 plugin.toml 配置文件
# 3. 生成密钥对
pluginctl keygen
# 4. 打包插件
pluginctl pack
# 5. 验证产物
pluginctl verify --input dist/my-plugin.spk --public-key public_key.pem
# 6. 解包(需要公钥验证)
pluginctl unpack --input dist/my-plugin.spk --output unpacked --public-key public_key.pem
use secra_pluginctl::{PluginConfig, Packer};
fn main() -> anyhow::Result<()> {
// 从配置文件加载
let config = PluginConfig::from_file("plugin.toml")?;
// 构建打包器
let packer = Packer::new(config)?;
// 执行打包
let output_path = packer.pack("output.spk")?;
println!("打包成功: {}", output_path.display());
Ok(())
}
[metadata]
name = "com.example.my-plugin"
version = "1.0.0"
description = "插件描述"
authors = ["Your Name <email@example.com>"]
# 依赖项(可选)
[metadata.dependencies]
example-lib = "^1.0.0"
[build]
input = "./src"
output_dir = "./dist"
include = ["**/*"]
exclude = ["**/node_modules/**", "**/.git/**"]
[build.compression]
enabled = true
level = 10 # 1-22
[crypto]
private_key = "private_key.pem"
system_public_key = "public_key.pem"
┌────────────────────────────────────────┐
│ Magic Header: "SECRAPKG" │ 8 bytes
├────────────────────────────────────────┤
│ Format Version: u32 │ 4 bytes
├────────────────────────────────────────┤
│ Metadata Length: u32 │ 4 bytes
├────────────────────────────────────────┤
│ Metadata (JSON) │
│ - package_id (UUID) │
│ - name, version, authors │
│ - created_at, dependencies │
│ - file manifest, signatures │
├────────────────────────────────────────┤
│ Encrypted Data (AES-256-GCM) │
│ - Compressed payload (zstd) │
│ - All file contents │
└────────────────────────────────────────┘
| 命令 | 说明 |
|---|---|
init |
初始化配置文件 |
pack |
打包插件 |
unpack |
解包插件(需要公钥验证) |
keygen |
生成密钥对 |
verify |
验证插件签名 |
inspect |
检查插件内容(列出文件列表并验证格式) |
# 创建插件项目并初始化配置
pluginctl init --name com.example.my-plugin
这会创建一个 plugin.toml 配置文件,包含基本的项目元数据和构建配置。
编辑 plugin.toml 文件,设置以下内容:
# 生成 Ed25519 密钥对
pluginctl keygen
# 这会生成两个文件:
# - private_key.pem: 私钥(用于签名和加密)
# - public_key.pem: 公钥(用于验证)
安全提示: 请妥善保管私钥,不要将其提交到版本控制系统。
# 使用默认配置打包
pluginctl pack
# 或者指定配置文件
pluginctl pack --config custom.toml
# 打包后的文件会输出到配置中指定的 output_dir 目录
打包过程会:
.spk 文件# 验证插件签名和完整性
pluginctl verify --input dist/my-plugin.spk --public-key public_key.pem
验证会检查:
# 查看插件内容(不需要私钥)
pluginctl inspect --input dist/my-plugin.spk
这会列出:
# 解包插件到指定目录(需要公钥验证)
pluginctl unpack \
--input dist/my-plugin.spk \
--output unpacked \
--public-key public_key.pem
解包过程会:
在 plugin.toml 中配置:
[build.compression]
enabled = true
level = 15 # 1-22,数字越大压缩率越高但速度越慢
[build]
include = ["**/*.js", "**/*.css", "**/*.html"] # 只包含特定类型文件
exclude = ["**/test/**", "**/*.map", "**/.DS_Store"] # 排除测试文件和临时文件
use secra_pluginctl::{PluginConfig, Packer, Unpacker};
// 打包
let config = PluginConfig::from_file("plugin.toml")?;
let packer = Packer::new(config)?;
let output = packer.pack("output.spk")?;
// 解包
let public_key = std::fs::read("public_key.pem")?;
let unpacker = Unpacker::new("output.spk", &public_key)?;
unpacker.unpack("unpacked_dir")?;
Q: 打包时提示找不到密钥文件?
A: 确保 plugin.toml 中的 crypto.private_key 路径正确,或使用 keygen 命令生成密钥对。
Q: 如何更新插件版本?
A: 修改 plugin.toml 中的 metadata.version 字段,然后重新打包。
Q: 可以打包多个目录吗?
A: 当前版本支持单个输入目录,可以使用符号链接或构建脚本合并多个目录。
Q: 解包时需要私钥吗?
A: 不需要,解包只需要公钥进行验证。私钥仅用于打包时的签名和加密。
| 组件 | 技术 | 理由 |
|---|---|---|
| 加密/签名 | ring |
BoringSSL 基础,经过严格审计 |
| 压缩 | zstd |
现代压缩算法,速度和压缩比最优 |
| 并发 | rayon |
数据并行,充分利用多核 |
| 文件匹配 | globset |
高效的 Glob 模式匹配 |
| 序列化 | serde |
Rust 生态标准 |
| CLI | clap |
现代 CLI 框架 |
# 构建
cargo build --release
# 测试
cargo test
# 运行示例
cargo run --example basic
# 打包
cargo package
MIT License - 详见 LICENSE 文件
欢迎提交 Issue 和 Pull Request!
注意: 本工具主要用于内部使用,生产环境使用前请确保实现完整的 RSA-OAEP 密钥加密方案。