在之前的系列教程中,咱们曾经介绍了十分多对于 Spring Boot 配置文件中的各种细节用法,比方:参数间的援用、随机数的利用、命令行参数的应用、多环境的配置管理等等。
这些配置相干的常识都是 Spring Boot 原生就提供的,而明天咱们将介绍的性能并非 Spring Boot 原生就反对,但却十分有用:配置内容的加密。
为什么要加密?
可能很多初学者,对于配置信息的加密并不敏感,因为开始次要接触本地的开发,对于很多平安问题并没有太多的思考。而事实中,咱们的配置文件中,其实蕴含着大量与平安相干的敏感信息,比方:数据库的账号密码、一些服务的密钥等。这些信息一旦泄露,对于企业的重要数据资产,那是相当危险的。所以,对于这些配置文件中存在的敏感信息进行加密,是每个成熟开发团队都肯定会去的事。
如果您是 DD 的老读者,兴许马上会想到 Spring Cloud Config 就提供配置的加密性能,之前在我的 Spring Cloud 系列教程和《Spring Cloud 微服务实战》一书中都有具体的介绍,感兴趣的话能够点击《Spring Cloud 构建微服务架构:分布式配置核心(加密解密)》一探到底。
既然以前写过相似内容,那为什么还要写呢?因为并不是所有的开发场景都会搭建 Spring Cloud 的那套基础设施,同时也不肯定会应用 Spring Cloud Config 作为配置核心。所以,本文次要说说,当咱们只应用 Spring Boot 的时候,如何实现对配置中敏感信息的加密。
入手试试
上面咱们将应用 https://github.com/ulisesbocchio/jasypt-spring-boot
这个开源我的项目提供的实现和插件,来帮忙咱们轻松的实现配置信息的加密。
连忙跟着我上面的步骤入手试试吧!
第一步:创立一个根底的 Spring Boot 我的项目(如果您还不会,能够参考这篇文章:疾速入门
第二步:设计一个参数和单元测试,用来输入这个配置信息
筹备加密的配置:
datasource.password=didispace.com
用来输入配置信息的单元测试:
@Slf4j
@SpringBootTest
public class PropertiesTest {@Value("${datasource.password:}")
private String password;
@Test
public void test() {log.info("datasource.password : {}", password);
}
}
执行这个单元测试,会输入:
2021-08-13 22:28:45.506 INFO 70405 --- [main] com.didispace.chapter15.PropertiesTest : datasource.password : didispace.com
这里还没开始加密,上面咱们开始引入加密的操作!
第三步 :在pom.xml
中引入 jasypt 提供的 Spring Boot Starter
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
在插件配置中退出:
<plugin>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-maven-plugin</artifactId>
<version>3.0.3</version>
</plugin>
第四步:在配置文件中退出加密须要应用的明码
jasypt.encryptor.password=didispace
同时,批改要加密的内容,用 DEC()
将待加密内容包裹起来,比方:
datasource.password=DEC(didispace.com)
第五步 :应用jasypt-maven-plugin
插件来给 DEC()
包裹的内容实现批量加密。
在终端中执行上面的命令:
mvn jasypt:encrypt -Djasypt.encryptor.password=didispace
留神 :这里
-Djasypt.encryptor.password
参数必须与配置文件中的统一,不然前面会解密失败。
执行之后,从新查看配置文件,能够看到,主动变成了
datasource.password=ENC(/AL9nJENCYCh9Pfzdf2xLPsqOZ6HwNgQ3AnMybFAMeOM5GphZlOK6PxzozwtCm+Q)
jasypt.encryptor.password=didispace
其中,ENC()
跟 DEC()
一样都是 jasypt 提供的标识,别离用来标识括号内的是加密后的内容和待加密的内容。
如果以后配置文件曾经都是 ENC()
内容了,那么咱们能够通过上面的命令来解密配置文件,查看原始信息:
mvn jasypt:decrypt -Djasypt.encryptor.password=didispace
该操作不会批改配置文件,只会在控制台输入解密后果,比方:
datasource.password=DEC(didispace.com)
jasypt.encryptor.password=didispace
第六步 :此时,咱们的配置文件中的敏感信息曾经被ENC()
润饰了,再执行一下单元测试,不出意外的话,仍然能够失去之前一样的后果:
2021-08-13 22:50:00.463 INFO 76150 --- [main] com.didispace.chapter15.PropertiesTest : datasource.password : didispace.com
而此时,配置文件中曾经是加密内容了,敏感信息失去了爱护。
本系列教程《Spring Boot 2.x 基础教程》点击中转!,欢送珍藏与转发!如果学习过程中如遇艰难?能够退出咱们 Spring 技术交换群,参加交换与探讨,更好的学习与提高!
进一步思考
依据下面的步骤,爱思考的你,兴许会发现这样的问题:尽管敏感信息是加密了,然而咱们通过配置文件也能看到 jasypt.encryptor.password
信息,咱们是不是通过利用这个再把原始信息解密进去,这样的话岂不是还是不平安?
下面的实现形式确实是会有这样的问题!所以,在理论利用的过程中,jasypt.encryptor.password
的配置,能够通过运维小伙伴在环境变量或启动参数中注入,而不是由开发人员在配置文件中指定。
同时,为了应答更高的平安要求,jasypt 也提供自定义的加密解密形式,这里就不做具体开展了,有趣味的小伙伴能够返回 jasypt 的仓库查看应用细节。
代码示例
本文的残缺工程能够查看上面仓库中 2.x
目录下的 chapter1-5
工程:
- Github:https://github.com/dyc87112/SpringBoot-Learning/
- Gitee:https://gitee.com/didispace/SpringBoot-Learning/
如果您感觉本文不错,欢送 Star
反对,您的关注是我保持的能源!
欢送关注我的公众号:程序猿 DD,分享其余中央看不到的常识与思考