ashlrai/phantom-secrets
GitHub: ashlrai/phantom-secrets
通过用虚拟 token 替换真实密钥并配合本地代理注入,防止在 AI 编程过程中意外泄露 API keys。
Stars: 5 | Forks: 1
# Phantom
**让 AI 安全地使用你的密钥。**
[](https://github.com/ashlrai/phantom-secrets/stargazers)
[](https://github.com/ashlrai/phantom-secrets/actions/workflows/ci.yml)
[](https://www.npmjs.com/package/phantom-secrets)
[](LICENSE)
[](https://phm.dev)
[观看 45 秒演示](https://github.com/ashlrai/phantom-secrets/releases/download/v0.4.0/phantom-demo.mp4)
AI 编程代理会读取你的 `.env` 文件,将 API 密钥放入 LLM 上下文窗口中,导致它们通过 prompt 注入、会话日志、恶意 MCP 服务器或训练数据泄露。GitGuardian 的报告显示,AI 辅助的代码提交泄露密钥的频率是基线的两倍。
Phantom 使用无意义的 token 替换真实的 secrets。本地代理在网络层将它们交换回来。AI 永远看不到真实的密钥。
## 快速开始
```
$ npx phantom-secrets init
# 自动检测 .env、.env.local 或子目录中的 .env
# 将真实 secrets 存储在 OS keychain 中,并使用 phantom tokens 重写 .env
# 如果检测到,会自动配置 Claude Code MCP server
$ phantom exec -- claude
# Proxy 运行在 127.0.0.1:54321 — AI 看到 phantom tokens,proxy 注入真实 keys
```
## 工作原理
```
.env file (safe to leak) OS Keychain / Vault
+--------------------------+ +---------------------+
| OPENAI_API_KEY=phm_a7f3 | ---> | sk-real-secret-key |
| STRIPE_KEY=phm_c9d1... | | sk_live_real-key... |
+--------------------------+ +---------------------+
| |
v v
AI Agent (Claude, Cursor) Phantom Proxy (127.0.0.1)
+--------------------------+ +------------------------------+
| Reads .env | | Intercepts HTTP requests |
| Sees only phm_ tokens | ---> | Replaces phm_ with real keys |
| Makes API calls to proxy | | Forwards over TLS to real API|
+--------------------------+ +------------------------------+
```
1. `phantom init` 读取 `.env`,将真实的 secrets 存储在 OS 密钥链中,并使用 `phm_` token 重写 `.env`
2. `phantom exec -- claude` 启动一个本地反向代理,并设置 `OPENAI_BASE_URL=http://127.0.0.1:PORT/openai`(及其他服务的等效配置)
3. API 调用命中代理,该代理将 phantom token 替换为真实的 secrets,然后通过 TLS 转发
4. 会话结束时,代理关闭。Phantom token 在代理外部毫无价值。
## MCP 集成
Phantom 附带了一个 MCP 服务器,以便 AI 编程工具可以直接管理 secrets——而无需查看真实值。提供 17 种工具:list、status、init、add、remove、rotate、copy、cloud push、cloud pull、cloud status。
### Claude Code
```
$ claude mcp add phantom-secrets-mcp -- npx phantom-secrets-mcp
```
### Cursor
添加到 Cursor Settings > Features > MCP Servers:
- 名称:`phantom`
- 命令:`npx phantom-secrets-mcp`
### Windsurf
添加到 `~/.codeium/windsurf/mcp_config.json`:
```
{"phantom": {"command": "npx", "args": ["phantom-secrets-mcp"]}}
```
### Codex / 其他 MCP 客户端
添加到你的 MCP 配置中:
```
{"phantom": {"command": "npx", "args": ["phantom-secrets-mcp"]}}
```
Phantom 适用于任何支持 [Model Context Protocol](https://modelcontextprotocol.io) 的工具。
## 云端同步
通过端到端加密在多台机器间同步保险库。服务器永远不会看到明文。
```
$ phantom login
# 打开 GitHub OAuth (device code flow)
$ phantom cloud push
# 客户端加密,并上传至 phm.dev
$ phantom cloud pull # on another machine
# 本地下载并解密
```
云端同步使用 ChaCha20-Poly1305 加密,并通过 Argon2id 派生客户端侧的密码。服务器仅存储密文。
## 命令参考
| 命令 | 描述 |
|---------|-------------|
| `phantom init` | 将 `.env` secrets 导入到保险库,并使用 phantom token 重写 |
| `phantom exec -- ` | 启动代理并运行带有 secret 注入的命令 |
| `phantom start` / `stop` | 管理代理生命周期(独立/daemon 模式) |
| `phantom list` | 显示存储在保险库中的 secret 名称(从不显示值) |
| `phantom add ` | 将 secret 添加到保险库 |
| `phantom remove ` | 从保险库中移除 secret |
| `phantom reveal ` | 打印 secret 值(或使用 `--clipboard` 进行复制) |
| `phantom status` | 显示代理状态、保险库信息和映射的服务 |
| `phantom rotate` | 重新生成所有 phantom token(旧 token 将失效) |
| `phantom doctor` | 检查配置和保险库健康状况(`--fix` 自动修复) |
| `phantom check` | 扫描未受保护的 secrets(pre-commit hook、`--staged`、`--runtime`) |
| `phantom sync` | 推送 secrets 到 Vercel / Railway |
| `phantom pull` | 从 Vercel / Railway 拉取 secrets 到保险库 |
| `phantom setup` | 配置 Claude Code MCP 服务器 + hooks |
| `phantom env` | 生成 `.env.example` 用于团队入职 |
| `phantom export` | 将保险库导出为加密备份文件 |
| `phantom import` | 从加密备份导入保险库 |
| `phantom login` | 通过 GitHub OAuth 进行 Phantom Cloud 认证 |
| `phantom logout` | 清除云凭证 |
| `phantom cloud push` | 推送加密的保险库到 Phantom Cloud |
| `phantom cloud pull` | 从 Phantom Cloud 拉取并解密保险库 |
| `phantom wrap` | 自动使用 `phantom exec` 包装 package.json 脚本 |
| `phantom unwrap` | 恢复原始的 package.json 脚本 |
| `phantom watch` | 监控 .env 文件并自动检测新的未受保护的 secrets |
| `phantom why ` | 解释为什么某个 key 受或不受保护 |
| `phantom copy ` | 将 secret 复制到另一个项目的保险库 |
| `phantom team list/create/members/invite` | 团队保险库管理 |
## 功能
- **加密保险库** -- OS 密钥链(macOS Keychain / Secure Enclave,Linux Secret Service),并为 CI/Docker 提供加密文件后备方案
- **会话范围的 token** -- 带有 `phm_` 前缀的 256 位 CSPRNG phantom token,可按需轮换
- **流式代理** -- 完整支持 OpenAI、Anthropic 和其他流式 API 的 SSE/streaming
- **智能检测** -- 启发式引擎可区分 secrets(`*_KEY`、`*_TOKEN`、`sk-*`、`ghp_*`)和配置(`NODE_ENV`、`PORT`)
- **平台同步** -- 推送/拉取 secrets 到 Vercel 和 Railway
- **Pre-commit hook** -- 阻止包含未受保护 secrets 的代码提交
- **MCP 服务器** -- 为 Claude Code、Cursor、Windsurf 和 Codex 提供 17 种工具来管理 secrets 而无需查看值
- **云端同步** -- 跨机器的 E2E 加密零知识保险库同步
- **导出/导入** -- 带密码保护的加密备份与恢复
- **响应清洗** -- 防止 secrets 在 API 响应中泄露回 AI
- **脚本包装** -- `phantom wrap` 修补 package.json,以便每个 npm 脚本都通过代理运行
- **监控模式** -- `phantom watch` 监控 .env 文件以查找新的未受保护的 secrets
- **Secret 解释器** -- `phantom why ` 解释检测启发式原理
- **跨项目复制** -- `phantom copy` 在项目保险库之间共享 secrets
- **团队保险库** -- 具有基于角色访问控制的共享保险库
- **内置服务路由** -- OpenAI、Anthropic、Stripe、Supabase 以及通过 `.phantom.toml` 配置的自定义服务
## 安装说明
### npm (推荐)
```
$ npm install -g phantom-secrets
```
或直接使用 npx:
```
$ npx phantom-secrets init
```
### Claude Code MCP
```
$ claude mcp add phantom-secrets-mcp -- npx phantom-secrets-mcp
```
### Cargo
```
$ cargo install phantom
```
## 架构
5 个 Rust crate 的工作空间 + Next.js 云端后端:
| Crate | 角色 |
|-------|------|
| `phantom-core` | 配置 (`.phantom.toml`)、`.env` 解析/重写、token 生成、认证、云端客户端 |
| `phantom-vault` | `VaultBackend` trait:OS 密钥链 + 加密文件后备方案,ChaCha20-Poly1305 加密 |
| `phantom-proxy` | 位于 127.0.0.1 上的 HTTP 反向代理,支持 SSE/streaming、token 替换、TLS 转发 |
| `phantom-cli` | 基于 `clap` 的 CLI 二进制文件,27 个命令 |
| `phantom-mcp` | MCP 服务器二进制文件(`rmcp` SDK),stdio 传输,17 个工具 |
**`apps/web`** -- 位于 [phm.dev](https://phm.dev) 的 Next.js 后端,用于云端保险库同步、GitHub OAuth 和 Stripe 计费。
**npm 包**:[`phantom-secrets`](https://www.npmjs.com/package/phantom-secrets) (CLI)、[`phantom-secrets-mcp`](https://www.npmjs.com/package/phantom-secrets-mcp) (MCP 服务器)。
所有 crate 共有 69 个测试,0 个 clippy 警告。
## 安全性
- **Secrets 永远不会留在磁盘上**,在你的项目目录中——真实值仅存在于 OS 密钥链或加密保险库中
- **ChaCha20-Poly1305** 加密用于文件保险库和云端同步,**Argon2id** 密钥派生
- **零知识云** -- 服务器仅存储密文;加密密钥永远不会离开客户端
- **256 位 CSPRNG token** -- `phm_` 前缀确保它们永远不会与真实的 API 密钥格式冲突
- **代理仅绑定 127.0.0.1** -- 从不暴露给网络
- **Secrets 在内存中清零** -- 通过 `zeroize` crate 在注入后清除
- **允许列表模型** -- 代理仅为明确配置的服务模式注入 secrets
完整威胁模型请参阅 [SECURITY.md](SECURITY.md)。
## 定价
| | 免费版 | 专业版 | 企业版 |
|---|---|---|---|
| 本地保险库 | 不限量 | 不限量 | 不限量 |
| 云端保险库 | 1 | 不限量 | 不限量 |
| MCP 服务器 | 是 | 是 | 是 |
| 云端同步 | 是 | 是 | 是 |
| 团队功能 | -- | -- | 是 |
| 价格 | $0 | $8/月 | 联系我们 |
## 链接
- [phm.dev](https://phm.dev) -- 云端仪表板和账户管理
- [入门指南](docs/getting-started.md)
- [安全模型](SECURITY.md)
- [故障排除](docs/troubleshooting.md)
- [贡献指南](CONTRIBUTING.md)
## 许可证
MIT -- 详见 [LICENSE](LICENSE)
标签:AI代理, AI安全, API安全, API密钥保护, Chat Copilot, CISA项目, GitHub项目, GNU通用公共许可证, JSONLines, JSON输出, MCP Server, Node.js, npm包, WAF测试, 令牌化, 会话日志保护, 凭证保护, 可视化界面, 大模型安全, 威胁情报, 安全助手, 开发者工具, 提示注入防护, 本地代理, 机密信息管理, 沙箱隔离, 环境变量保护, 网络安全, 通知系统, 防止数据泄露, 防泄露, 隐私保护, 零信任