Dotenvx: 让.env、.properties等配置文件更易用,更安全
.env文件是很多开发者熟悉的配置文件格式,它也在The Twelve-Factor App之配置篇受到推荐。 它的优点是简单易用,支持多种语言和框架,广泛应用于各种项目中,尤其是在Node.jsp和Python等应用中, Go语言的GoFr框架,也默认使用.env文件来存储配置。
.env做一个配置文件的好处是它简单易用,支持多种语言和框架,广泛应用于各种项目中。 但是.env文件有一个显著的缺点:它不安全。
.env是一个纯文本文件,在存储配置时,不少开发者会将敏感信息(如API密钥、数据库密码等)直接写入其中,这样就可能导致这些敏感信息被泄露, 主要包括:
- 任何人员都可以读取.env文件内容:没有加密,如果你将产品环境的配置使用.env文件存储,那么任何能访问到该文件的人都可以读取到敏感信息。
- 版本控制:原则上,配置文件不应该被提交到版本控制系统中,但很多开发者还是会将.env文件提交到Git仓库中,这样就可能导致敏感信息被泄露。各种围绕Git仓库工具,如CI/CD, Code Review等,都可以访问到这些代码,导致敏感信息泄露。
- AI编程:目前大多数程序员都在使用AI编程助手,包括编辑器、IDE工具、或者Claude Code这类命令行工具,它们都会读取项目的所有文件,然后根据这些文件的信息,构建出强大的上下文来生成代码。如果你将敏感信息写入.env文件中,这些信息100%会被AI助手读取并提交到云端,从而导致敏感信息泄露。
目前环境下,.env文件被AI工具读取并提交到远端,这个已经没法避免了,至于你存在.env文件中的敏感信息是否会被泄露,这个主要取决于大语言模型和AI工具厂商的人品和内部的安全管理系统啦,否则一定会被泄露。 只要你用上AI工具,.env文件中的敏感信息就有可能被泄露。有的时候,我个人编辑保存有账号密码的文本文件时,直接使用vim编辑器,如果你使用VS Code, Zed等编辑器,同样是内置AI助手的,这些编辑器会读取你打开的文件内容,并将其发送到云端进行处理。
个人也有一些KMS(Key Management Service)的开发经验,KMS是一个专门用于存储和管理密钥的服务,它可以帮助你安全地存储和管理敏感信息,如API密钥、数据库密码等。 但是KMS也有不少不少缺点,典型的就是太麻烦。对于不少个人开发者或者中小团队,KMS的使用成本太高了,通常需要额外的配置和管理工作,开发体验也不够好。
那么能否实现还继续使用.env文件,而且又能安全地存储敏感信息呢?答案是可以的。这个就是dotenvx。 dotenvx是由Node.js的dotenv库作者开发的一个新项目,它的前身为dotenv-vault,这个也是我个人非常喜欢的一个项目, 它的目标就是提供一套.env文件的加解密机制,同时要保证开发者的使用体验和便利性。
dotenvx可以理解为一套规范,也就是.env文件的格式、加解密的算法、和私钥(private key)的管理方式等,在此基础上并提供了相关的SDK和命令行工具, 这样就可以方便开发人员、应用和框架等快速集成dotenvx。目前官方提供了Node.js、Python、Ruby等多种语言的SDK,并提供了对应的命令行工具dotenvx。
既然广泛已经提供了dotenvx SDK和命令行工具,那么为何你还需要做一个dotenvx的实现呢?主要有以下几点:
Node.js版本的dotenvx命令行文件太大
大多数dotenv的命令行都使用Node.js编写,主要是是受众多,所以dotenvx也不例外,但是对于其他语言开发者来说, 准备Node.js环境就挺麻烦,这也是官方将dotenvx打包为独立的可执行程序,方便使用,但是文件接近60M,这个也稍微有点大啦。 相反,Rust版本的dotenvx命令行工具只有3M左右,体积小,启动快,使用起来更方便。
此外Dotenvx Rust命令行采用二进制方式发布,不像Node.js版本那样,存在代码泄露的风险,这个对安全产品来说,将所有的代码都发布出去, 即便是bundle后的JS代码,也是不能接受的。
企业特性
一些企业需要的特性,如.env文件的版本控制、.env.keys
的文件加密、key的使用跟踪等,这些还是需要一些定制的,虽然dotenvx也提供了radar(雷达)特性,
但是针对一些企业来说,这些特性还是不够的。
Front Matter
目前dotenvx的规范中并没有接入Front Matter的概念,Front Matter是一个在文件开头添加元数据的方式,这个已经在很多地方都以使用, 如Markdown的Front Matter,Python的PEP 723 – Inline script metadata, Rust的Cargo Script,都采用了这一机制。
借助Front Matter,我们可以在.env文件中添加一些元数据,如UUID、版本号、作者等,这样可以方便我们对.env文件进行管理和维护。 此外我们还可以在Front Matter中添加签名信息,这样可以保证.env文件的完整性和安全性。
让我们看一下更新版本的.env文件,如下:
# ---
# uuid: f7580ac5-0b24-4385-b3ff-819225b687f3
# name: input your name here
# group: demo
# sign: +1+y3Eio5OHPcp9xiP125qfXl/CX4Zuxhft91aW59WtTjZJoSDmFs4KPZ2nDop07VdYkE8vF2BWuUpneCU1xlA==
# ---
DOTENV_PUBLIC_KEY="02b4972559803fa3c2464e93858f80c3a4c86f046f725329f8975e007b393dc4f0"
# Environment variables. MAKE SURE to ENCRYPT them before committing to source control
HELLO=encrypted:BNexEwjKwt87k9aEgaSng1JY6uW8OkwMYEFTwEy/xyzDrQwQSDIUEXNlcwWi6rnvR1Q60G35NO4NWwhUYAaAON1LOnvMk+tJjTQJaM8DPeX2AJ8IzoTV44FLJsbOiMa77RLrnBv7
Java的支持
目前dotenvx首选支持的语言是Node.js和Python,其他的语言SDK还在开发中,我也贡献了dotenvx-java和dotenvx-rust两个SDK, 这两个SDK都是支持标准的dotenvx规范的。
但是考虑到国内众多的Java开发者和Spring Boot的广泛使用,Java的支持还是很有必要的。 除了要有Spring Boot的支持外,目前我开发了dotenvx-spring-boot,
这个是一个Spring Boot的starter,可以方便地集成dotenvx到Spring Boot应用中。 我们还需要dotenvx命令行工具支持application.properties
和Spring Profile,所以要涉及对命令行的功能提升。
开发新的dotenvx命令行工具
考虑到以上的种种原因,这也是为何开发了Rust版本的dotenvx命令行工具,主要是为了提供更好的开发体验和安全性,方便开发人员使用。
后续我会在这里发布一些和dotenvx相关的文章、文档和工具开发进度等,欢迎大家的关注和支持。