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

Jasypt是一個易于使用的Java庫,專門用于加密和解密配置文件中的敏感信息,如數(shù)據(jù)庫憑據(jù)、API密鑰等。它提供了一種安全的方式來存儲和管理配置文件中的敏感數(shù)據(jù),而不是以明文形式暴露。
Jasypt支持多種加密算法,如DES、AES、Blowfish等,以及基于口令的加密算法(PBE)。它還提供了靈活的配置選項,允許開發(fā)人員自定義加密算法、密碼、初始化向量等。
官網(wǎng):jasypt-spring-boot
1.2 Jasypt庫的主要特點
Jasypt的主要特點包括:
- 簡單易用:Jasypt提供了簡單的API和注解,使得在應(yīng)用程序中集成和使用Jasypt變得非常容易。
- 安全性高:Jasypt使用強(qiáng)加密算法來保護(hù)配置文件中的敏感信息,防止數(shù)據(jù)泄露和未授權(quá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 # 這里的秘鑰一般不會寫在配置文件中,為了方便理解暫時放在這里
property:
prefix: ENC(
suffix: )
algorithm: jasypt的加密算法,這里指定加密算法為一種結(jié)合了SHA-512 HMAC和AES-256加密算法的強(qiáng)加密算法。iv-generator-classname: 指定用于生成初始化向量的類。RandomIvGenerator是一個隨機(jī)生成初始化向量的生成器,它適用于需要初始化向量的加密算法,如AES。每次加密時,它都會生成一個新的隨機(jī)初始化向量,增加了解密的難度。password: 指定用于加密和解密的密碼。property.prefix: 指定加密值的前綴。當(dāng)Jasypt處理配置文件時,它會查找以這個前綴開始的屬性值,并嘗試使用配置的加密算法進(jìn)行解密。默認(rèn)值是ENC(,也可以進(jìn)行修改。property.suffix: 指定加密值的后綴。與prefix類似,Jasypt會查找以這個后綴結(jié)束的屬性值進(jìn)行解密。默認(rèn)值是)。
更多配置屬性:
| Key | 描述 | Required | Default Value |
|---|---|---|---|
| jasypt.encryptor.password | 用于加密和解密的密碼。這個密碼非常重要,因為它用于生成加密密鑰和解密密文。 | 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ù)。這個值越大,獲取密鑰的過程越慢,但越安全。 | False | 1000 |
| jasypt.encryptor.pool-size | 指定加密器池的大小。如果設(shè)置為大于1的值,Jasypt將使用一個線程池來并行處理加密和解密請求。 | False | 1 |
| jasypt.encryptor.provider-name | 指定加密提供者的名稱。默認(rèn)值是SunJCE,這是Java加密擴(kuò)展(JCE)的Sun Microsystems實現(xiàn)。 | False | SunJCE |
| jasypt.encryptor.provider-class-name | 指定加密提供者的類名。如果指定了這個屬性,Jasypt將使用這個類作為加密提供者,而不是默認(rèn)的SunJCE。 | False | null |
| jasypt.encryptor.salt-generator-classname | 指定用于生成鹽值的類。默認(rèn)值是org.jasypt.salt.RandomSaltGenerator,它生成一個隨機(jī)的鹽值。 | False | org.jasypt.salt.RandomSaltGenerator |
| jasypt.encryptor.iv-generator-classname | 指定用于生成初始化向量的類。默認(rèn)值是org.jasypt.iv.RandomIvGenerator,它生成一個隨機(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將代理所有的屬性源,以便在獲取屬性值時進(jìn)行解密。 | False | false |
| jasypt.encryptor.skip-property-sources | 指定要跳過的屬性源列表。如果某些屬性源不包含敏感信息,或者您不想對它們進(jìn)行加密,可以將它們添加到這個列表中。 | False | empty list |
3.3 加密配置文件信息
先看一下我們現(xiàn)有的配置文件信息,我們要加密的信息是數(shù)據(jù)庫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
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.運行

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)
再次運行和測試:

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

mvn jasypt:encrypt -Djasypt.encryptor.password=secret_key
d.打包項目

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

四、總結(jié)
本文介紹了在SpringBoot3項目中集成Jasypt實現(xiàn)配置文件信息加密的方法。Jasypt不僅可以用來加密數(shù)據(jù)庫用戶名、密碼,還可以用來加密API秘鑰等等敏感信息,只需要添加一個加密前綴和綴就可以輕松實現(xiàn)配置信息加密,希望對大家有所幫助。
以上就是SpringBoot3使用Jasypt實現(xiàn)配置文件信息加密的方法的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot3 Jasypt文件加密的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
springboot web項目打jar或者war包并運行的實現(xiàn)
這篇文章主要介紹了springboot web項目打jar或者war包并運行的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11
使用AOP+反射實現(xiàn)自定義Mybatis多表關(guān)聯(lián)查詢
這篇文章主要介紹了使用AOP+反射實現(xiàn)自定義Mybatis多表關(guān)聯(lián),目前的需求是增強(qiáng)現(xiàn)有的查詢,使用簡單的注解即可實現(xiàn)多表關(guān)聯(lián),本文通過實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05
利用Spring Social輕松搞定微信授權(quán)登錄的方法示例
這篇文章主要介紹了利用Spring Social輕松搞定微信授權(quán)登錄的方法示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12

