关于java:Spring-Boot-配置中的敏感信息如何保护

42次阅读

共计 2985 个字符,预计需要花费 8 分钟才能阅读完成。

在之前的系列教程中,咱们曾经介绍了十分多对于 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,分享其余中央看不到的常识与思考

正文完
 0