个人博客
之前看过一个例子,一个酒店管理公司的后台程序员把自家项目上传到了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")); } }
|
这里写个临时的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
|
甚至还可以作为系统环境变量来带入。
参考链接
代码地址