一个 GPG 加密文件 + 一条口令,收好服务器上所有密钥
上个月帮朋友排查一件怪事:他的 OpenAI 账单突然多了几千元陌生调用。翻日志、查 SSH 历史、调 CDN 日志,最后定位到一个让人哭笑不得的原因。
他在 Cursor 里调试一段调用代码时,把 API Key 完整贴进提示框,问 AI「为什么返回 401」。
AI 编辑器很方便,但它不是一个隔离的开发环境。你以为只是让 AI 帮你看一眼报错,密钥其实已经离开你的电脑,进入了模型提供商的请求日志、检索缓存、可能的训练数据流。一旦过了你的掌控,没法保证它去了哪里、被谁看过、存了多久。
这不是 Cursor 一家的问题。Claude Code、Copilot、Continue、Windsurf,都存在类似的边界。
我做 envvault 的初衷,就是解决这一类问题。
密钥泄漏的五种经典死法
痛点分两种。一种是你把密钥交给 AI 助手,刚才说的那种。另一种更隐蔽:密钥散落在 .env、docker-compose.yml、bash_history、聊天截图、Git 仓库、网盘备份里。它们从来没离开过你的电脑,但谁都能拿到。
整理 5 个最常见的泄漏场景:
- 明文 bash 历史
:手打的 curl 鉴权头会永久留在 ~/.bash_history - .env 文件权限过宽
:644 权限下,任何能读目录的进程或用户都能拿走 - 密钥贴进聊天或截图
:落在日志、剪贴板、云端,传播路径不可控 - 提交进 Git 仓库
:即使删了 commit,history 里还在,被扫描机器人几小时内抓到 - 备份整个 home 到网盘
:密钥跟着一起上云,泄漏面随之扩大
我见过最夸张的一个案例:某团队把 .env 提交进公开 GitHub 仓库,删掉 commit 后没清理 history,被自动化扫描机器人 6 小时内抓到,密钥被用来挖矿两天。
envvault:一个文件,一条口令
envvault 想做的事很直接:把散落的密钥收进一个 GPG 加密文件,用一条口令统一管理,明文永远不落盘。
整个仓库只有一个核心目录:
~/.secrets/
├── env.gpg # 唯一真源(AES-256 加密)
└── vault.sh # 门禁工具
零依赖。GPG 预装在几乎所有 Linux 发行版,没有守护进程、没有数据库、没有网络依赖,备份就是一个文件。
3 步上手
① 安装
git clone https://gitee.com/nyzcgyl_0/envvault.git
cd envvault && ./install.sh
脚本会把 vault.sh 装到 ~/.secrets/
② 初始化与写入
~/.secrets/vault.sh init
~/.secrets/vault.sh set OPENAI_API_KEY
~/.secrets/vault.sh set DATABASE_URL
口令和值都是静默输入,不会进 bash 历史
③ 上锁
~/.secrets/vault.sh lock
磁盘上再也没有明文密钥
日常使用时,会话级加载一次口令就能在当前终端里随便用:
eval "$(~/.secrets/vault.sh unlock)"
curl -H "Authorization: Bearer $OPENAI_API_KEY" \
https://api.openai.com/v1/models
CI 自动化场景下用环境变量喂口令即可,不需要任何交互。注意:unlock 的结果只 eval 到内存,绝不重定向到文件,否则等于把明文重新落盘。
诚实的边界
envvault 防的是静态泄漏,比如 bash 历史、误提交、备份外泄、进程读取。
键盘记录器、root 实时内存抓取、口令主动外泄这三种场景,它管不了。口令忘了等于数据永久丢失,请写进纸质记录或离线密码管理器。
它也只适合单人小团队。需要多人审批、审计日志、密钥自动轮换的企业场景,应该上 HashiCorp Vault 或 SOPS+KMS。
几个我比较满意的设计细节
-
口令派生用 SHA-512 迭代 6500 万次,暴力破解成本极高 -
口令错误会明确报错并返回非零退出码,不会静默成功 -
改口令时如果新旧一样会被直接拒绝 -
临时明文用 mktemp + chmod 600 + shred 兜底删除 -
加密写盘失败会用 .tmp 加原子 mv 避免损坏原库
仓库地址
https://gitee.com/nyzcgyl_0/envvault
觉得有用欢迎点赞鼓励
想交流可以加我的开发者群(公众号回复「envvault」进群)

