停止在 .env 文件中放置 API 密钥 — 改用操作系统钥匙串
请提供您希望翻译的完整文本内容,我才能为您进行简体中文翻译。
用一句话描述问题
一位 YC 初创公司的开发者不小心将 .env 文件推送到了公开的 GitHub 仓库。文件中包含:
- Stripe 线上密钥
- OpenAI API 密钥
- 生产环境数据库 URL
自动化扫描器在 30 秒以内 就发现了它。等到 GitHub 的 secret‑scanning 撤销了这些令牌时,攻击者已经产生了 $14 000 的 OpenAI API 费用。
这有多常见?
| Metric | Value |
|---|---|
| 在公共 GitHub 仓库中暴露的新密钥(2024) | 12.8 million |
| 同比增长 | +28 % |
| 私有仓库暴露 | 更糟——没有公开扫描 |
Source: GitGuardian “2024 State of Secrets Sprawl” report.
为什么 .env 文件很危险
dotenv 模式(起源于 Ruby,2012 年)通过将凭证移到一个单独的、已在 .gitignore 中排除的文件,解决了在源代码中硬编码凭证的问题。
然而,今天典型的开发者的 .env 看起来像这样:
OPENAI_API_KEY=sk-proj-abc123...
STRIPE_SECRET_KEY=sk_live_...
DATABASE_URL=postgresql://admin:password@prod-db.example.com:5432/main
CLOUDFLARE_API_TOKEN=v4x...
AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI...问题:
- 明文 – 任何拥有读取文件权限的人都可以看到这些密钥。
- 没有认证 – 任何以你的用户身份运行的进程(例如,恶意的
npm postinstall脚本、被入侵的 VS Code 插件、粗心的 Docker 构建)都可以悄悄读取该文件。 - 未加密存储 – 文件以未加密的形式存放在磁盘上。
- 缺乏审计 – 你无法判断哪个进程访问了哪个密钥。
- 缺少过期跟踪 – 密钥在被轮换后仍会长期残留。
警告
最初对.env的假设是只有你的应用会读取该文件。该假设在 2025 年被打破。
AI 编码代理放大了风险
AI 助手(Claude Code、Cursor、GitHub Copilot、Codex 等)会例行读取项目中的每个文件以构建上下文。当它们摄取 .env 文件时:
密钥值会成为模型的上下文窗口的一部分。
它们可能出现在生成的代码、调试输出、错误信息或聊天记录中。
即使是善意的助手也可能泄露凭证:
“你的
DATABASE_URL返回 connection refused” → 完整的 URL 会出现在聊天记录里,被团队成员共享,供服务提供商记录,甚至可能被用作训练数据。
结论: 如果一个密钥存放在 AI 代理可以读取的文件中,就假设它会被读取。
macOS 更佳方案:NoxKey + Keychain
macOS 钥匙串是由 Secure Enclave 支持、受 Touch ID 保护的加密凭证存储。NoxKey 是一个轻量包装,使钥匙串对开发者更加便利。
前后对比
| 之前 | 之后 |
|---|---|
磁盘上的明文 .env 文件 | 密钥存储在钥匙串中,使用 Touch ID 解锁 |
cat .env 显示所有键 | noxkey get … 会提示 Touch ID,然后将密钥注入到 shell(从不写入磁盘) |
示例工作流
# 存储密钥(Touch ID 提示)
$ noxkey set myorg/project/STRIPE_KEY --clipboard
✓ Stored myorg/project/STRIPE_KEY
# 加载到当前 shell(Touch ID 提示)
$ eval "$(noxkey get myorg/project/STRIPE_KEY)"
# → secret now available as $STRIPE_KEY
$ echo $STRIPE_KEY
sk_live_51Hx...特性:
- 单一密钥,单一位置 – 可从任何项目目录访问。
- 磁盘上无文件 – 原始值从不触及文件系统。
- 每次访问均需 Touch ID – 确保有人在场。
- AI 感知 – 当 AI 代理调用
noxkey get时,NoxKey 检测代理的进程树并返回 AES‑256‑CBC 加密的交接 而不是原始值,保持密钥不出现在模型上下文中。
代理调用 noxkey get → 检测进程树 → AES‑256‑CBC 加密 → 密钥在环境变量中,永不出现在上下文中导入已有 .env 文件
# 从 .env 文件导入所有密钥
$ noxkey import myorg/project .env
✓ Imported 5 secrets
# 列出已导入的内容
$ noxkey ls myorg/project/
myorg/project/STRIPE_SECRET_KEY
myorg/project/OPENAI_API_KEY
myorg/project/DATABASE_URL
myorg/project/CLOUDFLARE_API_TOKEN
myorg/project/AWS_SECRET_ACCESS_KEY
# 查看值(仅前 8 个字符)
$ noxkey peek myorg/project/STRIPE_SECRET_KEY
sk_live_...
# 最后,删除不安全的文件
$ rm .env批量清理示例
# 在 ~/dev 中查找所有 .env 文件(排除 node_modules 和 .git)
$ find ~/dev -name ".env" -not -path "*/node_modules/*" -not -path "*/.git/*" | wc -l
47我们在一个下午使用上述命令导入了 47 个
.env文件。
这在更大的图景中如何定位?
- 本地开发 – NoxKey(或操作系统原生凭证存储)在你的笔记本电脑上保护机密。
- CI/CD 流水线 – 使用平台特定的机密存储:GitHub Actions secrets、Cloudflare 环境变量、AWS Parameter Store、HashiCorp Vault 等。
当前的缺口是 笔记本端 的机密管理。用操作系统凭证存储替代明文文件即可弥补此缺口。
限制与考虑
- 仅限 macOS – NoxKey 只能在 macOS 上运行。Linux 和 Windows 团队需要等效的解决方案(例如 Gnome Keyring、Windows Credential Manager)。
- 摩擦感 – Touch ID 在每次访问时会增加一点身份验证步骤。
- 您可以使用
noxkey unlock myorg/project来减少提示,这将在会话期间只进行一次身份验证。 - 仍然比
.env文件的零身份验证模型更安全。
- 您可以使用
TL;DR
- Plaintext
.env文件是一种风险 – 它们会向任何能够读取该文件的人员(或进程)泄露机密。 - AI 代理会加剧风险 – 任何它们能够读取的文件都可能泄漏到模型上下文中。
- 用操作系统级别的凭证存储取代
.env(macOS Keychain + NoxKey,或其他操作系统的等价方案)。 - 导入已有的
.env文件,删除它们,并在所有项目中采用新工作流。
在下一个“$14 k API 费用”故事成为你的现实之前,立即保护你的开发环境。
为什么 .env 文件不安全
- 无加密 – 值以明文存储。
- 无认证 – 任何能够读取该文件的进程都可以看到机密。
- 无访问控制 – 每个 AI 代理、恶意脚本或意外的
git push都可能泄露数据。
去年公共仓库中泄露了 1280 万个机密。AI 代理现在会读取项目目录中的每个文件。供应链攻击针对明文凭证。
.env模式在 2012 年是个好主意;在 2026 年已成为负担。
更好的方式:macOS钥匙串(via NoxKey)
您的操作系统已经提供了一个加密的、硬件支持的凭证存储,并具备生物识别认证。请使用它。
关键要点
- 将机密移至 macOS钥匙串 —— 单一安全位置,每次访问均使用 Touch ID,AI 代理永不看到原始值。
- 迁移每个项目仅需 几分钟。
安装 NoxKey
brew install no-box-dev/noxkey/noxkey- 免费 – 无需账户,无云端;你的密钥保存在本机。
- 开源 – 请在 GitHub 上查看仓库。
NoxKey 工作原理
NoxKey 将 Keychain 包装成对开发者友好的 CLI。
# Retrieve a secret and inject it into the environment
eval "$(noxkey get myorg/KEY)"这取代了通常的 process.env.KEY 用法。
常见问题
为什么
.env文件不安全?
它们缺乏加密、身份验证和访问控制。应该用什么代替 dotenv?
通过 NoxKey 将机密存储在 macOS 钥匙串中。AI 代理能读取
.env文件吗?
能——它们可以读取任何能够访问的文件。如何从
.env迁移到 macOS 钥匙串?# Install NoxKey (if not already installed) brew install no-box-dev/noxkey/noxkey # Import all secrets from your .env file into the Keychain noxkey import myorg .env # Delete the .env file after a successful import rm .env迁移大约需要 每个项目一分钟。
资源
更新你的工作流程:
与其复制 .env.example 并手动填写值,不如只运行一次 noxkey import 并使用 eval 命令。我们花了一天时间才摆脱本能地去找 .env 的习惯——现在每个项目只需一分钟即可完成。