我们将使用
https://github.com/ulisesbocchio/jasypt-spring-boot
这个开源项目提供的实现和插件,来帮助我们轻松的完成配置信息的加密。
1、引入包
在pom.xml
中引入jasypt提供的Spring Boot Starter
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency>
2、配置加/解的密码
在配置文件 application.yml 中加入加密需要使用的密码,如:
# jasypt加密的密匙
jasypt:
encryptor:
password: ABCDEFGHIJK
3、测试用例中生成加密后的秘钥
@Test void getEncrypt() { //对敏感信息进行加密 String url = encrypt.encrypt("jdbc:mysql://localhost:3306/demo"); String name = encrypt.encrypt("root"); String password = encrypt.encrypt("123456"); System.out.println(url+"----------------"); System.out.println(name+"----------------"); System.out.println(password+"----------------"); }
结果:
jJW8vLCvy1NJc7Z37+MHY++2IxbAIU3F2PKywvVPgleSb+Y6VtLgQwrsI4YnOPkGg2+EPRWuhTftpv2iY4ck7mxTnXodNmMHarAS2Dvyp3c=---------------- rYXxJV6dq1R5Nlbgf+oKnVHORjarrzc3YkANKwJvUhbDz+MLs1TZwTZm/yr9aQdM---------------- w0/NoJF2XzxkDqRlGWgmslXcpTlVNQfqv+ylCFAae5SthDbpSsaMqickUsib0h0m----------------
4、将加密后的字符串替换原明文
# jasypt加密的密匙
jasypt:
encryptor:
password: ABCDEFGHIJK
mysql:
url: ENC(FJqflLlLzTa2t8MvOUh5R6wGp8xgt1c7jbqm/AawsRSJvwySrN03P0CiVYT3a9kUEQqeQ7ly4ZDEGssAISUM9bZ/8KQZgo2SOEj/S05aBaI=)
username: ENC(/v+5Q5u4oOCSyps9RdPhL/xlghEoXSL0uptr1npRoC9I3egOuWjYTJexkGGGgwp+)
password: ENC(Hsqq32hosJvUKjA25e1hNq7TfkU+YiLNOYXzn6XWK51oE4LUWAeGcfSCh2Z/poz2)
注意:
ENC()
跟DEC()
一样都是 jasypt 提供的标识,分别用来标识括号内的是加密后的内容和待加密的内容。
5、测试
javaBean:
@Data @Component @ConfigurationProperties(prefix = "mysql") public class Mysql { private String url; private String username; private String password; }
测试:
@Autowired private Mysql mysql; @Test void test() { System.out.println("mysql = " + mysql); }
结果:
mysql = Mysql(url=jdbc:mysql://localhost:3306/demo, username=root, password=123456)
在springboot项目加载的时候就会将加密信息进行解密,就获得了我们之前的username和password了。
6、思考
根据上面的步骤,爱思考的你,也许会发现这样的问题:虽然敏感信息是加密了,但是我们通过配置文件也能看到
jasypt.encryptor.password
信息,我们是不是通过利用这个再把原始信息解密出来,这样的话岂不是还是不安全?
上面的实现方式的确是会有这样的问题!所以,在实际应用的过程中,
jasypt.encryptor.password
的配置,可以通过运维小伙伴在环境变量或启动参数中注入,而不是由开发人员在配置文件中指定。
部署时配置salt(盐)值
为了防止salt(盐)泄露,反解出密码.可以在
项目部署的时候
使用命令传入salt(盐)值:java -jar xxx.jar -Djasypt.encryptor.password=Y6M9fAJQdU7jNp5MW或者在
服务器的环境变量
里配置,进一步提高安全性,打开/etc/profile
文件vim /etc/profile在
profile
文件末尾插入salt(盐)变量export JASYPT_PASSWORD = Y6M9fAJQdU7jNp5MW编译,使配置文件生效
source /etc/profile运行
java -jar -Djasypt.encryptor.password=${JASYPT_PASSWORD} xxx.jar