SpringBoot3使用Jasypt实现配置文件信息加密的方法

 更新时间:2024年07月29日 09:16:31   作者:詩筠  
对于一些单体项目而言,在没有使用SpringCloud的情况下,配置文件中包含着大量的敏感信息,如果这些信息泄露出去将会对企业的资产产生重大威胁,因此,对配置文件中的敏感信息加密是一件极其必要的事,所以本文介绍了SpringBoot3使用Jasypt实现配置文件信息加密的方法

前言

对于一些单体项目而言,在没有使用SpringCloud的情况下,配置文件中包含着大量的敏感信息,比如数据库的账号密码、API服务的秘钥等等,如果这些信息泄露出去将会对企业的资产产生重大威胁。因此,对配置文件中的敏感信息加密是一件极其必要的事。

一、概述

1.1 Jasypt库简介

下载 (12)

Jasypt是一个易于使用的Java库,专门用于加密和解密配置文件中的敏感信息,如数据库凭据、API密钥等。它提供了一种安全的方式来存储和管理配置文件中的敏感数据,而不是以明文形式暴露。

Jasypt支持多种加密算法,如DES、AES、Blowfish等,以及基于口令的加密算法(PBE)。它还提供了灵活的配置选项,允许开发人员自定义加密算法、密码、初始化向量等。

官网:jasypt-spring-boot

1.2 Jasypt库的主要特点

Jasypt的主要特点包括:

  • 简单易用:Jasypt提供了简单的API和注解,使得在应用程序中集成和使用Jasypt变得非常容易。
  • 安全性高:Jasypt使用强加密算法来保护配置文件中的敏感信息,防止数据泄露和未授权访问。
  • 兼容性好:Jasypt可以与各种Java应用程序和框架集成,包括Spring、Spring Boot、Hibernate等。

二、开发环境

  • JDK版本:JDK 17
  • Spring Boot版本:Spring Boot 3.2.2
  • MySQL版本:8.0.37
  • 构建工具:Maven

三、Jasypt集成到SpringBoot3

3.1 引入依赖

<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>3.0.5</version>
</dependency>

3.2 配置Jasypt

jasypt:
  encryptor:
    algorithm: PBEWITHHMACSHA512ANDAES_256
    iv-generator-classname: org.jasypt.iv.RandomIvGenerator
    password: secret_key # 这里的秘钥一般不会写在配置文件中,为了方便理解暂时放在这里
    property:
      prefix: ENC(
      suffix: )
  • algorithm: jasypt的加密算法,这里指定加密算法为一种结合了SHA-512 HMAC和AES-256加密算法的强加密算法。
  • iv-generator-classname: 指定用于生成初始化向量的类。RandomIvGenerator是一个随机生成初始化向量的生成器,它适用于需要初始化向量的加密算法,如AES。每次加密时,它都会生成一个新的随机初始化向量,增加了解密的难度。
  • password: 指定用于加密和解密的密码。
  • property.prefix: 指定加密值的前缀。当Jasypt处理配置文件时,它会查找以这个前缀开始的属性值,并尝试使用配置的加密算法进行解密。默认值是ENC(,也可以进行修改。
  • property.suffix: 指定加密值的后缀。与prefix类似,Jasypt会查找以这个后缀结束的属性值进行解密。默认值是)

更多配置属性:

Key描述RequiredDefault Value
jasypt.encryptor.password用于加密和解密的密码。这个密码非常重要,因为它用于生成加密密钥和解密密文。True-
jasypt.encryptor.algorithm指定加密算法。默认值是PBEWITHHMACSHA512ANDAES_256,这是一种结合了SHA-512 HMAC和AES-256加密算法的强加密算法。FalsePBEWITHHMACSHA512ANDAES_256
jasypt.encryptor.key-obtention-iterations指定获取加密密钥的迭代次数。这个值越大,获取密钥的过程越慢,但越安全。False1000
jasypt.encryptor.pool-size指定加密器池的大小。如果设置为大于1的值,Jasypt将使用一个线程池来并行处理加密和解密请求。False1
jasypt.encryptor.provider-name指定加密提供者的名称。默认值是SunJCE,这是Java加密扩展(JCE)的Sun Microsystems实现。FalseSunJCE
jasypt.encryptor.provider-class-name指定加密提供者的类名。如果指定了这个属性,Jasypt将使用这个类作为加密提供者,而不是默认的SunJCEFalsenull
jasypt.encryptor.salt-generator-classname指定用于生成盐值的类。默认值是org.jasypt.salt.RandomSaltGenerator,它生成一个随机的盐值。Falseorg.jasypt.salt.RandomSaltGenerator
jasypt.encryptor.iv-generator-classname指定用于生成初始化向量的类。默认值是org.jasypt.iv.RandomIvGenerator,它生成一个随机的初始化向量。Falseorg.jasypt.iv.RandomIvGenerator
jasypt.encryptor.string-output-type指定加密后的字符串输出类型。默认值是base64,这意味着加密后的值将转换为Base64编码的字符串。Falsebase64
jasypt.encryptor.proxy-property-sources指定是否代理属性源。如果设置为true,Jasypt将代理所有的属性源,以便在获取属性值时进行解密。Falsefalse
jasypt.encryptor.skip-property-sources指定要跳过的属性源列表。如果某些属性源不包含敏感信息,或者您不想对它们进行加密,可以将它们添加到这个列表中。Falseempty list

3.3 加密配置文件信息

先看一下我们现有的配置文件信息,我们要加密的信息是数据库urlusernamepassword这三个属性:

spring:
  application:
    name: server
  datasource: 
    url: jdbc:mysql://localhost:3306/study_db?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456

3.3.1 方案一(不推荐)

a.编写测试类生成加密后的配置文件信息

    @Autowired
    private StringEncryptor encryptor;

    @Test
    public void encrypt() {
        String url = encryptor.encrypt("jdbc:mysql://localhost:3306/study_db?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai");
        String name = encryptor.encrypt("root");
        String password = encryptor.encrypt("123456");
        System.out.println("database url: " + url);
        System.out.println("database username: " + name);
        System.out.println("database password: " + password);
    }

b.运行

image-20240726193839480

c.修改原本的配置文件信息

spring:
  application:
    name: server
  datasource: 
    url: ENC(z3xy2E55GmC126NvY1Mb3uprgXGjyaOWS4J3y72r1FFeTSno3m5ljGV22TqyYr85bptOY7drFHzrxaUfqbmetNWCsFY7i4vu5ig7ow0gk6ObLK/dVI4MRePxM5CGVzQ3XUWSJrUbLU1o+13g2erP2yV4uqeH6oVZH/FrBDQ6YfeeHmpl73emqMoGFFBnWdMvF1tzJxYMLcwthGBoaRopyA==)
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: ENC(9oaZel6CzsIM/ws23QcX2ijvZvn8A5HBYJM4PDUvwFSqmCO26MJKKshhPE5Hi+BU)
    password: ENC(b5FqkU7mOSb0esB1qLXveDBalnUz7OtBxp0By/Q1sd5yk0cgOuJqIV2zSmqHA5mz)

再次运行和测试:

image-20240726194120745

测试的接口是我随便写的一个接口,实现的功能就是根据用户名查询数据库中的一个用户:

    @Operation(summary = "你好")
    @GetMapping("/hello")
    public Result<UserInfo> test2(String username) {
        List<UserInfo> userList = userInfoService.lambdaQuery().like(UserInfo::getUserName, username).list();
        return Result.success(userList.get(0));
    }

可以看到成功查询到了用户信息,说明数据库连接成功。

但这种方案有个问题,秘钥写在配置文件当中,一旦代码泄露,那别人就可以使用秘钥解密我们的密文,因此可以采取方案二。

3.3.2 方案二(推荐)

官方文档:https://github.com/ulisesbocchio/jasypt-spring-boot#maven-plugin

a.添加Maven 插件

    <build>
        <plugins>
            <plugin>
                <groupId>com.github.ulisesbocchio</groupId>
                <artifactId>jasypt-maven-plugin</artifactId>
                <version>3.0.5</version>
                <configuration>
                    <path>file:src/main/resources/application.yaml</path>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

使用此插件时,提供加密密码的最简单方法是通过系统属性,即 -Djasypt.encryptor.password=“密码”。

默认情况下,插件会在./src/main/resources下的Spring Boot配置文件application. properties中加密配置,但我们用的一般都是yaml文件,因此修改一下即可。

记得一定要加spring-boot-maven-plugin依赖(ps:本人之前cv了依赖代码忘记cv构建代码导致一直报错)。

b.修改配置文件

spring:
  application:
    name: server
  datasource:
    url: ENC(jdbc:mysql://localhost:3306/study_db?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai)
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: ENC(root)
    password: ENC(123456)
jasypt:
  encryptor:
    algorithm: PBEWITHHMACSHA512ANDAES_256
    iv-generator-classname: org.jasypt.iv.RandomIvGenerator
    property:
      prefix: ENC(
      suffix: )

c.运行如下maven命令:

如果采用的是多模块开发,记得选择模块

image-20240726215037612

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

d.打包项目

image-20240726215253282

e.运行jar包

转到target目录用命令行运行下面的命令

java -jar xxx.jar --jasypt.encryptor.password=secret_key

f.测试

image-20240726215611607

四、总结

本文介绍了在SpringBoot3项目中集成Jasypt实现配置文件信息加密的方法。Jasypt不仅可以用来加密数据库用户名、密码,还可以用来加密API秘钥等等敏感信息,只需要添加一个加密前缀和缀就可以轻松实现配置信息加密,希望对大家有所帮助。

以上就是SpringBoot3使用Jasypt实现配置文件信息加密的方法的详细内容,更多关于SpringBoot3 Jasypt文件加密的资料请关注脚本之家其它相关文章!

相关文章

  • Spring核心思想之浅谈IoC容器与依赖倒置(DI)

    Spring核心思想之浅谈IoC容器与依赖倒置(DI)

    文章介绍了Spring的IoC和DI机制,以及MyBatis的动态代理,通过注解和反射,Spring能够自动管理对象的创建和依赖注入,而MyBatis则通过动态代理实现了接口方法到数据库操作的映射,文章详细解释了Spring和MyBatis的工作原理,并通过示例代码展示了它们的结合使用方式
    2025-01-01
  • springboot web项目打jar或者war包并运行的实现

    springboot web项目打jar或者war包并运行的实现

    这篇文章主要介绍了springboot web项目打jar或者war包并运行的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-11-11
  • 详解Java中使用泛型实现快速排序算法的方法

    详解Java中使用泛型实现快速排序算法的方法

    这篇文章主要介绍了Java中使用泛型实现快速排序算法的方法,快速排序的平均时间复杂度为(n\log n),文中的方法立足于基础而并没有考虑优化处理,需要的朋友可以参考下
    2016-05-05
  • 使用AOP+反射实现自定义Mybatis多表关联查询

    使用AOP+反射实现自定义Mybatis多表关联查询

    这篇文章主要介绍了使用AOP+反射实现自定义Mybatis多表关联,目前的需求是增强现有的查询,使用简单的注解即可实现多表关联,本文通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • java获取当前时间并格式化代码实例

    java获取当前时间并格式化代码实例

    这篇文章主要介绍了java获取当前时间并格式化代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • springboot的controller层的常用注解说明

    springboot的controller层的常用注解说明

    这篇文章主要介绍了springboot的controller层的常用注解说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • 关于Spring框架中异常处理情况浅析

    关于Spring框架中异常处理情况浅析

    最近学习Spring时,认识到Spring异常处理的强大,这篇文章主要给大家介绍了关于Spring框架中异常处理情况的相关资料,通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-08-08
  • 利用Spring Social轻松搞定微信授权登录的方法示例

    利用Spring Social轻松搞定微信授权登录的方法示例

    这篇文章主要介绍了利用Spring Social轻松搞定微信授权登录的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • Java中打乱一个数组的2种公平算法分享

    Java中打乱一个数组的2种公平算法分享

    这篇文章主要介绍了Java中打乱一个数组的2种公平算法分享,本文讲解了洗牌程序原理、生成随机索引交换二种方法并给出示例代码,需要的朋友可以参考下
    2015-03-03
  • spring 整合kafka监听消费的配置过程

    spring 整合kafka监听消费的配置过程

    这篇文章主要介绍了spring 整合kafka监听消费的配置过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03

最新评论