Spring Boot配置文件数据也可以轻松加密?

简介: Spring Boot配置文件数据也可以轻松加密?

在实践中,项目的某些配置信息是需要进行加密处理的,以减少敏感信息泄露的风险。比如,在使用Druid时,就可以基于它提供的公私钥加密方式对数据库的密码进行加密。


但更多时候,比如Redis密码、MQ密码等敏感信息,也需要进行加密,此时就没那么方便了。本篇文章给大家介绍一款Java类库Jasypt,同时基于Spring Boot项目来演示一下如何对配置文件信息进行加密。


一个简单的SpringBoot项目

我们先来创建一个简单的Spring Boot项目,构建一个加密数据运用的场景。


无论通过Idea或官网等方式,先创建一个Spring Boot项目,核心依赖为:


<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--    为了方便,通常会引入Lombok依赖    -->
<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
</dependency>

创建一个配置文件类ConfigProperties:

@Data
@Component
public class ConfigProperties {
  @Value("${conf.url}")
  private String url;
  @Value("${conf.password}")
  private String password;
}

配置文件中的配置属性注入到该类,以供后续使用。

创建一个Controller类,用来测试验证,是否能够正常运行:

@RestController
@RequestMapping("/")
public class ConfigController {
  @Resource
  private ConfigProperties configProperties;
  @RequestMapping
  public void print(){
    System.out.println(configProperties.getUrl());
    System.out.println(configProperties.getPassword());
  }
}

对应ConfigProperties类,application.properties中配置如下:


conf.url=127.0.0.1

conf.password=admin123

1

2

此时,启动项目,访问Controller,能够正常打印出配置信息,说明程序可以正常运行。


但配置文件中直接明文展示了password项,如果别人看到该配置文件,就可能导致密码的泄露。


基于Jasypt的加密

针对上述情况,通常,我们会对敏感信息进行加密,避免明文密码信息暴露,提升安全等级。


加密的基本思路是:配置文件中存储加密内容,在解析配置文件注入时进行解密。


但如果拿到项目源码,知道加密算法和秘钥,肯定是可以解密的。这里的加密,只是多一层安全防护,但并不是万能的。


下面看看如何基于Jasypt来进行加密处理。


集成步骤

下面基于上述Spring Boot项目进行改造升级。


环境准备

不同版本的Jasypt使用方法有所不同,这里基于3.0.4版本、JDK8、Spring Boot 2.5.5来进行演示。


在使用之前,首先检查一下JDK8的JRE中是否安装了不限长度的JCE版本,否则在执行加密操作时会抛出解密失败的异常。


进入$JAVA_HOME/jre/lib/security目录,查看是否包含local_policy.jar和US_export_policy.jar两个jar包。如果不包含,则通过Oracle官网进行下载,下载地址:https://www.oracle.com/java/technologies/javase-jce8-downloads.html


下载文件为:jce_policy-8.zip


文件内包含三个文件:


README.txt

local_policy.jar

US_export_policy.jar

1

2

3

查看$JAVA_HOME/jre/lib/security目录下是否有这两个jar包文件,如果没有则复制进去,如果有可考虑覆盖。


引入依赖

在Spring Boot中集成Jasypt比较简单,直接引入如下依赖即可:


<dependency>

   <groupId>com.github.ulisesbocchio</groupId>

   <artifactId>jasypt-spring-boot-starter</artifactId>

   <version>3.0.4</version>

</dependency>

1

2

3

4

5

此时,Jasypt组件自动配置便已经生效,只需要对需要加密的数据进行处理了。


为了方便对密码进行加密,还可以在pom.xml中的build元素中引入对应的plugin,这个后面会用到:


<plugin>

<groupId>com.github.ulisesbocchio</groupId>

<artifactId>jasypt-maven-plugin</artifactId>

<version>3.0.4</version>

</plugin>

1

2

3

4

5

至此,所有的准备工作已经完成。


内容加密

内容加密有多种方式,这里挑选两种方式进行介绍。


方式一:单元测试类生成密文;


构建如下单元测试类,使用默认实例化的StringEncryptor对密码进行加密:


@SpringBootTest
class SpringBootJasyptApplicationTests {
  @Autowired
  private StringEncryptor stringEncryptor;
  @Test
  void contextLoads() {
    String qwerty1234 = stringEncryptor.encrypt("admin123");
    System.out.println(qwerty1234);
  }
}

其中,”admin123“便是要加密的内容。执行上述程序,便可打印加密后的内容。这种形式加密的内容,全部采用默认值。


方式二:通过Maven插件生成密文


在上面已经引入了Jasypt的Maven插件,可通过对应的命令进行生成密码。


第一步:在配置文件中添加加密的密码:


jasypt.encryptor.password=afx11

1

然后对配置文件中需要加密的数据进行改造,在数据前添加”DEC(“,在数据尾部加上")",修改完如下:


conf.password=DEC(admin123)

1

这里添加的DEC()是告诉插件,此部分内容需要进行加密处理。注意这里关键字是DEC。


第二步:执行Maven命令,对上述数据进行加密处理


在命令执行以下命令:


mvn jasypt:encrypt -Djasypt.encryptor.password=afx11

1

此时再看配置文件中的conf.password数据已经变为:


jasypt.encryptor.password=afx11

conf.url=127.0.0.1

conf.password=ENC(209eBdF3+jsV2f8kDjs4NOCzgBxnVgETlR5q2KfhYo5DW2jqvLknv0TndEkXOXm0)

1

2

3

注意原来的DEC变成了ENC,原来的明文密码变成了加密的密文。


此时,如果想查看明文,执行以下命令即可:


mvn jasypt:decrypt -Djasypt.encryptor.password=afx11

1

该命令不会修改配置文件中的密文为明文,只会在控制台进行明文结果的输出。


jasypt.encryptor.password=afx11

conf.url=127.0.0.1

conf.password=DEC(admin123)

1

2

3

经过上述操作,所有改造步骤已经完成,只需启动系统进行验证即可。


密码的传递方式

完成上述步骤,直接启动系统,访问对应的请求,会发现已经能够成功打印出密码原文了。


上述实例中我们将加密的密码放在了application.properties文件中,这样并不安全,如果查看代码就知道如何解密了。通常,还可以采用另外一种形式来传递参数:在启动命令中传输密码。


比如:


java -jar jasypt-spring-boot-demo-0.0.1-SNAPSHOT.jar --jasypt.encryptor.password=password

1

这样,密码便不用存储在代码当中了,一定程度上增加了安全性。当然,也可以通过环境变量来进行传递,这样即便开发人员也无法获得生产的密码。


小结

关于Jasypt的使用及与Spring Boot的集成就讲这么多,更多内容也可参考官方文档说明。如果你的项目中还存在很多明文存储的密码,真的有必要考虑使用类似的框架进行加密处理了。


示例源码地址:https://github.com/secbr/springboot-all/tree/master/springboot-jasypt


官方源码地址:https://github.com/ulisesbocchio/jasypt-spring-boot


目录
相关文章
|
11月前
|
JSON Java 数据格式
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——封装统一返回的数据结构
本文介绍了在Spring Boot中封装统一返回的数据结构的方法。通过定义一个泛型类`JsonResult&lt;T&gt;`,包含数据、状态码和提示信息三个属性,满足不同场景下的JSON返回需求。例如,无数据返回时可设置默认状态码&quot;0&quot;和消息&quot;操作成功!&quot;,有数据返回时也可自定义状态码和消息。同时,文章展示了如何在Controller中使用该结构,通过具体示例(如用户信息、列表和Map)说明其灵活性与便捷性。最后总结了Spring Boot中JSON数据返回的配置与实际项目中的应用技巧。
882 0
|
11月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——使用 fastJson 处理 null
本文介绍如何使用 fastJson 处理 null 值。与 Jackson 不同,fastJson 需要通过继承 `WebMvcConfigurationSupport` 类并覆盖 `configureMessageConverters` 方法来配置 null 值的处理方式。例如,可将 String 类型的 null 转为 &quot;&quot;,Number 类型的 null 转为 0,避免循环引用等。代码示例展示了具体实现步骤,包括引入相关依赖、设置序列化特性及解决中文乱码问题。
601 0
|
11月前
|
JSON Java fastjson
微服务——SpringBoot使用归纳——Spring Boot返回Json数据及数据封装——Spring Boot 默认对Json的处理
本文介绍了在Spring Boot中返回Json数据的方法及数据封装技巧。通过使用`@RestController`注解,可以轻松实现接口返回Json格式的数据,默认使用的Json解析框架是Jackson。文章详细讲解了如何处理不同数据类型(如类对象、List、Map)的Json转换,并提供了自定义配置以应对null值问题。此外,还对比了Jackson与阿里巴巴FastJson的特点,以及如何在项目中引入和配置FastJson,解决null值转换和中文乱码等问题。
1597 0
|
6月前
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
1257 10
|
前端开发 Java API
SpringBoot整合Flowable【06】- 查询历史数据
本文介绍了Flowable工作流引擎中历史数据的查询与管理。首先回顾了流程变量的应用场景及其局限性,引出表单在灵活定制流程中的重要性。接着详细讲解了如何通过Flowable的历史服务API查询用户的历史绩效数据,包括启动流程、执行任务和查询历史记录的具体步骤,并展示了如何将查询结果封装为更易理解的对象返回。最后总结了Flowable提供的丰富API及其灵活性,为后续学习驳回功能做了铺垫。
1151 0
SpringBoot整合Flowable【06】- 查询历史数据
|
7月前
|
JSON Java 数据格式
Spring Boot返回Json数据及数据封装
在Spring Boot中,接口间及前后端的数据传输通常使用JSON格式。通过@RestController注解,可轻松实现Controller返回JSON数据。该注解是Spring Boot新增的组合注解,结合了@Controller和@ResponseBody的功能,默认将返回值转换为JSON格式。Spring Boot底层默认采用Jackson作为JSON解析框架,并通过spring-boot-starter-json依赖集成了相关库,包括jackson-databind、jackson-datatype-jdk8等常用模块,简化了开发者对依赖的手动管理。
729 3
|
7月前
|
人工智能 安全 Java
Spring Boot yml 配置敏感信息加密
本文介绍了如何在 Spring Boot 项目中使用 Jasypt 实现配置文件加密,包含添加依赖、配置密钥、生成加密值、在配置中使用加密值及验证步骤,并提供了注意事项,确保敏感信息的安全管理。
1415 1
|
11月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
Java 关系型数据库 MySQL
SpringBoot 通过集成 Flink CDC 来实时追踪 MySql 数据变动
通过详细的步骤和示例代码,您可以在 SpringBoot 项目中成功集成 Flink CDC,并实时追踪 MySQL 数据库的变动。
2993 45
|
11月前
|
编解码 安全 Java
如何在Spring Boot中实现数据加密
本文介绍了如何在Spring Boot中实现数据加密。首先阐述了数据加密的重要性与应用场景,接着讲解了对称加密和非对称加密的原理及区别。通过添加依赖、配置加密算法、编写加密工具类等步骤,展示了具体实现方法,并在业务代码中应用加密技术保护敏感数据。希望对开发者有所帮助。
846 7