Spring Boot整合jasypt加密配置文件
值得一提的是,除了 jasypt 加密配置外,druid 也自带有加密功能
# 环境
- Maven 版本:Apache Maven 3.8.1
- jasypt 版本:3.0.4
# pom.xml
# 依赖
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.4</version>
</dependency>
# 插件
用于单次的加解密
<build>
<plugins>
<plugin>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-maven-plugin</artifactId>
<version>3.0.4</version>
</plugin>
</plugins>
</build>
# application.yml
不建议直接写在
application.yml
中,不安全,应该启动时携带参数传递
# 加解密密钥
jasypt:
encryptor:
password: 密钥
# 文档加解密
密钥不应该出现在配置文件中,而是全程在外部操作
# 手动加解密
加密
如果是多模块项目,要在启动模块下执行 *(不确定这是不是一个 bug,之所以要在启动类下执行,是因为它要读取配置文件,但实际上,这个命令并不需要读取配置文件)*
# 我当前mvn版本的正确写法
mvn jasypt:encrypt-value -D jasypt.encryptor.password="密钥" -D jasypt.plugin.value="明文"
# 官方文档的写法
# mvn jasypt:encrypt-value -Djasypt.encryptor.password="密钥" -Djasypt.plugin.value="明文"
解密
# 我当前mvn版本的正确写法
mvn jasypt:decrypt-value -D jasypt.encryptor.password="密钥" -D jasypt.plugin.value="密文"
# 官方文档的写法
# mvn jasypt:decrypt-value -Djasypt.encryptor.password="密钥" -Djasypt.plugin.value="密文"
# 批量加解密
批量将配置文件中要加密的属性值进行加密,将要加密的内容使用 DEC()
包起来
username: nadmin_vue_base
password: DEC(123456)
加密
# 将application-dev.yml中的DEC(aaaa)->ENC(bbbb)
mvn jasypt:encrypt -D jasypt.encryptor.password="密钥" -D jasypt.plugin.path=file:src/main/resources/application-dev.yml
解密
# 将application-dev.yml中的ENC(bbbb)->DEC(aaaa)
mvn jasypt:decrypt -D jasypt.encryptor.password="密钥" -D jasypt.plugin.path=file:src/main/resources/application-dev.yml
由于本人的配置文档中存在中文注释,使用批量加解密会导致乱码,批量解密这一步并没有完成测试,请自测。
# 启动参数
添加 Program arguments
--jasypt.encryptor.password=密钥
完
# 记录一个坑
环境:
- 项目类型:多模块单体项目
- Maven 版本:Apache Maven 3.8.1
- jasypt 版本:3.0.4
项目是多模块单体项目,由于并不打算将密钥 ( jasypt.encryptor.password
) 存储到配置文件中,想通过外部传递密钥,这样即便被获取到源码,也不能解出明文。在查阅了相当多的资料中,加解密的方式有很多种,有测试类、在线网站、jar 包、maven 插件,在官方仓库的 readme.md
中使用的是 maven 插件的方式,这一种方式不需要依赖在线网站或是单独的 jar,是我觉得比较理想的方案,于是乎我的坑就来了:
我先是在 /pom.xm
中添加了相应的插件,使用官方提供的命令
mvn jasypt:encrypt-value -Djasypt.encryptor.password="the password" -Djasypt.plugin.value="theValueYouWantToEncrypt"
执行后报错:
[ERROR] Failed to execute goal com.github.ulisesbocchio:jasypt-maven-plugin:3.0.4:encrypt-value (default-cli) on project xxx: Execution default-cli of goal com.github.ulisesbocchio:jasypt-maven-plugin:3.0.4:encrypt-value failed: Config data location 'file:./src/main/resources/' cannot be found -> [Help 1]
然后我把插件放到了启动类所在的 模块/pom.xml
,报错就变成了
[ERROR] Failed to execute goal com.github.ulisesbocchio:jasypt-maven-plugin:3.0.3:encrypt-value (default-cli) on project ruoyi: No jasypt.plugin.value property provided -> [Help 1]
开始我并没有仔细看这个报错,以为还是插件的问题,以为只能够在根 pom.xml 中使用,在这里卡了很久,最后我仔细查看报错,是没有提供 jasypt.plugin.value property
属性。
于是我使用 mvn -help
查阅了当前 maven 版本的参数说明,发现官方文档中的写法并不适用于我当前使用的 maven 版本,所以我当前环境下正确写法应该是
# -D,--define <arg> Define a system property
mvn jasypt:encrypt-value -D jasypt.encryptor.password="密钥" -D jasypt.plugin.value="明文"
# 参考
- [ulisesbocchio/jasypt-spring-boot: Jasypt integration for Spring boot](ulisesbocchio/jasypt-spring-boot: Jasypt integration for Spring boot )
- Spring Boot demo 系列(九):Jasypt - SegmentFault 思否 (opens new window)
- How to encrypt passwords in a Spring Boot project using Jasypt - GeeksforGeeks (opens new window)
- feat: run encrypt-value mojo anywhere with maven command. by qxo · Pull Request #284 · ulisesbocchio/jasypt-spring-boot (opens new window)