SpringBoot3使用Jasypt實(shí)現(xiàn)配置文件信息加密的方法
前言
對(duì)于一些單體項(xiàng)目而言,在沒有使用SpringCloud的情況下,配置文件中包含著大量的敏感信息,比如數(shù)據(jù)庫(kù)的賬號(hào)密碼、API服務(wù)的秘鑰等等,如果這些信息泄露出去將會(huì)對(duì)企業(yè)的資產(chǎn)產(chǎn)生重大威脅。因此,對(duì)配置文件中的敏感信息加密是一件極其必要的事。
一、概述
1.1 Jasypt庫(kù)簡(jiǎn)介

Jasypt是一個(gè)易于使用的Java庫(kù),專門用于加密和解密配置文件中的敏感信息,如數(shù)據(jù)庫(kù)憑據(jù)、API密鑰等。它提供了一種安全的方式來(lái)存儲(chǔ)和管理配置文件中的敏感數(shù)據(jù),而不是以明文形式暴露。
Jasypt支持多種加密算法,如DES、AES、Blowfish等,以及基于口令的加密算法(PBE)。它還提供了靈活的配置選項(xiàng),允許開發(fā)人員自定義加密算法、密碼、初始化向量等。
官網(wǎng):jasypt-spring-boot
1.2 Jasypt庫(kù)的主要特點(diǎn)
Jasypt的主要特點(diǎn)包括:
- 簡(jiǎn)單易用:Jasypt提供了簡(jiǎn)單的API和注解,使得在應(yīng)用程序中集成和使用Jasypt變得非常容易。
- 安全性高:Jasypt使用強(qiáng)加密算法來(lái)保護(hù)配置文件中的敏感信息,防止數(shù)據(jù)泄露和未授權(quán)訪問(wèn)。
- 兼容性好:Jasypt可以與各種Java應(yīng)用程序和框架集成,包括Spring、Spring Boot、Hibernate等。
二、開發(fā)環(huán)境
- JDK版本:JDK 17
- Spring Boot版本:Spring Boot 3.2.2
- MySQL版本:8.0.37
- 構(gòu)建工具: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 # 這里的秘鑰一般不會(huì)寫在配置文件中,為了方便理解暫時(shí)放在這里
property:
prefix: ENC(
suffix: )
algorithm: jasypt的加密算法,這里指定加密算法為一種結(jié)合了SHA-512 HMAC和AES-256加密算法的強(qiáng)加密算法。iv-generator-classname: 指定用于生成初始化向量的類。RandomIvGenerator是一個(gè)隨機(jī)生成初始化向量的生成器,它適用于需要初始化向量的加密算法,如AES。每次加密時(shí),它都會(huì)生成一個(gè)新的隨機(jī)初始化向量,增加了解密的難度。password: 指定用于加密和解密的密碼。property.prefix: 指定加密值的前綴。當(dāng)Jasypt處理配置文件時(shí),它會(huì)查找以這個(gè)前綴開始的屬性值,并嘗試使用配置的加密算法進(jìn)行解密。默認(rèn)值是ENC(,也可以進(jìn)行修改。property.suffix: 指定加密值的后綴。與prefix類似,Jasypt會(huì)查找以這個(gè)后綴結(jié)束的屬性值進(jìn)行解密。默認(rèn)值是)。
更多配置屬性:
| Key | 描述 | Required | Default Value |
|---|---|---|---|
| jasypt.encryptor.password | 用于加密和解密的密碼。這個(gè)密碼非常重要,因?yàn)樗糜谏杉用苊荑€和解密密文。 | True | - |
| jasypt.encryptor.algorithm | 指定加密算法。默認(rèn)值是PBEWITHHMACSHA512ANDAES_256,這是一種結(jié)合了SHA-512 HMAC和AES-256加密算法的強(qiáng)加密算法。 | False | PBEWITHHMACSHA512ANDAES_256 |
| jasypt.encryptor.key-obtention-iterations | 指定獲取加密密鑰的迭代次數(shù)。這個(gè)值越大,獲取密鑰的過(guò)程越慢,但越安全。 | False | 1000 |
| jasypt.encryptor.pool-size | 指定加密器池的大小。如果設(shè)置為大于1的值,Jasypt將使用一個(gè)線程池來(lái)并行處理加密和解密請(qǐng)求。 | False | 1 |
| jasypt.encryptor.provider-name | 指定加密提供者的名稱。默認(rèn)值是SunJCE,這是Java加密擴(kuò)展(JCE)的Sun Microsystems實(shí)現(xiàn)。 | False | SunJCE |
| jasypt.encryptor.provider-class-name | 指定加密提供者的類名。如果指定了這個(gè)屬性,Jasypt將使用這個(gè)類作為加密提供者,而不是默認(rèn)的SunJCE。 | False | null |
| jasypt.encryptor.salt-generator-classname | 指定用于生成鹽值的類。默認(rèn)值是org.jasypt.salt.RandomSaltGenerator,它生成一個(gè)隨機(jī)的鹽值。 | False | org.jasypt.salt.RandomSaltGenerator |
| jasypt.encryptor.iv-generator-classname | 指定用于生成初始化向量的類。默認(rèn)值是org.jasypt.iv.RandomIvGenerator,它生成一個(gè)隨機(jī)的初始化向量。 | False | org.jasypt.iv.RandomIvGenerator |
| jasypt.encryptor.string-output-type | 指定加密后的字符串輸出類型。默認(rèn)值是base64,這意味著加密后的值將轉(zhuǎn)換為Base64編碼的字符串。 | False | base64 |
| jasypt.encryptor.proxy-property-sources | 指定是否代理屬性源。如果設(shè)置為true,Jasypt將代理所有的屬性源,以便在獲取屬性值時(shí)進(jìn)行解密。 | False | false |
| jasypt.encryptor.skip-property-sources | 指定要跳過(guò)的屬性源列表。如果某些屬性源不包含敏感信息,或者您不想對(duì)它們進(jìn)行加密,可以將它們添加到這個(gè)列表中。 | False | empty list |
3.3 加密配置文件信息
先看一下我們現(xiàn)有的配置文件信息,我們要加密的信息是數(shù)據(jù)庫(kù)url、username和password這三個(gè)屬性:
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.編寫測(cè)試類生成加密后的配置文件信息
@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.運(yùn)行

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)
再次運(yùn)行和測(cè)試:

測(cè)試的接口是我隨便寫的一個(gè)接口,實(shí)現(xiàn)的功能就是根據(jù)用戶名查詢數(shù)據(jù)庫(kù)中的一個(gè)用戶:
@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));
}
可以看到成功查詢到了用戶信息,說(shuō)明數(shù)據(jù)庫(kù)連接成功。
但這種方案有個(gè)問(wèn)題,秘鑰寫在配置文件當(dāng)中,一旦代碼泄露,那別人就可以使用秘鑰解密我們的密文,因此可以采取方案二。
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>
使用此插件時(shí),提供加密密碼的最簡(jiǎn)單方法是通過(guò)系統(tǒng)屬性,即 -Djasypt.encryptor.password=“密碼”。
默認(rèn)情況下,插件會(huì)在./src/main/resources下的Spring Boot配置文件application. properties中加密配置,但我們用的一般都是yaml文件,因此修改一下即可。
記得一定要加spring-boot-maven-plugin依賴(ps:本人之前cv了依賴代碼忘記cv構(gòu)建代碼導(dǎo)致一直報(bào)錯(cuò))。
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.運(yùn)行如下maven命令:
如果采用的是多模塊開發(fā),記得選擇模塊

mvn jasypt:encrypt -Djasypt.encryptor.password=secret_key
d.打包項(xiàng)目

e.運(yùn)行jar包
轉(zhuǎn)到target目錄用命令行運(yùn)行下面的命令
java -jar xxx.jar --jasypt.encryptor.password=secret_key
f.測(cè)試

四、總結(jié)
本文介紹了在SpringBoot3項(xiàng)目中集成Jasypt實(shí)現(xiàn)配置文件信息加密的方法。Jasypt不僅可以用來(lái)加密數(shù)據(jù)庫(kù)用戶名、密碼,還可以用來(lái)加密API秘鑰等等敏感信息,只需要添加一個(gè)加密前綴和綴就可以輕松實(shí)現(xiàn)配置信息加密,希望對(duì)大家有所幫助。
以上就是SpringBoot3使用Jasypt實(shí)現(xiàn)配置文件信息加密的方法的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot3 Jasypt文件加密的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
springmvc與mybatis集成配置實(shí)例詳解
這篇文章主要介紹了springmvc與mybatis集成配置實(shí)例詳解的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09
詳解Struts2中json 相互引用死循環(huán)解決辦法
本篇文章主要介紹詳解Struts2中json 相互引用死循環(huán)解決辦法,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01
自定義的Troop<T>泛型類( c++, java和c#)的實(shí)現(xiàn)代碼
這篇文章主要介紹了自定義的Troop<T>泛型類( c++, java和c#)的實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05
SpringBoot 如何自定義請(qǐng)求參數(shù)校驗(yàn)
這篇文章主要介紹了SpringBoot 如何自定義請(qǐng)求參數(shù)校驗(yàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
解決SpringBoot 測(cè)試類無(wú)法自動(dòng)注入@Autowired的問(wèn)題
這篇文章主要介紹了解決SpringBoot 測(cè)試類無(wú)法自動(dòng)注入@Autowired的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03
基于SpringBoot實(shí)現(xiàn)圖片上傳及圖片回顯
本篇文章主要介紹了SpringBoot如何實(shí)現(xiàn)圖片上傳及圖片回顯,文中通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2022-08-08
關(guān)于@RequestBody和@RequestParam注解的使用詳解
這篇文章主要介紹了關(guān)于@RequestBody和@RequestParam注解的使用詳解,本文十分具有參考意義,希望可以幫助到你,如果有錯(cuò)誤的地方還望不吝賜教2023-03-03
Java HashMap三種循環(huán)遍歷方式及其性能對(duì)比實(shí)例分析
這篇文章主要介紹了Java HashMap三種循環(huán)遍歷方式及其性能對(duì)比,結(jié)合具體實(shí)例形式分析了Java HashMap三種循環(huán)遍歷方式的實(shí)現(xiàn)方法、運(yùn)行效率及性能優(yōu)劣,需要的朋友可以參考下2019-10-10

