SpringBoot3:轻松使用Jasypt实现配置文件信息加密

科技   2024-09-25 08:59   河北  


前言

对于某些单体项目而言,在尚未采用SpringCloud架构的情况下,其配置文件中往往存储着大量敏感信息,诸如数据库的登录凭证(账号与密码)、API服务的密钥等。这些信息一旦遭到泄露,将对企业资产构成严重的安全威胁。因此,对配置文件内的敏感信息进行加密处理,成为了一项至关重要且必要的安全措施。

一、概述

Jasypt库简介

Jasypt是一个便捷且功能强大的Java库,专注于加密和解密配置文件中的敏感数据,比如数据库的连接信息、API密钥等。它通过提供一种安全的方式来存储和管理这些敏感数据,有效避免了以明文形式直接暴露于配置文件中可能带来的风险。Jasypt支持多样化的加密算法,包括但不限于DES、AES、Blowfish等,同时还支持基于密码的加密算法(PBE),为数据加密提供了丰富的选择。此外,它还设计有灵活的配置选项,使得开发人员能够根据需要自定义加密算法、密码设置、初始化向量等参数,以满足不同的安全需求。

主要特点

  • 简单易用: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

三、代码示例

引入依赖

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

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)的加密算法。通过每次加密时生成一个新的随机初始化向量,RandomIvGenerator大大增加了未经授权解密的难度,从而增强了数据的安全性。

  • password: 这是用于加密和解密过程中至关重要的密码。它必须被妥善保管,因为无论是加密还是解密操作,都需要这个密码来验证和执行。

  • property.prefix: 此配置项定义了加密值在配置文件中的前缀。当Jasypt处理配置文件时,它会自动查找所有以这个前缀开始的属性值,并尝试使用配置的加密算法和密钥进行解密。默认的前缀是ENC(,但根据实际需求,这个前缀也可以被修改。

  • property.suffix: 与property.prefix类似,这个配置项指定了加密值在配置文件中的后缀。Jasypt在解密过程中,会查找所有以这个后缀结束的属性值。默认的后缀是),但同样可以根据实际情况进行修改。通过这样的前缀和后缀定义,Jasypt能够准确地识别出哪些属性值是需要被解密的。


加密配置文件信息

在配置文件中,我们要加密的信息是数据库的 url、username、password 三个属性

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

配置文件加密方案

添加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>

修改配置文件相关信息

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: )

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

@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));
    }

测试接口:


Java技术前沿
专注分享Java技术,包括但不限于 SpringBoot,SpringCloud,Docker,消息中间件等。
 最新文章