之前看过一个例子,一个酒店管理公司的后台程序员把自家项目上传到了github
,导致在配置文件中的数据库密码外泄。因此后果可想而知了...
我们在平时开发中,习惯把一些敏感的配置项以明文方式直接写在配置文件中。这样很容易导致密码泄露。
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依赖
<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、配置加密密钥
jasypt:
encryptor:
password: chili
可以理解为jasypt会使用这个自定义加密密钥,对配置文件里的重要项进行加密。
2.2、加密敏感数据获取密文
@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、配置密文数据
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()
包装。如果想指定别的自定义标记,可以如下配置:
jasypt:
encryptor:
password: chili
property:
prefix: PASSWORD(
suffix: )
这样就可以用PASSWORD()
来包装密文了,默认使用ENC()
包装。
在项目启动时,就会先把密文解密,最后再以明文方式注入配置属性中。
2.4、问题改进
上面的方式有一个很大的问题就是jasypt.encryptor.password
密钥直接写在了配置文件中,知道密钥只需要将密文还原就可以得到明文,依旧会有密码泄露的风险。
解决:
我们可以把jasypt.encryptor.password
这项配置写在启动脚本中,配置成启动参数的方式,而不是写在工程的配置文件中。
java -jar yourproject.jar --jasypt.encryptor.password=privateKey
# 或者
java -Djasypt.encryptor.password=privateKey -jar yourproject.jar
甚至还可以作为系统环境变量来带入。
网友评论