停止在 .env 文件中放置 API 密钥 — 改用操作系统钥匙串

发布: (2026年3月27日 GMT+8 06:35)
10 分钟阅读
原文: Dev.to

请提供您希望翻译的完整文本内容,我才能为您进行简体中文翻译。

用一句话描述问题

一位 YC 初创公司的开发者不小心将 .env 文件推送到了公开的 GitHub 仓库。文件中包含:

  • Stripe 线上密钥
  • OpenAI API 密钥
  • 生产环境数据库 URL

自动化扫描器在 30 秒以内 就发现了它。等到 GitHub 的 secret‑scanning 撤销了这些令牌时,攻击者已经产生了 $14 000 的 OpenAI API 费用。

这有多常见?

MetricValue
在公共 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...

问题:

  1. 明文 – 任何拥有读取文件权限的人都可以看到这些密钥。
  2. 没有认证 – 任何以你的用户身份运行的进程(例如,恶意的 npm postinstall 脚本、被入侵的 VS Code 插件、粗心的 Docker 构建)都可以悄悄读取该文件。
  3. 未加密存储 – 文件以未加密的形式存放在磁盘上。
  4. 缺乏审计 – 你无法判断哪个进程访问了哪个密钥。
  5. 缺少过期跟踪 – 密钥在被轮换后仍会长期残留。

警告
最初对 .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

  1. Plaintext .env 文件是一种风险 – 它们会向任何能够读取该文件的人员(或进程)泄露机密。
  2. AI 代理会加剧风险 – 任何它们能够读取的文件都可能泄漏到模型上下文中。
  3. 用操作系统级别的凭证存储取代 .env(macOS Keychain + NoxKey,或其他操作系统的等价方案)。
  4. 导入已有的 .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 的习惯——现在每个项目只需一分钟即可完成。

0 浏览
Back to Blog

相关文章

阅读更多 »