santhsecurity/envseal
GitHub: santhsecurity/envseal
面向 AI Agent 时代的本地密钥保险库,通过硬件密封和 GUI 审批机制确保密钥仅注入到经用户批准的进程中,防止 AI Agent 和恶意程序窃取凭据。
Stars: 0 | Forks: 0
# envseal
[](https://crates.io/crates/envseal-cli)
[](https://crates.io/crates/envseal-mcp)
[](https://docs.rs/envseal)
[](https://github.com/santhsecurity/envseal/actions/workflows/ci.yml)
[](LICENSE-MIT)
**envseal** 是一款开发者优先的秘密保险库,可将 API 密钥转化为
绑定设备的功能。明文仅存在于两个地方:
在生成它的芯片内部(Secure Enclave、TPM 或绑定 DPAPI 的
用户主密钥),以及在键盘前由您授权的后代进程中。
其他任何地方都没有:不在 `cat` 里,不在 `/proc/PID/mem` 里,不在
被盗的 `master.key` 里,也不在你的 shell 历史记录中。
## 为什么需要它?
在 2026 年,AI agent 拥有完整的文件系统和 shell 访问权限。每个 `.env` 文件都可以通过 `cat .env` 读取。每个粘贴到聊天窗口的 API 密钥都会被记录到云端 AI 提供商那里。叠加这些故障模式:
| 当前防御方式 | 失败原因 |
|----------------|-------------|
| `.gitignore` | 防止提交,但不能防止读取。 |
| `.cursorignore` | 基于提示词;会被挤出上下文窗口。 |
| OS Keychain | Agent 调用 `secret-tool lookup` 即可带走明文。 |
| 密码管理器 | 认证的是*用户*,而不是发起请求的*程序*。 |
| `.env` + `dotenv` | Agent 运行 `cat .env`,剩下的就成历史了。 |
| 粘贴到聊天框 | 密钥进入上下文、日志以及云端的留存记录中。 |
**envseal** 认证的是*程序*。秘密只能被释放给白名单中的二进制文件,该文件需通过 GUI 弹窗进行审批(终端绑定的 agent 无法点击),并且保护保险库的封装密钥永远不会离开您的物理设备。
## 两大保证
1. **密钥无法离开此机器。** 磁盘上的主密钥是双重封装的:内部是密码短语(Argon2id),外部是硬件绑定的密封(Windows DPAPI、macOS Secure Enclave、Linux TPM 2.0)。即使 `master.key` 被复制且密码短语被暴力破解,该文件也无法在任何其他设备上解密。
`envseal doctor` 会报告您当前所处的安全层级。
2. **没有您在键盘前的操作,密钥无法被读取。** 每次释放密钥都要经过桌面弹窗。`sudo`、`ptrace`、`cat /proc/PID/mem`、拥有完整 root 权限的 agent shell:它们都无法点击“允许”。无头攻击者只能看到 `Error::NoDisplay`。
## 安装
### 通过 `cargo` 安装(适用于任何带有 Rust 1.77+ 的平台)
```
# CLI (PATH 中的二进制文件为 `envseal`)。推荐,经过全面测试。
cargo install envseal-cli --locked
# 用于 AI 代理 (Claude Desktop, Cursor, Antigravity, Gemini CLI) 的 MCP 服务器。推荐,经过全面测试。
cargo install envseal-mcp --locked
# 原生桌面应用 (egui,无 JavaScript,无 webview)。未经测试,使用需自担风险。
cargo install envseal-gui --locked
```
或者通过检出源码安装:
```
git clone https://github.com/santhsecurity/envseal
cd envseal
cargo install --path cli --locked
cargo install --path mcp --locked
cargo install --path desktop-native --locked
```
### 预编译二进制文件
Windows / macOS / Linux 的二进制发布包附在每次的
[GitHub 发布页](https://github.com/santhsecurity/envseal/releases)上。
下载适用于您平台的压缩包,解压,然后将
`envseal`(以及可选的 `envseal-mcp`、`envseal-gui`)放到
您的 `PATH` 目录中。
### 可选:keyhog 扫描器
`envseal scan` 和 `envseal init --from-history` 在安装了
[keyhog](https://github.com/santhsecurity/keyhog) 扫描器时会使用它(具有 896 种带 GPU 加速的秘密模式检测器)。当
keyhog 不在 `PATH` 中时,envseal 会回退到内置的正则表达式
扫描器,该扫描器涵盖了常见的提供商。安装命令:
```
cargo install keyhog --locked
```
keyhog 被故意设为非硬性依赖。它会引入大多数 envseal 用户不需要的
GPU 运行时,而回退用的正则表达式已经涵盖了最常见的情况。如果您在大规模环境下操作或
审计陌生的代码库,请单独安装 keyhog。
### 首次运行设置(一分钟)
```
# 1. 验证您平台的保护层级 (DPAPI, Secure Enclave, TPM)。
envseal doctor
# 2. 通过存储您的第一个密钥来初始化您的 vault。envseal 将
# 通过桌面对话框提示输入密码。Stdin 是值进入 vault 的唯一
# 途径;切勿将密钥作为 CLI 参数传递。
echo 'sk-proj-…' | envseal store openai-key
# 3. 使用它。首次注入会弹出一个批准对话框。点击
# "Allow Always",您将不会再次为该 binary+secret 看到此对话框。
envseal inject openai-key=OPENAI_API_KEY -- python app.py
# 4. 其他日常操作。
envseal list # names only, never values
envseal peek openai-key # redacted preview
envseal revoke openai-key # secure zero-fill + delete
# 5. Shell 自动补全 (可选)。
eval "$(envseal completions bash)" # add to .bashrc
eval "$(envseal completions zsh)" # add to .zshrc
envseal completions fish | source # add to config.fish
```
### 面向 AI agent(通过 MCP)
原生的 agent 工作流使用 `envseal_request_key`。Agent 提议
一个密钥名称,随后会出现一个 GUI 弹窗,用户粘贴相应的值。**Agent 永远看不到秘密。**
```
Agent: "I need your Cloudflare API token"
→ calls envseal_request_key("cloudflare-api", "Cloudflare API Token")
→ GUI popup: "Paste your Cloudflare API Token: [________] [Store]"
User: *copies from dashboard, pastes into popup, clicks Store*
→ Secret encrypted and stored. Agent receives only "stored".
Agent: "Deploying to Cloudflare..."
→ calls envseal_inject(cloudflare-api=CLOUDFLARE_API_TOKEN -- wrangler deploy)
→ GUI popup: "Allow wrangler to access cloudflare-api? [Allow Once] [Always Allow] [Deny]"
User: *clicks Allow Once*
→ wrangler deploys. Key never touched the chat.
```
**与粘贴到聊天框的操作量相同**:1 次粘贴 + 1 次点击 vs 1 次粘贴。多出的那一次点击本身就是安全保障。
## 安全层级:选择您希望的审批摩擦程度
envseal 附带了三个预设层级。使用 `envseal security
preset standard | hardened | lockdown` 切换(或在
桌面 GUI 的“设置”选项卡中点击层级按钮)。检测信号在每个
层级中的触发方式都相同;层级决定了通过位于 `core/src/guard/signal.rs` 的策略表,每个 `Severity`(严重程度)会映射到什么 `Action`(动作)。
| 层级 | 审批弹窗 | 摩擦度 | 默认用于 | 适用场景… |
|---|---|---|---|---|
| **Standard** | 允许一次 / 始终允许 / 拒绝 | 无,即时审批 | 日常开发 | 您信任自己的 shell 和您运行的二进制文件 |
| **Hardened** | 相同按钮 + 2 秒弹窗前延迟 | 防误点延迟,X11 下使用虚拟键盘 | CI 运行器,备用笔记本电脑 | 您希望在批准前有时间思考一下 |
| **Lockdown** | 相同按钮 + 5 秒延迟 + 每批次前需要 4 位数字挑战 | 最大摩擦度,硬性拦截任何 `Hostile`(敌意)信号 | 高价值保险库,root 账户 | 您希望在被胁迫时,批准操作变得极其不便 |
该层级通过一个 5×3 的策略矩阵提升信号严重程度。在 Standard 层级下的
一个 `Severity::Hostile` 信号(例如 `io.stdin.piped`)
会作为摩擦门槛出现;在 Hardened 层级下,它是带延迟的摩擦门槛;
在 Lockdown 层级下,它是硬性拦截。您可以通过
`envseal security override-tier` / `override-signal`(或在
桌面 GUI 的“设置”面板中的只读摘要)覆盖任何
`(severity, tier)` 单元格或任何特定的 `SignalId`。
## 安全面:所有开关,尽在一处
这些是 envseal 附带的所有开关。大多数默认开启;
其余的由您自行选择启用。**每个动作都会进行哈希链接并存入审计
日志**,因此改变设置本身也是一个您事后可以审查的事件。
### 审批管道
| 开关 | 命令 | 作用 |
| --- | --- | --- |
| 层级 | `envseal security preset
` | 一键设置整个策略矩阵。针对单元格的单独覆盖优先于预设。 |
| 针对信号的覆盖 | `envseal security override ` | 将单个检测器(例如 `io.stdin.piped`)固定为特定动作,无视所在层级。 |
| 针对层级的覆盖 | `envseal security override-tier : ` | 覆盖 5×3 矩阵中的某个单元格(例如 `hostile:standard = block`)。 |
| 列出覆盖项 | `envseal security overrides` | 只读转储当前所有的覆盖设置。 |
| 审批延迟 | `envseal security set approval_delay_secs ` | 弹窗接受点击前的防误点延迟(默认在 Hardened 下为 2 秒,在 Lockdown 下为 5 秒)。 |
| 数字挑战 | `envseal security set challenge_required true` | 要求用户输入屏幕上显示的 4 位数字代码才能批准(默认在 Lockdown 下开启)。 |
| 审计日志 | `envseal security set audit_logging ` | 切换哈希链式日志。仅在完全物理隔离的 CI 中才可关闭。 |
| TOTP 2FA | `envseal security totp-setup` / `totp-disable` | 在解开保险库的密码短语之上,增加一层 HOTP/TOTP 双因素认证。 |
| 要求中继 | `envseal security set relay_required true` | 拒绝本地 GUI;仅接受通过配对设备中继发出的审批。适用于无头 / SSH 工作流。 |
| X11 自动升级 | `envseal security set x11_auto_upgrade ` | 当处于 X11 环境下(无输入隔离)时,自动升级为虚拟键盘输入,以防密码短语被 `xdotool` 重放。 |
### 始终在线的加固(无开关,自动运行)
这些是不可配置的;它们是安全的底线。
- **Vault 根路径验证**:拒绝在 `/tmp`、全局可写
目录或任何路径组成部分为符号链接的路径中打开。秘密名称中的路径遍历在
解析阶段即被拒绝。
- **带有 `name` 绑定 AAD 的 AES-256-GCM**:每个秘密在封装时都将其
自身的名称作为附加身份验证数据(AAD),因此磁盘上被重命名的文件将无法
解密。
- **Argon2id KDF**:密码短语封装使用 Argon2id,参数大小
在现代笔记本电脑上设定为 ≥ 0.5 秒。
- **硬件密封**:保护 `master.key` 的封装密钥
绑定到设备的 TPM 2.0 / Secure Enclave / Windows DPAPI。
被盗的 `master.key` 无法在另一台机器上打开。
- **自我预加载检查**:如果继承的环境中设置了 `LD_PRELOAD`、
`DYLD_INSERT_LIBRARIES` 或等效项,则拒绝运行。
- **进程加固**:`PR_SET_DUMPABLE(0)`、`RLIMIT_CORE = 0`、
每个秘密 FD 上的 `O_CLOEXEC`、执行前的 `PR_SET_NO_NEW_PRIVS`。
- **内存保护**:Linux 5.14+ 上的 `memfd_secret()` 会将
主密钥从内核页表中取消映射;在较旧的内核上回退使用 `mlock` + `MADV_DONTDUMP`;在 Windows 上使用 `VirtualLock`;在 macOS 上使用 `mlock`。主密钥在释放时清零。
- **哈希链式审计日志**:每个事件都包含前一条目的 SHA-256。
篡改会破坏链条;被破坏的文件会被轮转重命名为
`audit.log.corrupted-`,并启动一条新的链条。
- **策略完整性**:`policy.toml` 经过 HMAC 签名;任何未经签名的
编辑都会拒绝后续操作,直到修复为止。
- **拒绝空秘密**:保险库拒绝存储零字节的
值(防御 `cat /dev/null | envseal store creds`)。
- **CTF flag 豁免**:`Vault::decrypt("ctf-flag")` 无条件返回
`CryptoFailure`,并被审计为
`critical [ctf.flag.decrypt_attempt]`。仅支持通过哈希进行验证。
### 检测信号(每个信号都会触发自己的审计事件)
| 来源 | 信号 ID | 严重程度 | 捕获内容 |
| --- | --- | --- | --- |
| `migration.preexec` | `io.stdin.piped` | hostile(敌意) | 在 tty 会话中通过管道传入 envseal 的 stdin 的秘密值 |
| `migration.preexec` | `io.cmdline.shell_subst` | hostile(敌意) | 请求 argv 中的 `$(…)` / 反引号 / `eval` |
| `guard.gui` | `gui.input_injector` | critical(严重) | 正在运行 xdotool / ydotool / xte / wtype |
| `guard.gui` | `gui.screen_recorder` | warn(警告) | 正在进行 OBS / SimpleScreenRecorder / ffmpeg 录制 |
| `guard.gui` | `gui.accessibility_tool` | warn(警告) | 屏幕阅读器 / AT-SPI 桥接处于活动状态 |
| `guard.gui` | `gui.session.ssh` | critical(严重) | SSH 会话,无本地显示 |
| `guard.gui` | `gui.session.x11_forward` | critical(严重) | X11 转发,密码短语可被拦截 |
| `guard.gui` | `gui.session.remote_desktop` | warn(警告) | 检测到 RDP / VNC 会话 |
| `guard.env` | `env.loaderload` | critical(严重) | 继承的环境中设置了 `LD_PRELOAD` 或类似项 |
| `vault.entropy` | `secret.entropy.too_short` | warn(警告) | secret 小于 8 个字节 |
| `vault.entropy` | `secret.entropy.low_shannon` | warn(警告) | 相对于其长度而言,香农熵过低 |
| `vault.entropy` | `secret.entropy.placeholder.` | warn(警告) | 匹配 `todo`、`changeme`、`your-api-key` 等 |
| `audit.chain` | `audit.chain.rotated_corruption` | critical(严重) | 检测到被篡改的日志已轮转 |
| `vault.binary` | `binary.tampered` | critical(严重) | 已批准的二进制文件的哈希值不再匹配 |
| `vault.policy` | `policy.tampered` | critical(严重) | `policy.toml` HMAC 不匹配 |
| `vault.dpapi` | `vault.dpapi.device_mismatch` | critical(严重) | `master.key` 封装是在不同的设备上生成的 |
| `ctf` | `ctf.flag.decrypt_attempt` | critical(严重) | 有东西试图读取 CTF flag |
| `ctf` | `ctf.verify.incorrect` | info(信息) | 提交了错误的 flag |
每个信号在触发时都会输出到 stderr,并且会被附加
到审计日志中。`envseal audit --json` 提供完整的结构化
数据流;`envseal security overrides` 显示您为每个信号固定的
动作。
### 沙箱层级(用于 `supervised`)
`envseal supervised = [--sandbox=] -- ` 在实时的泄漏检测以及可选的沙箱环境下运行
子进程:
| 沙箱层级 | Linux | macOS | Windows |
| --- | --- | --- | --- |
| `none`(默认) | 仅观察 | 仅观察 | 仅观察 |
| `standard` | seccomp 过滤器(无 `ptrace`,无 `process_vm_readv`) | `sandbox_init` `pure-computation` 配置文件 | 具有限制句柄访问的 Job Object |
| `hardened` | + 新的 pid/mount/uts 命名空间 | + 受限网络配置文件 | + 受限桌面 |
| `lockdown` | + 只读根目录,无网络命名空间 | + 文件系统只读配置文件 | + integrity-low 令牌 |
监控程序会实时检查子进程的 stdout/stderr;任何
对已知秘密值的子字符串匹配都会触发
`supervisor_leak_detected` 并终止子进程。
## CTF:试着攻破它。如果成功,将获得公开致谢。
一旦秘密进入了保险库,我们的主张就是:**没有人能把它
拿出去。** 无论是人类、AI agent 还是两者协同合作都不行。
```
envseal ctf start # generates ENVSEAL_CTF{...}, seals it, switches the vault to Lockdown
envseal ctf rules # what's allowed, what's banned (only DMA / cold-boot / JTAG are off-limits)
envseal ctf status # check active challenge + verification hash
envseal ctf verify # submit a guess
envseal ctf reset # clean up + restore your pre-CTF tier
```
**允许的方式:**内存读取(`/proc/pid/mem`、`process_vm_readv`、
`ptrace`)、二进制文件替换、PATH 投毒、`LD_PRELOAD`、GUI
自动化工具(xdotool、ydotool、xte、libinput 重放)、配置
篡改、侧信道攻击(时序/缓存/功耗)、内核模块、
沙箱逃逸、竞态条件、TOCTOU 以及任何富有创意的软件
手段。
**禁止的方式:**仅限物理硬件攻击(通过
Thunderbolt/PCIe 的 DMA、冷启动 RAM 移植、JTAG)。这些攻击
会绕过每台机器上的软件,不仅仅是针对 envseal。
**奖励:**`SECURITY.md` 中的名人堂 + 文章署名。没有
漏洞赏金现金,因为这是一个个人项目,但如果您
演示了 Tier 1 级别的突破(从 Lockdown 保险库中提取 flag),
该文章将成为 envseal 第一个公开记录的故障
模式,这是一项极具声望的发现。
## MCP 服务器设置
envseal 附带了一个 MCP(模型上下文协议)服务器,允许 AI
agent 存储、列出、注入和验证秘密,而无需看到
明文。每次工具调用都会弹出一个 GUI 审批弹窗,由
人类进行授权;agent 只能看到 `OK` 或 `denied`。
运行 `which envseal-mcp` 获取由 `cargo install envseal-mcp`(或通过将
发布包解压到 `PATH` 中)安装的二进制文件的绝对路径。下面的每个配置都需要它
(请替换 `/path/to/envseal-mcp`)。
#### Claude CLI (Claude Code)
```
claude mcp add envseal /path/to/envseal-mcp
```
或者编辑 `~/.claude.json` 并将其添加到 `mcpServers`:
```
{
"mcpServers": {
"envseal": {
"command": "/path/to/envseal-mcp"
}
}
}
```
#### Gemini CLI
编辑 `~/.gemini/settings.json`:
```
{
"mcpServers": {
"envseal": {
"command": "/path/to/envseal-mcp"
}
}
}
```
Gemini CLI 要求使用**绝对**路径;不支持 `~` 展开。
#### Cursor / Antigravity / 支持通用 MCP 的编辑器
添加到您编辑器的 MCP 配置中(通常是 `~/.cursor/mcp.json` 或
`~/.antigravity/mcp.json`):
```
{
"mcpServers": {
"envseal": {
"command": "/path/to/envseal-mcp"
}
}
}
```
#### 验证 MCP 服务器是否连接成功
在重启您的 agent 后,询问它:“列出你所拥有的 envseal 工具”。
Agent 应该会列举出 `envseal_store`、`envseal_inject`、
`envseal_list`、`envseal_audit`、`envseal_doctor` 等。如果它说没有
envseal 工具,则说明 MCP 配置中的路径错误或二进制文件不可执行。请尝试 `chmod +x /path/to/envseal-mcp` 并检查 agent 的
MCP 启动日志。
各 Agent 的网页演练:[docs/setup/](docs/setup/) 提供了可直接复制的
特定于 agent 的提示(Cursor、Antigravity、Gemini CLI、Claude CLI、
手动)用于进行相同的配置。
## `.envseal` 文件
`.env` 的直接替代品。**可安全提交到 git**:包含的是引用,而不是值:
```
# .envseal:可安全提交
DATABASE_URL=database-url
REDIS_URL=redis-url
OPENAI_API_KEY=openai-key
STRIPE_SECRET_KEY=stripe-key
```
```
# 从现有 vault 密钥生成
envseal init
# 运行您的应用
envseal inject-file .envseal -- npm run dev
```
## 命令
| 命令 | 描述 |
|---------|-------------|
| `envseal store [--force] [--gui]` | 存储一个秘密(通过 stdin 或 GUI 弹窗) |
| `envseal request-key [--description d]` | Agent 发起的 GUI 密钥请求 |
| `envseal inject = -- ` | 将秘密注入到一个进程中 |
| `envseal inject-file -- ` | 注入 `.envseal` 文件中的所有秘密 |
| `envseal run -- [args...]` | 使用显式的 `.envseal` 映射运行命令 |
| `envseal shell [--login]` | 打开注入了映射秘密的子 shell |
| `envseal pipe -- ` | 在子进程的 stdin 上传递单个秘密(无环境变量) |
| `envseal supervised = [--sandbox=] -- ` | 运行实时泄漏检测及可选沙箱层级(`standard`、`hardened`、`lockdown`) |
| `envseal scan [--deep] [--path ]` | 扫描 dotfiles + 当前目录的 `.env*`(或使用 `--deep` 扫描整个 `$HOME`);如果已安装则使用 `keyhog` |
| `envseal scan --system` | 交接给 `keyhog scan-system`。每个挂载的驱动器 + 每个_git 历史(需要 keyhog)。 |
| `envseal` *(无参数)* / `envseal tui` | 打开交互式终端 UI(欢迎、快速入门、秘密、Doctor、扫描器、审计、CTF) |
| `envseal import <.env> [--delete]` | 从 `.env` 迁移至 envseal |
| `envseal init [path]` | 生成 `.envseal` 项目文件脚手架 |
| `envseal doctor` | 系统安全就绪状态检查 |
| `envseal status [--json]` | 显示保险库状态(层级、秘密数量等) |
| `envseal list` | 列出秘密名称(永远不显示值) |
| `envseal peek ` | 显示秘密的打码预览 |
| `envseal revoke ` | 安全删除一个秘密 |
| `envseal copy ` | 复制一个秘密 |
| `envseal rename ` | 重命名一个秘密 |
| `envseal alias ` | 生成封装了 `envseal run` 的 shell 别名 |
| `envseal policy show` | 显示白名单规则 |
| `envseal policy revoke-binary ` | 移除某个二进制文件的规则 |
| `envseal audit [N]` | 显示最近 `N` 条审计日志条目 |
| `envseal security show\|set\|preset` | 管理安全配置层级 |
| `envseal health [--max-age=N]` | 秘密健康/合规报告 |
| `envseal git-hook ` | 安装和检查防泄漏钩子 |
| `envseal hook [bash\|zsh\|fish]` | 管理用于捕获输入按键的 shell preexec 钩子 |
| `envseal init --from-history` | 迁移之前在 shell 中输入过的每一个秘密 |
| `envseal op run -- ` / `envseal doppler run -- ` / `envseal vault run -- ` | 兼容 1Password / Doppler / HashiCorp Vault CLI 接口的直接替代垫片 |
| `envseal emergency-revoke` | 擦除保险库中的所有秘密 |
| `envseal ctf ` | CTF 挑战工作流 |
| `envseal completions ` | 生成 shell 补全脚本 |
## 威胁模型
完整的防御列表位于上方的
[始终在线的加固](#always-on-hardening-no-toggle-it-just-runs)部分。此表是面向操作者的版本:今天谁能读取
秘密,谁不能。
**零网络连接。** envseal 不建立任何连接。没有遥测,没有
更新检查,没有云账户。
| 攻击者 | 能否访问? |
|----------|---------|
| 拥有终端访问权限的 AI agent | 否,无法与 GUI 弹窗交互 |
| 构建管道中的恶意脚本 | 否,二进制文件未加入白名单 |
| Root 用户(ptrace/proc) | 否,`memfd_secret` + `PR_SET_DUMPABLE(0)` |
| 攻击者机器上被盗的 `master.key` | 否,硬件密封拒绝在不同的设备上使用 |
| 针对被盗 `master.key` 的暴力破解 | 否,没有设备的 TPM/SEP/DPAPI 密钥,封装无法打开 |
| 在键盘前的人类 | 是,可以通过 GUI 批准 |
| 远程桌面攻击者 | 部分,会被 `assess_gui_security()` 检测到 |
| 供应链(npm token 被盗) | 否,token 永远不会进入 agent 上下文 |
### GUI 安全评估
envseal 持续监控 GUI 环境:
- **远程会话检测**:SSH、X11 forwarding、RDP/VNC
- **输入注入检测**:xdotool、ydotool、xte、wtype
- **屏幕录制检测**:OBS、SimpleScreenRecorder、ffmpeg
- **威胁分类**:安全 / 降级 / 敌意
### 平台支持
| 平台 | GUI 后端 | 硬件密封 | 内存中保护 | 沙箱 | 状态 |
|----------|-------------|---------------|-----------|---------|--------|
| Linux | zenity / kdialog | TPM 2.0(通过 tpm2-tools,可选) | `memfd_secret` (5.14+) | unshare 命名空间 (Hardened/Lockdown) | 已支持 |
| macOS | osascript | Secure Enclave (P-256, ECIES) | mlock | `sandbox_init` 配置文件 | 已支持 |
| Windows | PowerShell Forms | DPAPI(在 Win10+ 上由 TPM 作为根) | VirtualLock | Job Objects | 已支持 |
## 从 `.env`、`op`、`doppler` 或您的 shell 历史记录迁移
envseal 的设计初衷是成为从您当前使用的任何工具迁移出来的成本最低的途径。请选择与您的秘密泄露方式相匹配的入口点:
```
# 1. 批量迁移 .env 文件
envseal import .env --delete
# 2. 迁移您已在提示符处输入的所有内容
envseal init --from-history # scans bash/zsh/fish history,
# imports each detected key into the vault
# 3. 实时捕获未来的密钥,无需刻意关注
envseal hook install # auto-detects $SHELL,
# writes a preexec hook into .bashrc/.zshrc/.config/fish/config.fish
# 现在每当您输入:
# OPENAI_API_KEY=sk-... node app.js
# 在命令运行之前,envseal 会弹出一个 "store this for next time?" 对话框。
# 4. 直接替换已调用 op / doppler / vault 的现有脚本
envseal op run -- node app.js # 1Password CLI shape
envseal doppler run --config dev -- npm run dev # Doppler shape
envseal vault run -- ./deploy.sh # HashiCorp Vault shape
```
迁移后,`envseal run -- ` 会读取最近的 `.envseal` 文件并注入每一个引用。(格式请参阅上 [`.envseal` 文件](#the-envseal-file)部分。)
## 桌面应用(预览版,未经测试)
`desktop-native/` 中的 `envseal-gui` 二进制文件是一个纯 Rust 开发的 **egui/eframe** 应用(无 webview),涵盖了 CLI 暴露的只读视图。正如上方[安装](#install)部分所述,GUI 尚未被自动化测试套件所覆盖。标签页:
- **Dashboard(仪表盘)**:保险库状态和近期活动概览
- **Secrets(秘密)**:查看和撤销已存储的秘密
- **Store(存储)**:通过 GUI 加密新秘密
- **Policy(策略)**:查看和撤销二进制文件的访问规则
- **Settings(设置)**:安全层级、输入保护和威胁评估
- **Audit(审计)**:会话活动跟踪
- **Health(健康)**:秘密健康与合规报告
- **Scanner(扫描器)**:扫描泄露的秘密和配置错误
## 漏洞报告
除了 CTF 之外,我们随时欢迎针对任何层级的漏洞报告,无论是 GUI 绕过还是加密弱点。请参阅 **[SECURITY.md](SECURITY.md)** 了解
三层披露计划及如何提交发现。
## 路线图和贡献
正在进行中的工作、已排期的工作,以及(重要的是)一份
我们非常希望外部贡献者认领的范围明确的任务清单。从
“添加一个正则表达式模式”到“构建用于监控 envseal 心跳并
检测伪造弹窗的看门狗进程”,每个经验级别都能找到
适合的任务。
**→ [ROADMAP.md](ROADMAP.md)**:完整的实时路线图,包含认领
说明以及为已发布贡献提供的人员名单致谢。
目前面向社区开放工作的一些亮点:
- **心跳与看门狗进程**:一个独立的轻量级监控器,
用于消费来自 envseal 的签名心跳,观察操作系统弹窗
事件,并在出现异常时发出警报。在设计上是带外执行的;这是一个很好的
系统编程入门点。
- **Telegram 机器人中继**:通过内联按钮进行手机审批,无需
envseal 移动应用。
- **针对 v3 封装解析器的 `cargo fuzz` 测试工具**:`core/fuzz/`
已经做好了准备。
- **可复现构建验证器**:独立重建发布
标签并确认逐字节一致性。
- **文档翻译**:在非英语开发者社区中扩大影响范围。
请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 了解开发设置和合并
标准;ROADMAP.md 包含每个项目的架构背景。
## 许可证
MIT OR Apache-2.0
## 关于
由 [Santh](https://santh.dev) 构建。标签:AI Agent 防护, API 密钥保护, CLI 工具, crates.io, envseal, GUI 弹窗确认, MCP, Rust, Secure Enclave, SSH蜜罐, Streamlit, StruQ, TPM, Windows DPAPI, 人工智能安全, 凭据保护, 可信平台模块, 可视化界面, 合规性, 大语言模型安全, 安全飞地, 开发者安全, 数据加密, 机密管理, 环境变量保护, 硬件级加密, 终端安全, 网络流量审计, 访问控制, 进程注入, 通知系统, 防数据泄露, 零信任架构