场景
经常会遇到这样一种情况:项目的配置文件中总有一些敏感信息,比如数据源的url、用户名、
密码....这些信息一旦被暴露那么整个数据库都将会被泄漏,那么如何将这些配置隐藏呢。
除了使用手动将加密之后的配置写入到配置文件中,提取的时候再手动解密的方式,还可以使用如下
方式。
jasypt-spring-boot
https://github.com/ulisesbocchio/jasypt-spring-boot
https://gitee.com/mirrors/Jasypt-Spring-Boot_old1?_from=gitee_search
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
实现
1、SpringBoot中添加项目依赖
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency>
2、在配置文件yml中添加一个加密时的秘钥,可任意指定
jasypt:
encryptor:
password: badaodechengxvyuan
直接将秘钥放在配置文件中也是不安全,可以在项目启动的时候配置秘钥
java -jar xxx.jar -Djasypt.encryptor.password=badaodechengxvyuan
3、编写单元测试生成加密后的数据
为了将配置的明文数据进行加密,需要将数据进行加密
import org.jasypt.encryption.StringEncryptor; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.util.Assert; @SpringBootTest class JasyptTest { /** * inject encryption method */ @Autowired private StringEncryptor encryptor; /** * encrypt data */ @Test void encrypt() { String name = encryptor.encrypt("root"); String password = encryptor.encrypt("123456"); System.out.println("name:"+name); System.out.println("password:"+password); Assert.isTrue(name.length()>0,"name encrypt success"); Assert.isTrue(password.length()>0,"password encrypt success"); } }
这里为了演示只加密了用户名和密码,当然url或者其他需要加密的明文数据都可以。
运行单元测试会输出加密后的字符串数据
4、将加密后的数据复制到配置文件yml中对应的位置,并使用ENC()包裹。
# 数据源 spring: application: name: badao-tcp-demo datasource: url:jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: ENC(Ls/gHnNIUDGsGIRbk+KuKaa2E...) password: ENC(rCRmLz/Iiu4INB/3+YKVGxC...)
上面包裹的前缀和后缀也可通过配置进行更改,以及更多用法比如自己配置加密算法,
可参考官方文档。