duriantaco/hush2

GitHub: duriantaco/hush2

一款面向开发者的本地加密密钥管理工具,解决密钥明文暴露与审计缺失问题。

Stars: 1 | Forks: 0

# hush2 `hush2` 是为终端用户开发者设计的本地、安全的密钥运行工具。 它将密钥存储在 AES-256-GCM 加密的 SQLite 保险库中,作为环境变量注入到子进程中,默认情况下屏蔽密钥值,并在旧版保险库数据损坏时提供恢复工具。 最直接的用例是:运行部署脚本、迁移、测试框架或由代理编写的命令时,仅注入所需密钥,而无需将值粘贴到提示符、shell 历史记录或明文 `.env` 文件中。 ## 为何使用 hush2 - 将 API 密钥、数据库 URL 和令牌排除在提示符、shell 历史记录和明文 `.env` 文件之外。 - 在运行时提供密钥以运行代理编写的命令,而不是将值粘贴到聊天中。 - 使用 `hush2 NAME -- cmd` 仅注入请求的密钥,或使用 `hush2 run` 注入当前活动的保险库。 - 默认屏蔽子进程输出中的密钥值。 - 扫描代码库以发现保险库中的真实密钥泄露。 - 使用 `hush2 doctor` 从旧版混合密钥损坏中恢复。 ## 最佳适用场景 - 主要在终端中工作的独立开发者和小型团队。 - AI 辅助或代理驱动的工作流,其中命令执行频繁但密钥处理存在风险。 - 希望获得明确密钥来源和可审计性的本地开发环境。 `hush2` 不是托管的团队密钥平台。它是一个本地开发者工具,专注于在单机上实现安全运行时注入、屏蔽、扫描和恢复。 ## 功能特性 - 每个项目独立的加密保险库:`.hush2/envs//vault.db` - 可选的全球保险库:`~/.hush2/envs//vault.db` - 静态存储使用 AES-256-GCM 加密 - 使用 PBKDF2-HMAC-SHA256 进行密钥派生,每个保险库使用独立盐值 - 在可用时通过操作系统钥匙串进行密码查找 - `HUSH2_PASSWORD` 作为 CI、无头 Shell 或无钥匙链支持设备的备用方案 - 将密钥注入子进程并屏蔽标准输出/标准错误 - 密钥历史记录与回滚 - 密钥标签与标签过滤执行 - 导入与导出 `.env` 文件 - 密钥生成 - 审计日志 - 精确值密钥扫描并可选熵检测 - 备份、恢复与保险库修复诊断 ## 安装 从本地代码库安装: ``` pipx install . ``` 或使用 `uv`: ``` uv tool install . ``` 或使用纯 `pip`: ``` python -m pip install . ``` 开发模式安装: ``` python -m pip install -e '.[dev]' ``` ## 快速开始 核心工作流程如下: 1. 为当前项目创建保险库。 2. 保存命令实际需要的密钥。 3. 通过 `hush2` 运行命令。 在当前项目中创建保险库: ``` hush2 init ``` 添加密钥: ``` hush2 set OPENAI_API_KEY sk-live-abc123 hush2 set DATABASE_URL postgres://user:pass@host/db --tag db --tag prod ``` 读取或列出密钥: ``` hush2 get OPENAI_API_KEY hush2 list hush2 list --tag prod ``` 运行并注入密钥的命令: ``` hush2 run ./deploy.sh hush2 OPENAI_API_KEY DATABASE_URL -- python app.py ``` 对于代理编写的命令,优先使用显式模式: ``` hush2 OPENAI_API_KEY -- python agent_task.py ``` 这样可以保持密钥选择范围狭窄,并使来源在审计日志中清晰可查。 检查保险库健康状态: ``` hush2 doctor ``` ## 信任清单 在依赖 `hush2` 之前,请完成以下操作一次: ``` hush2 doctor hush2 scan --staged hush2 backup ``` - `doctor` 确认保险库可读且认证元数据健康。 - `scan --staged` 检查暂存更改是否存在精确密钥泄露。 - `backup` 在进行大型迁移或导入前提供可恢复的备份。 ## hush2 工作原理 1. `hush2 init` 在 `.hush2/envs/default/` 创建本地保险库(除非传入 `--env` 或 `--global`)。 2. `hush2 set` 加密密钥值并存储到 SQLite。 3. `hush2 run` 或 `hush2 NAME -- command` 仅解密子进程所需的密钥。 4. 子进程输出默认被屏蔽,除非使用 `--no-mask` 显式关闭。 5. 命名密钥请求在 exec 模式下默认仅从保险库解析,除非显式传入 `--allow-env-fallback`。 6. `hush2 doctor` 可诊断不可读记录并修复可恢复的旧版损坏。 使 `hush2` 区别于其他工具的组合是:本地加密存储、显式运行时注入、默认屏蔽以及精确值泄露扫描。 ## 常用命令 | 命令 | 描述 | |------|------| | `init` | 在当前项目或全局创建新保险库 | | `set NAME [VALUE]` | 存储或更新密钥 | | `get NAME` | 打印密钥值 | | `list` | 列出密钥 | | `list envs` | 列出可用环境 | | `rm NAME [NAME...]` | 删除密钥 | | `run CMD...` | 运行命令并注入所有保险库密钥 | | `NAME [NAME...] -- CMD` | 仅注入特定密钥 | | `--allow-env-fallback NAME -- CMD` | 显式允许缺失名称从父环境获取 | | `import FILE` | 从文件导入 `.env` 值 | | `import --stdin` | 从标准输入导入 `.env` 值 | | `import --from-env` | 从当前环境导入匹配值 | | `export` | 以 `.env` 格式导出密钥 | | `tag NAME TAG...` | 为密钥添加标签 | | `untag NAME TAG...` | 移除密钥标签 | | `history NAME` | 显示密钥的历史版本 | | `rollback NAME --to N` | 恢复到旧版本 | | `generate` | 生成密码、令牌、密钥或 UUID | | `audit` | 显示审计日志 | | `scan` | 扫描文件以查找精确密钥泄露和可选高熵值 | | `backup [FILE]` | 写入保险库备份文件 | | `restore FILE` | 从备份恢复保险库 | | `doctor` | 诊断保险库健康 | | `doctor --repair` | 修复可恢复的旧版损坏 | | `completion bash|zsh|fish` | 输出 Shell 补全脚本 | ## 运行带密钥的命令 注入保险库中的所有密钥: ``` hush2 run ./deploy.sh ``` 仅注入命名密钥: ``` hush2 OPENAI_API_KEY DATABASE_URL -- python app.py ``` 在 `NAME -- CMD` 模式下解析的名称默认来自活动保险库。如果请求的名称缺失,`hush2` 会失败,而不是静默回退到父 Shell 环境。 按标签注入密钥: ``` hush2 --tag prod -- ./deploy.sh hush2 run --tag db -- python migrate.py ``` 如果明确希望某个名称来自父环境,可显式启用: ``` export TEMP_TOKEN=abc123 hush2 --allow-env-fallback TEMP_TOKEN -- python script.py ``` ### 输出屏蔽 屏蔽功能在 `run` 和 `NAME -- CMD` exec 模式下默认启用。 ``` hush2 run sh -c 'echo $OPENAI_API_KEY' # [REDACTED] hush2 run --mask-style partial sh -c 'echo $OPENAI_API_KEY' # sk...23 hush2 run --mask-style hash sh -c 'echo $OPENAI_API_KEY' # [sha:a2c62cb9] hush2 run --no-mask sh -c 'echo $OPENAI_API_KEY' # prints the real value ``` 仅在明确希望子进程输出包含真实密钥时使用 `--no-mask`。 ## 环境与保险库作用域 创建环境专属保险库: ``` hush2 init --env staging hush2 --env staging set API_KEY value hush2 --env staging run ./deploy.sh ``` 创建全局保险库: ``` hush2 init --global hush2 --global set SHARED_TOKEN value ``` 本地保险库查找会从当前工作目录向上遍历,直到找到 `.hush2/` 目录,使嵌套项目命令按预期工作。 ## 导入与导出 从 `.env` 文件导入: ``` hush2 import .env ``` 从标准输入导入: ``` cat .env | hush2 import --stdin ``` 从当前 Shell 环境导入: ``` hush2 import --from-env --pattern '^(OPENAI|STRIPE|AWS_)' ``` 以 `.env` 格式导出: ``` hush2 export hush2 export --env-file .env.secure hush2 export --tag prod ``` 这使得迁移更灵活:你可以采用 `hush2` 而不锁定到专有格式,也可以在进行较大更改前保留备份。 ## 密钥历史、回滚与标签 更新密钥时会记录版本历史: ``` hush2 history OPENAI_API_KEY hush2 rollback OPENAI_API_KEY --to 1 ``` 标签可用于组织执行和列出密钥: ``` hush2 set STRIPE_KEY sk-live-abc --tag payments --tag prod hush2 tag DATABASE_URL db prod hush2 list --tag prod hush2 --tag prod -- ./deploy.sh ``` ## 密钥生成 ``` hush2 generate --type password --length 32 hush2 generate --type token --encoding hex --length 32 hush2 generate --type key hush2 generate --type uuid hush2 generate --type password --save SESSION_SECRET --tag app ``` ## 扫描泄露 `hush2 scan` 检查文件以查找来自保险库的实时密钥值,避免基于正则表达式的误报。 ``` hush2 scan hush2 scan --path ./src hush2 scan --staged hush2 scan --entropy --threshold 4.5 ``` 如果发现泄露,`scan` 会以非零状态退出。 ## 备份、恢复与修复 创建备份: ``` hush2 backup hush2 backup my-vault.bak ``` 恢复备份: ``` hush2 restore my-vault.bak hush2 restore my-vault.bak --env staging ``` 诊断并修复旧版损坏: ``` hush2 doctor hush2 doctor --repair hush2 doctor --repair --force ``` 修复行为: - 如果当前密钥不可读但存在旧版本仍可解密,`doctor --repair` 会恢复最新可读的历史记录。 - 如果不可读记录无可替换版本,`doctor --repair --force` 可将其移除。 - 如果钥匙串不可用,恢复或新建保险库可能需要 `HUSH2_PASSWORD` 才能解锁。 ## CI 与无头环境 如果操作系统钥匙串不可用或需要确定性非交互式解锁,可设置 `HUSH2_PASSWORD`: ``` export HUSH2_PASSWORD=my-vault-password hush2 run ./ci-script.sh ``` 这是当前代码库的行为,在 `keyring` 无法存储或检索保险库密码的系统上需要此设置。 ## 集成到工作流 在评估 `hush2` 时,建议从一个具体流程开始,而不是一次性迁移所有密钥: 1. 选择一个已在本地运行的命令,例如部署、迁移或集成测试脚本。 2. 仅将该命令所需的密钥迁移到 `hush2`。 3. 先使用 `hush2 NAME -- cmd` 运行,再根据需要扩展为 `hush2 run` 以实现全保险库注入。 4. 将 `hush2 scan --staged` 添加到预提交或发布流程中。 5. 在批量导入、环境迁移或恢复操作前保留最新的 `hush2 backup`。 ## 安全注意事项 - 密钥在静态存储中使用 AES-256-GCM 加密。 - 密钥通过 PBKDF2-HMAC-SHA256 与每个保险库的盐值派生。 - 密钥值仅在命令需要时解密。 - `HUSH2_PASSWORD` 在命令执行前从子进程环境中移除。 - `get`、`export` 和 `run --no-mask` 在被请求时有意暴露值。 - `NAME -- CMD` 模式下默认仅从保险库解析名称,确保来源明确且可审计。 - 恢复工具可抢救可读的旧版数据,但无法重建真正不可读的密钥。 - `hush2` 可减少本地工作流中的意外泄露,但不隔离已授予密钥的子进程。 ## 项目文档 - 参见 [CONTRIBUTING.md](CONTRIBUTING.md) 了解本地设置、测试期望和版本策略。 - 参见 [SECURITY.md](SECURITY.md) 了解支持的上报流程和当前安全边界。 - 参见 [CHANGELOG.md](CHANGELOG.md) 了解初始基线和未来发布说明。
标签:AES-256-GCM, CI友好, HMAC-SHA256, OS钥匙串, PBKDF2, SQLite, 威胁情报, 子进程安全, 密钥回滚, 密钥恢复, 开发安全, 开发者工具, 本地加密存储, 机密安全, 机密审计, 机密扫描, 标签过滤, 环境变量注入, 环境隔离, 终端工具, 逆向工具, 防泄露, 项目级加密