当前位置: 首页 > 后端技术 > Java

如何保护SpringBoot配置中的敏感信息?

时间:2023-04-01 23:57:53 Java

在之前的系列教程中,我们已经介绍了很多SpringBoot配置文件中的详细用法,例如:参数之间的引用、随机数的应用、命令行参数的使用、多环境配置管理等等.这些配置相关的知识都是SpringBoot原生提供的,而我们今天要介绍的这个功能,SpringBoot本身是不支持的,但是非常有用:配置内容的加密。为什么要加密?可能很多初学者对配置信息的加密并不敏感,因为一开始接触的主要是本地开发,很多安全问题都没有想太多。在现实中,我们的配置文件中其实包含了很多与安全相关的敏感信息,比如:数据库账号密码、一些服务的密钥等,这些信息一旦泄露,对于企业的重要数据资产来说是相当危险的。因此,对这些配置文件中的敏感信息进行加密,是每个成熟的开发团队必须要做的事情。如果你是DD的老读者,你可能会立刻想到SpringCloudConfig提供了配置加密功能。在我的SpringCloud系列教程和《Spring Cloud微服务实战》这本书中都有详细介绍。有兴趣的可以点击《Spring Cloud构建微服务架构:分布式配置中心(加密解密)》一探究竟。既然之前写过类似的内容,何必再写一遍呢?因为并不是所有的开发场景都会搭建SpringCloud基础设施,也不一定会使用SpringCloudConfig作为配置中心。所以本文主要讲的是在我们只使用SpringBoot的情况下,如何对配置中的敏感信息进行加密。自己试试看接下来我们将使用开源项目https://github.com/ulisesbocchio/jasypt-spring-boot提供的实现和插件来帮助我们轻松完成配置信息的加密。按照我下面的步骤来试试吧!第一步:创建一个基础的SpringBoot项目(如果还不了解可以参考这篇文章:快速入门第二步:设计一个参数和单元测试来输出这个配置信息,为加密配置做准备:datasource。password=didispace.com输出配置信息的单元测试:@Slf4j@SpringBootTestpublicclassPropertiesTest{@Value("${datasource.password:}")privateStringpassword;@Testpublicvoidtest(){log.info("datasource.password:{}",password);}}执行此单元测试并输出:2021-08-1322:28:45.506INFO70405---[main]com.didispace.chapter15.PropertiesTest:datasource.password:didispace.com还没有开始加密,下面开始介绍加密操作吧!第三步:在pom.xml中引入jasypt提供的SpringBootStartercom.github.ulisesbocchiojasypt-spring-boot-starter3.0.3在插件配置中添加:com.github.ulisesbocchiojasypt-maven-plugin3.0.3第四步:在配置文件中加入加密需要的密码jasypt.encryptor.password=didispace同时修改需要加密的内容,将需要加密的内容用DEC()包裹起来,例如:datasource。password=DEC(didispace.com)第五步:使用jasypt-maven-plugin插件对DEC()包裹的内容进行批量加密在终端执行如下命令:mvnjasypt:encrypt-Djasypt.encryptor。password=didispace注意:这里-Djasypt.encryptor.password参数必须和配置文件中的一致,否则后面会解密失败。执行后重新查看配置文件,可以看到自动变成datasource.password=ENC(/AL9nJENCYCh9Pfzdf2xLPsqOZ6HwNgQ3AnMybFAMeOM5GphZlOK6PxzozwtCm+Q)jasypt.encryptor.password=didispace其中ENC()和DEC()的标识相同由jasypt提供,分别用于标识括号中的加密内容和待加密内容。如果当前配置文件已经包含ENC()内容,那么我们可以通过以下命令解密配置文件,查看原始信息:mvnjasypt:decrypt-Djasypt.encryptor.password=didispace这个操作不会修改配置文件,只有解密结果才会在控制台输出,例如:datasource.password=DEC(didispace.com)jasypt.encryptor.password=didispace第六步:至此,我们的配置文件中的敏感信息已经被ENC修改了(),再次执行单元测试。如果不出意外,还是可以得到和之前一样的结果:2021-08-1322:50:00.463INFO76150---[main]com.didispace.chapter15.PropertiesTest:datasource.password:didispace.comAt这一次,配置文件已经加密,敏感信息受到保护。本系列教程《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,分享别处看不到的知识和思考