Spring Boot 2.x基础教程:加密配置中的敏感信息

简介: Spring Boot 2.x基础教程:加密配置中的敏感信息

在之前的系列教程中,我们已经介绍了非常多关于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

而此时,配置文件中已经是加密内容了,敏感信息得到了保护。

注意:如果在尝试的时候,出现报错:DecryptionException: Unable to decrypt,点击本文查看可能的原因

本系列教程《Spring Boot 2.x基础教程》点击直达! ,欢迎收藏与转发!如果学习过程中如遇困难?可以加入我们Spring技术交流群 ,参与交流与讨论,更好的学习与进步!

进一步思考

根据上面的步骤,爱思考的你,也许会发现这样的问题:虽然敏感信息是加密了,但是我们通过配置文件也能看到jasypt.encryptor.password信息,我们是不是通过利用这个再把原始信息解密出来,这样的话岂不是还是不安全?

上面的实现方式的确是会有这样的问题!所以,在实际应用的过程中,jasypt.encryptor.password的配置,可以通过运维小伙伴在环境变量或启动参数中注入,而不是由开发人员在配置文件中指定。

同时,为了应对更高的安全要求,jasypt也提供自定义的加密解密方式,这里就不做具体展开了,有兴趣的小伙伴可以前往jasypt的仓库查看使用细节。

代码示例

本文的完整工程可以查看下面仓库中2.x目录下的chapter1-5工程:

如果您觉得本文不错,欢迎Star支持,您的关注是我坚持的动力!

目录
相关文章
|
1月前
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
454 10
|
2月前
|
人工智能 安全 Java
Spring Boot yml 配置敏感信息加密
本文介绍了如何在 Spring Boot 项目中使用 Jasypt 实现配置文件加密,包含添加依赖、配置密钥、生成加密值、在配置中使用加密值及验证步骤,并提供了注意事项,确保敏感信息的安全管理。
638 1
|
3月前
|
安全 Java 数据库
Jasypt加密数据库配置信息
本文介绍了使用 Jasypt 对配置文件中的公网数据库认证信息进行加密的方法,以提升系统安全性。主要内容包括:1. 背景介绍;2. 前期准备,如依赖导入及版本选择;3. 生成密钥并实现加解密测试;4. 在配置文件中应用加密后的密码,并通过测试接口验证解密结果。确保密码安全的同时,保障系统的正常运行。
265 3
Jasypt加密数据库配置信息
|
6月前
|
编解码 安全 Java
如何在Spring Boot中实现数据加密
本文介绍了如何在Spring Boot中实现数据加密。首先阐述了数据加密的重要性与应用场景,接着讲解了对称加密和非对称加密的原理及区别。通过添加依赖、配置加密算法、编写加密工具类等步骤,展示了具体实现方法,并在业务代码中应用加密技术保护敏感数据。希望对开发者有所帮助。
462 7
|
5月前
|
人工智能 缓存 自然语言处理
保姆级Spring AI 注解式开发教程,你肯定想不到还能这么玩!
这是一份详尽的 Spring AI 注解式开发教程,涵盖从环境配置到高级功能的全流程。Spring AI 是 Spring 框架中的一个模块,支持 NLP、CV 等 AI 任务。通过注解(如自定义 `@AiPrompt`)与 AOP 切面技术,简化了 AI 服务集成,实现业务逻辑与 AI 基础设施解耦。教程包含创建项目、配置文件、流式响应处理、缓存优化及多任务并行执行等内容,助你快速构建高效、可维护的 AI 应用。
|
消息中间件 SpringCloudAlibaba Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
1457 0
|
XML Java 数据库连接
【Spring学习笔记 五】Spring注解及Java类配置开发
【Spring学习笔记 五】Spring注解及Java类配置开发
145 0
|
XML Java 数据格式
Spring学习笔记:02 spring配置
Spring学习笔记:02 spring配置
|
Java 数据库连接 Spring
spring学习笔记(22)声明式事务配置,readOnly无效写无异常
<div class="markdown_views"> <p>在上一节内容中,我们使用了编程式方法来配置事务,这样的优点是我们对每个方法的控制性很强,比如我需要用到什么事务,在什么位置如果出现异常需要回滚等,可以进行非常细粒度的配置。但在实际开发中,我们可能并不需要这样细粒度的配置。另一方面,如果我们的项目很大,service层方法很多,单独为每个方法配置事务也是一件很繁琐的
1733 0
|
Java Spring 前端开发
spring学习笔记(23)基于tx/aop配置切面增强事务
<div class="markdown_views"> <p>在上一篇文章中,我们使用了声明式事务来配置事务,使事务配置从service逻辑处理中解耦出来。但它还存在一些缺点: <br> 1. 我们只针对方法名的特定进行拦截,但无法利用方法签名的其它信息定位,如修饰符、返回值、方法入参、异常类型等。如果我们需要为同名不同参的同载方法配置不同事务就会出问题了。 <br> 2.
2346 0