个人博客


之前看过一个例子,一个酒店管理公司的后台程序员把自家项目上传到了github,导致在配置文件中的数据库密码外泄。因此后果可想而知了…

我们在平时开发中,习惯把一些敏感的配置项以明文方式直接写在配置文件中。这样很容易导致密码泄露。

1
2
3
4
5
6
7
8
9
10
11
spring:
redis:
cluster:
nodes:
- 148.70.153.63:9426
- 148.70.153.63:9427
- 148.70.153.63:9428
- 148.70.153.63:9429
- 148.70.153.63:9430
- 148.70.153.63:9431
password: 123456

我之前的一些博客分享的源码中,配置文件中的敏感数据我都是在yml中随便写一个,然后把正确的参数填到启动参数中去覆盖jar包内的配置。如果配置项较多,也是比较麻烦的。

我们可以使用一个叫做jasypt的加密组件来解决上述的问题。

1、Maven依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>

2、应用示例

2.1、配置加密密钥

1
2
3
jasypt:
encryptor:
password: chili

可以理解为jasypt会使用这个自定义加密密钥,对配置文件里的重要项进行加密。

2.2、加密敏感数据获取密文

1
2
3
4
5
6
7
8
9
10
11
@RunWith(SpringRunner.class)
@SpringBootTest
public class JasyptApplicationTests {
@Autowired
private StringEncryptor encryptor;

@Test
public void testEncrypt() {
System.out.println(encryptor.encrypt("123456")); // LEvdXWT9sxdAQS3bcoJ4fIzaAbF+/43Oo/sm8ohv5CIg5NhW0C1gyEl/yYCAfCXA
}
}

这里写个临时的Test方法把加密后的密文输出来就行。每次测试密文都会不一样但解密后的明文都是一样的。

2.3、配置密文数据

1
2
3
4
5
6
7
8
9
10
11
spring:
redis:
cluster:
nodes:
- 148.70.153.63:9426
- 148.70.153.63:9427
- 148.70.153.63:9428
- 148.70.153.63:9429
- 148.70.153.63:9430
- 148.70.153.63:9431
password: ENC(LEvdXWT9sxdAQS3bcoJ4fIzaAbF+/43Oo/sm8ohv5CIg5NhW0C1gyEl/yYCAfCXA)

密文需要用ENC()包装。如果想指定别的自定义标记,可以如下配置:

1
2
3
4
5
6
jasypt:
encryptor:
password: chili
property:
prefix: PASSWORD(
suffix: )

这样就可以用PASSWORD()来包装密文了,默认使用ENC()包装。

在项目启动时,就会先把密文解密,最后再以明文方式注入配置属性中

2.4、问题改进

上面的方式有一个很大的问题就是jasypt.encryptor.password密钥直接写在了配置文件中,知道密钥只需要将密文还原就可以得到明文,依旧会有密码泄露的风险。

解决
我们可以把jasypt.encryptor.password这项配置写在启动脚本中,配置成启动参数的方式,而不是写在工程的配置文件中。

1
2
3
java -jar yourproject.jar --jasypt.encryptor.password=privateKey
# 或者
java -Djasypt.encryptor.password=privateKey -jar yourproject.jar

甚至还可以作为系统环境变量来带入。

参考链接

代码地址