SpringBoot 使用 jasypt 对配置项进行加密

用户头像
hungxy
关注
发布于: 2020 年 07 月 19 日
SpringBoot 使用 jasypt 对配置项进行加密

为什么要对配置文件进行加密

spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/user?serverTimezone=CTT&useSSL=false&allowPublicKeyRetrieval=true
username: test
password: 123456
redis:
host: 127.0.0.1
port: 6379
password: 123456
...



像这样将项目的数据库密码、redis密码等直接写在项目中会有潜在的风险,比如项目源码泄漏,员工一不小心将公司源码上传到公有仓库,导致公司数据库密码泄漏。这时候对配置文件的关键信息进行加密就变得非常有必要了

jasypt 介绍

jasypt 是一个开源的工具包,可以很方便的对 SpringBoot 配置文件中的配置项进行加密,保护重要数据,下面讲解一下 jasypt 的使用

jasypt 使用

引入依赖

<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>

生成加密字符串

既然需要对关键配置信息进行加密,就需要获取加密后的字符串,可以使用以下三种方式获取加密字符串



  • 通过 api 获取

public static void main(String[] args) {
BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
// 加密密钥
textEncryptor.setPassword("ADUMDFUOV7834*");
// 要加密的数据(如数据库的用户名或密码)
String username = textEncryptor.encrypt("root");
String password = textEncryptor.encrypt("123");
System.out.println("username:" + username);
System.out.println("password:" + password);
}



输出信息为:

username:ybOxTBF7SimOMLKlD7b3WA==
password:NTT9dRodj5y6o+Ppq1rFsQ==



  • 执行 jar 获取

如果你引入了jasypt-spring-boot-starter依赖,可以在本地maven仓库的org/jasypt/jasypt/1.9.3路径下找到jasypt-1.9.3.jar这个 jar 包,可以直接使用这个 jar 对数据进行加密

java -cp ./jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI password="ADUMDFUOV7834*" algorithm=PBEWithMD5AndDES input=root



输出信息为:

----ENVIRONMENT-----------------

Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 25.231-b11

----ARGUMENTS-------------------

input: root
algorithm: PBEWithMD5AndDES
password: ADUMDFUOV7834*

----OUTPUT----------------------

y7lANzmle3mXD2aiComkww==



OUTPUT 下面的就是加密后的字符串,这里加密后的字符串与通过 api 获取的字符串不同,是因为PBEWithMD5AndDES 算法每次的加密结果都不一样,对加密后的数据进行解密,还是能解密出原始数据的



  • maven 插件方式生成加密字符串

添加 jasypt-maven-plugin

<build>
<plugins>
<plugin>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-maven-plugin</artifactId>
<version>3.0.3</version>
<configuration>
<path>file:src/main/resources/application.yml</path>
</configuration>
</plugin>
</plugins>
</build>



DEC()包裹需要加密的字符

spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/user?serverTimezone=CTT&useSSL=false&allowPublicKeyRetrieval=true
username: DEC(test)
password: DEC(123456)
redis:
host: 127.0.0.1
port: 6379
password: DEC(123)



执行命令

mvn jasypt:encrypt -Djasypt.encryptor.password="ADUMDFUOV7834*"



当看到BUILD SUCCESS表示执行成功,再看application.yml文件,发现用DEC()包裹的配置已经成功加密了,并且前缀由DEC变成ENC

spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/user?serverTimezone=CTT&useSSL=false&allowPublicKeyRetrieval=true
username: ENC(qU0YwDQ3Y+X8tyuw/HPJlUsCKgMj7Zk0F+z/9tCNNMPLsSD506TM/I8U9VyXGWN0)
password: ENC(du4D62bhnGX8vcFQkamwfn/VzDLPwkmxWn4A1wyWu/e6pM0HfrOBc7lqd/vVGUEo)
redis:
host: 127.0.0.1
port: 6379
password: ENC(8yn4z61PwOJTXrpVx+iQVmJbsuNEQGLFVf5TDcnKKzsge4rmInCPMKUfqIIotyGc)

验证

到这里就已经完成对关键配置的加密过程,下面写一个简单的示例验证加密后的数据是否能准确解密

@RestController
public class TestController {
@Value("${spring.datasource.password}")
private String databaseUsername;
@Value("${spring.datasource.username}")
private String databasePassword;
@GetMapping("/getDatabaseInfo")
public String getDatabaseInfo(){
return "username: " + databaseUsername + "," + "password: " + databasePassword;
}
}



运行项目,发现控制台报错如下:



记得前面加密时用到的密钥吗ADUMDFUOV7834*,解密的时候同样需要提供密钥才能正常解密,我们可以在 application.yml 中加入如下配置

jasypt.encryptor.password: ADUMDFUOV7834*



重新运行程序,浏览器访问localhost:8080/getDatabaseInfo,接口返回

username: 123456,password: test



证明jasypt在加载配置的时候,会自动完成配置的解密过程,对加密后的配置进行解密

线上使用

可以看到,使用jasypt十分的方便,只需要引入依赖,对需要的配置项进行加密即可,jasypt会自动的完成解密过程



但回到开头,我们加密配置项的目的是为了防止在配置文件泄漏的时候,把配置信息一起泄漏出去。配置我们是加密了,但密钥还是保存在配置文件中,别人还是能拿到密钥在解密出配置信息,这就相当于我们把门给锁了,但是钥匙还是插在锁上,所以需要将配置跟密钥分开存储



  • 通过启动命令将密钥传给应用

java -jar demo.jar --Djasypt.encryptor.password="ADUMDFUOV7834*"



  • 通过环境变量的方式

#!/bin/bash
export ENCRYPTOR_PASSWORD=ADUMDFUOV7834*
java -jar -Djasypt.encryptor.password=$ENCRYPTOR_PASSWORD



jasypt项目地址:https://github.com/ulisesbocchio/jasypt-spring-boot



扫码关注我

一起学习,一起进步



发布于: 2020 年 07 月 19 日 阅读数: 92
用户头像

hungxy

关注

还未添加个人签名 2018.07.19 加入

还未添加个人简介

评论

发布
暂无评论
SpringBoot 使用 jasypt 对配置项进行加密