前言
对于某些单体项目而言,在尚未采用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));
}
测试接口: