Skip to main content

如何在Spring Boot项目中使用Dotenvx软连接

· 2 min read
Libing Chen
Java程序员,兼全栈、Rust和AI开发

如何在Spring Boot中集成Dotenvx保护你的配置项?一文中我们介绍了如何在Spring Boot项目中集成Dotenvx,从而保护你的配置项。 这篇文章我们将介绍一下Dotenvx的软连接特性,可以就可以让你快速地访问Spring Boot中配置的服务,如MySQL、Redis等。

数据库(MySQL/PostreSQL)和Redis基本上是Spring Boot应用中的标配,样例配置如下:

spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=encrypted:xxxxx

Spring Boot配置完成后,Spring Boot应用就可以访问数据库啦,你也不用担心密码泄露。

接下来你会在IntelliJ IDEA中会配置对应的数据库连接,这样做我们就可以在IDE中直接查看数据, 同时数据库的schema信息,也可以帮助到代码提示、代码审核等。

但是在一些场景中,我们可能还是需要用到mysql命令,如配合一些自动化操作,同时一些同学也非常喜欢命令行操作方式。 但是要每次输入数据库密码,非常麻烦。或者将数据库密码写到命令行中,这样也不安全。

Minisign介绍: 一个轻量级的数字签名工具

· 2 min read
Libing Chen
Java程序员,兼全栈、Rust和AI开发

Minisign是一个非常轻量级的数字签名工具,基于Ed25519算法实现,主要用于对文件进行签名和验证,确保文件的完整性和真实性。 完整性是指文件在传输或存储过程中没有被篡改,而真实性则是指文件确实是由声称的作者所创建的。

Minisign在签名前会生成一对公钥和私钥,私钥用于签名文件,而公钥则用于验证签名。这样,任何拥有公钥的人都可以验证文件是否被篡改过,当然也可以确认文件确实是由私钥持有者所签名的。

通过minisign -G -W即可生成一对公钥和私钥,公钥文件为minisign.pub,私钥文件为$HOME/.minisign/minisign.key,请妥善保管好私钥文件。

Tips: 如果你要使用password保护生成的秘钥,请使用minisign -G命令,会提示你输入password。后续签名文件时,也需要输入该password。

如果你检查一下public key文件,你会发现公钥

Dotenvx和AI的整合:为context提供配置信息,同时保护你的敏感信息

· 2 min read
Libing Chen
Java程序员,兼全栈、Rust和AI开发

在之前的一篇文章中,我们介绍了AI编程:配置先行,讨论了配置在AI编程中的重要性,它是编程中不可缺少的一环, 不单是代码和配置的分离,更是AI Agent生成代码时的重要上下文信息来源。

我们希望AI Agent能够读取配置文件中的配置项,从而生成更符合我们需求的代码片段,但是我们也不希望AI Agent读取敏感信息,如数据库密码、API Key等, 造成敏感信息的泄露。那么Dotenvx在这方面能提供什么帮助呢?

目前不少AI工具都会支持.aiignore这些文件,用于告诉AI Agent忽略某些文件或者目录, 如Cursor有自己的.cursorignore,详细可以参考 https://cursor.com/cn/docs/context/ignore-files

Dotenvx的软连接的内存占用情况

· 2 min read
Libing Chen
Java程序员,兼全栈、Rust和AI开发

dotenvx link <command>命令可以创建命令软连接,这个是对原有命令的封装。当你执行软连接命令式,其实是由Dotenvx命令行来执行的, 然后会加载配置文件,然后再执行原命令,这样就完成了对原命令的.env配置集成。

在日常中,只要涉及到诸如数据库的场景,数据库的链接信息已经在.env或者application.properties中配置好啦,如MySQL, 我通常会执行dotenvx link bin/mysql创建对应的dotenvx软连接,然后执行./bin/mysql, 就可以登录配置项指定的MySQL数据库了,不需要输入任何账户密码,非常方便。 同时也不用担心密码泄露的问题,之前都是保存在某一justfile中,密码也是直接写到文件中的,你当然可以不写, 但是公司内部的防弱密码政策,完全让我记不住这些密码,手动输入非常麻烦。

那有同学会问,使用这种软连接方式会不会增加额外的内存占用呢?效率高吗?这里给大家做一个简单的对比。

Dotenvx企业版本特性:加密混淆

· 3 min read
Libing Chen
Java程序员,兼全栈、Rust和AI开发

Dotenvx采用非对称加密,也就是使用public key加密,使用private key进行解密,加密后的内容使用base64进行文本化, 典型的样例就是encrypted:xxxx这样的加密文本值。

在一个典型的.env文件中,保存有普通文本配置,加密项配置和Public Key,然后根据Public Key查找到对应的private key, 就可以进行解密,这个算法也是公开的。

但是在企业内部,处于较高的安全需求,希望即便拿到了private key,也无法解密配置项。那么如何做到这一点呢?

Dotenvx企业版本提了一个加密值混淆的特性,也就是说加密的值,也就是对应的字节数组,会在进行一次混淆,然后再以文本方式呈现出来, 在界面的时候,你需要知道对应的混淆算法,然后才能进行解密。

Dotenvx整合了Linter,快速检查.env是否符合规范

· One min read
Libing Chen
Java程序员,兼全栈、Rust和AI开发

最新的Dotenvx 0.4.26版本,增加了新的dotenvx lint命令,可以帮助你检查.env文件中的配置项是否符合规范。 dotenvx lint命令基于dotenv-linter 4.0

dotenv-linter默认包含的规则如下:

  • ✅ Duplicated key
  • ✅ Ending blank line
  • ✅ Extra blank line
  • ✅ Incorrect delimiter
  • ✅ Key without value
  • ✅ Leading character
  • ✅ Lowercase key
  • ✅ Quote character
  • ✅ Schema violation
  • ✅ Space character
  • ✅ Substitution key
  • ✅ Trailing whitespace
  • ✅ Unordered key
  • ✅ Value without quotes

考虑到dotenvx的一些特殊性,如DOTENV_PUPLIC_KEY在文件开头位置,所以dotenvx lint命令会自动忽略❌ Unordered key,这个大家注意一下。

Dotenvx和Bun的一些整合样例

· 2 min read
Libing Chen
Java程序员,兼全栈、Rust和AI开发

Bun 1.3发布啦,特性太大啦,有点目不暇接,不要TLDR,有精力的同学还是可以看看的,吃不了亏,上不了当。

Bun有对环境变量和.env文件的默认支持,详细请参考Bun Environment variables 借助这些环境变量,Bun可以快速完成诸如数据库连接、Redis连接、S3连接等操作,非常简单。 如在.env中中添加以下配置,Bun就会完成默认的数据库连接:

MYSQL_URL="mysql://root:this_is_long_password@localhost:3306/test"

但是保存在.env文件中的敏感信息都是明文的,这样就会有泄露风险,那么如何结合Dotenvx来保护这些敏感信息呢?

几种常见的配置文件加密方案对比: .env, SOPS, Vault, Dotenvx

· 4 min read
Libing Chen
Java程序员,兼全栈、Rust和AI开发

在现代应用开发中,保护敏感配置数据(如API密钥、数据库密码等)变得越来越重要。典型的配置会包含两个部分:

  • Settings: 普通配置项,非敏感数据,如监听打开,日志level等
  • Secrets: 敏感配置项,如数据库密码,API Key等

典型的配置系统通常会同时包含这两部分配置项,Settings通常以明文形式存储,而Secrets则需要加密保护。

接下来是几种常见的配置文件加密方案的对比分析:

普通的.env文件

这个是最常见的方案,简单易用,你只需要在项目根目录创建一个.env文件, 并将其添加到.gitignore中,确保它不会被提交到版本控制系统中。然后使用类似dotenv的库在应用启动时加载这些环境变量。

.env文件的优点是简单直接,各种语言和框架都有对应的库支持,使用方便,适合小型项目和个人开发者。 在Node.js和Python生态中,.env非常流行,看一下这两个语言的dotenv库就知道啦。

当然.env文件也有一些缺点,就是没有加密特性,敏感信息以明文形式存储在文件中,比如如果不小心提交到了版本控制系统中,可能会导致敏感信息泄露, 这也是GitHub上泄露API Key的主要原因之一,另外如果多人协作开发,协作也非常麻烦。在新的AI Code场景下,明文存储的.env文件,可能会被AI Agent读取到,导致敏感信息泄露。

Dotenvx Spring Boot添加ES256K JWT和secp256k1签名支持

· 2 min read
Libing Chen
Java程序员,兼全栈、Rust和AI开发

JWT在Web应用中应用非常广泛,对Spring Boot应用也不例外,不少同学都会使用Nimbus JOSE + JWT生成并验证JWT, 当然Nimbus JOSE + JWT也是Spring Boot推荐的JWT开发包。

Nimbus JOSE + JWT覆盖多种算法支持,典型的如HS256,RS256等,当然也包括secp256k1的支持,其算法名称为ES256K, 详细请参考JSON Web Token (JWT) with ES256K (secp256k1) signature

几款常见工具和框架的环境变量配置实践

· 3 min read
Libing Chen
Java程序员,兼全栈、Rust和AI开发

不少开发工具和框架,都或多或少地依赖环境变量来进行配置,下面介绍几款比较流行的工具和框架。

GoFr

GoFr是一个用Go语言编写的微服务框架,专注于简化微服务的开发和部署。它提供了一套完整的工具和库,帮助开发者快速构建高性能、可扩展的微服务应用。 其配置项,GoFr Config,几乎完全是基于环境变量的。 在开发阶段,你只需要configs/.env文件来保存配置项,而在生产环境中,你可以通过环境变量来覆盖这些配置项。

Deno

Deno是一个基于V8引擎的JavaScript和TypeScript运行时,旨在提供一个安全、现代化的开发环境。Deno内置了对TypeScript的支持,并且默认启用了许多安全特性,如权限控制和模块化。 Deno默认支持.env文件,如deno run --env-file main.ts,可以轻松为Deno应用加载环境变量配置项。

此外Deno自身的配置,也是基于环境变量的,可以通过Special environment variables进行查看。