我用 Rust 构建了一个零配置的 Secret Manager,因为 .env 文件是安全戏剧
发布: (2026年3月30日 GMT+8 14:21)
3 分钟阅读
原文: Dev.to
Source: Dev.to
.env 的真实问题
让我具体说明一下有哪些问题:
- 它们是明文的。 你的
DATABASE_URL就放在磁盘上的一个文本文件里,和代码放在一起。如果你的笔记本电脑被攻破,所有的密钥也会一起泄露。 - 它们通过不安全的渠道传播。 新来的开发者怎么获取这些密钥?Slack 私信、电子邮件,甚至是 Google 文档。这些内容在存储时并未加密,会被索引并长期保留。
- 它们是静态的。 你在 2022 年的
.env中的STRIPE_SECRET_KEY仍然有效吗?仍然保存在旧笔记本的备份里。永不过期的静态凭证就是不断送给攻击者的礼物。 - Git 是永久的。 即使使用
.gitignore,密钥仍会进入仓库。误提交后又删除——但git log仍然记得所有历史。GitHub 甚至推出了密钥扫描功能,正是因为这种情况屡见不鲜。 - 没有审计日志。 谁在上周二凌晨 3 点访问了
PROD_DATABASE_URL?使用.env文件时:根本不知道,毫无可视性。
我改而构建的东西
我实在是受够了,于是花了一个周末打造了 zenv —— 一个零配置的运行时密钥注入工具,专为开发者设计。源码已在 GitHub 上公开:github.com/arvytechnolgies/zenv。
思路很简单:用加密保险库取代 .env 文件,在运行时注入密钥。
# Before zenv
cp .env.example .env
# edit .env with secrets from Slack...
npm start
# After zenv
zenv init
zenv vault import .env # one‑time migration
zenv run -- npm start # secrets injected at runtime