以下是选自一个典型的springboot项目的application.properties文件:
#...省略
## 配置MySQL数据库连接
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://121.196.***.***:3306/user?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456
## 配置Redis缓存连接
redis.host=121.196.***.***
redis.port=6379
redis.password=111111
#...省略
粗略一看,似乎确实没什么问题,但是仔细一想会发现,很多密码配置都是明文,没有做任何的处理,如果直接将其上传到github等开源社区将存在被删库跑路极大风险。
那么如何对这类的配置文件进行加密处理呢?这里就引出了一款java的加解密工具jasypt,其提供了单密钥对称加密和非对称加密方式。
这里以对称加密方式来举例:
1. 引入依赖
在pom.xml中映入jasypt依赖:
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.2</version>
</dependency>
2. 生成需要加密的密文
a. 通过单元测试生成
目前需要加密的均为密码数据,如mysql,redis等密码
@SpringBootTest
@RunWith(SpringRunner.class)
public class JasyptTest {
@Autowired
private StringEncryptor encryptor;
/**
* 手动生成密文,此处演示了url,user,password
*/
@Test
public void encrypt() {
String url = encryptor.encrypt("*.*.*.*:3306");
String name = encryptor.encrypt("****");
String password = encryptor.encrypt("********");
System.out.println("database url: " + url);
System.out.println("database name: " + name);
System.out.println("database password: " + password);
Assert.assertTrue(url.length() > 0);
Assert.assertTrue(name.length() > 0);
Assert.assertTrue(password.length() > 0);
}
}
运行输出如下:
database url: Gh0BFnnOhFYDb6s5YyTBIvT9uh112n8+85Ahtz8iRqueOGKZplb/lNTOciSfYA
database name: SuvOLXWc1O7csNumRv112o+HH1kkZPfz16zZZdwp+Idfedboj3jLqQSYeUcXAck
database password: JHEPlhm468m43txHZkm/5kmsZTBkcRCwOVio8CQXcs37JvnvgI/Q1TZP6GwCTc
3. 修改配置文件
在bootstrap.yaml中添加:
jasypt:
encryptor:
password: asdf@2022 #本地调试,此密钥后续需要删除
property:
prefix: en(
suffix: )
将需要加密的明文都替换为密文,格式为前缀(‘en(’)+密文+后缀(‘)’),具体如下所示:
data_url: en(Gh0BFnnOhFYDb6s5YyTBIvT9uhTn8+85Ahtz8iRqueOGKZplb/l+U4XNTOciSfYA)
data_username: en(SuvOLXWc1O7csNumRv1Wo+HH1kkZPfzp6zZZdwp+Idfedboj3jLqQSYe2bUcXAck)
data_password: en(JHEPlhm468mrytxHZkm/5kmsZTBycRCwOVio8CQXcs37JvnvgI/Q1TZP/H6GwCTc)
4. 转移密钥
步骤三完成后可在本地测试是否可以连接数据库成功,连接成功后需要将之前添加在配置文件bootstrap.yaml中的密钥(jasypt.encryptor.password)删除,并转移至其他地方,可选:
a.转移至程序启动时的命令行参数
修改运行脚本run.sh,加入参数:
java -jar /app.jar --jasypt.encryptor.password=asdf@2022
b.转移至程序启动时的环境变量
修改运行脚本run.sh,加入环境变量选项中:
java -Djasypt.encryptor.password=asdf@2022 -jar /app.jar
c. 在工作负载中加入环境变量
在对应服务的工作负载中加入环境变量配置:jasypt.encryptor.password=asdf@2022