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使用強加密算法來保護配置文件中的敏感信息,防止數(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加密算法的強加密算法。iv-generator-classname
: 指定用于生成初始化向量的類。RandomIvGenerator
是一個隨機生成初始化向量的生成器,它適用于需要初始化向量的加密算法,如AES。每次加密時,它都會生成一個新的隨機初始化向量,增加了解密的難度。password
: 指定用于加密和解密的密碼。property.prefix
: 指定加密值的前綴。當Jasypt處理配置文件時,它會查找以這個前綴開始的屬性值,并嘗試使用配置的加密算法進行解密。默認值是ENC(
,也可以進行修改。property.suffix
: 指定加密值的后綴。與prefix
類似,Jasypt會查找以這個后綴結(jié)束的屬性值進行解密。默認值是)
。
更多配置屬性:
Key | 描述 | Required | Default Value |
---|---|---|---|
jasypt.encryptor.password | 用于加密和解密的密碼。這個密碼非常重要,因為它用于生成加密密鑰和解密密文。 | True | - |
jasypt.encryptor.algorithm | 指定加密算法。默認值是PBEWITHHMACSHA512ANDAES_256 ,這是一種結(jié)合了SHA-512 HMAC和AES-256加密算法的強加密算法。 | False | PBEWITHHMACSHA512ANDAES_256 |
jasypt.encryptor.key-obtention-iterations | 指定獲取加密密鑰的迭代次數(shù)。這個值越大,獲取密鑰的過程越慢,但越安全。 | False | 1000 |
jasypt.encryptor.pool-size | 指定加密器池的大小。如果設(shè)置為大于1的值,Jasypt將使用一個線程池來并行處理加密和解密請求。 | False | 1 |
jasypt.encryptor.provider-name | 指定加密提供者的名稱。默認值是SunJCE ,這是Java加密擴展(JCE)的Sun Microsystems實現(xiàn)。 | False | SunJCE |
jasypt.encryptor.provider-class-name | 指定加密提供者的類名。如果指定了這個屬性,Jasypt將使用這個類作為加密提供者,而不是默認的SunJCE 。 | False | null |
jasypt.encryptor.salt-generator-classname | 指定用于生成鹽值的類。默認值是org.jasypt.salt.RandomSaltGenerator ,它生成一個隨機的鹽值。 | False | org.jasypt.salt.RandomSaltGenerator |
jasypt.encryptor.iv-generator-classname | 指定用于生成初始化向量的類。默認值是org.jasypt.iv.RandomIvGenerator ,它生成一個隨機的初始化向量。 | False | org.jasypt.iv.RandomIvGenerator |
jasypt.encryptor.string-output-type | 指定加密后的字符串輸出類型。默認值是base64 ,這意味著加密后的值將轉(zhuǎn)換為Base64編碼的字符串。 | False | base64 |
jasypt.encryptor.proxy-property-sources | 指定是否代理屬性源。如果設(shè)置為true ,Jasypt將代理所有的屬性源,以便在獲取屬性值時進行解密。 | False | false |
jasypt.encryptor.skip-property-sources | 指定要跳過的屬性源列表。如果某些屬性源不包含敏感信息,或者您不想對它們進行加密,可以將它們添加到這個列表中。 | 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ù)庫連接成功。
但這種方案有個問題,秘鑰寫在配置文件當中,一旦代碼泄露,那別人就可以使用秘鑰解密我們的密文,因此可以采取方案二。
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=“密碼”。
默認情況下,插件會在./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)配置文件信息加密的方法的詳細內(nèi)容,更多關(guān)于SpringBoot3 Jasypt文件加密的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
詳解Struts2中json 相互引用死循環(huán)解決辦法
本篇文章主要介紹詳解Struts2中json 相互引用死循環(huán)解決辦法,具有一定的參考價值,有興趣的可以了解一下。2017-01-01自定義的Troop<T>泛型類( c++, java和c#)的實現(xiàn)代碼
這篇文章主要介紹了自定義的Troop<T>泛型類( c++, java和c#)的實現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05解決SpringBoot 測試類無法自動注入@Autowired的問題
這篇文章主要介紹了解決SpringBoot 測試類無法自動注入@Autowired的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-03-03關(guān)于@RequestBody和@RequestParam注解的使用詳解
這篇文章主要介紹了關(guān)于@RequestBody和@RequestParam注解的使用詳解,本文十分具有參考意義,希望可以幫助到你,如果有錯誤的地方還望不吝賜教2023-03-03Java HashMap三種循環(huán)遍歷方式及其性能對比實例分析
這篇文章主要介紹了Java HashMap三種循環(huán)遍歷方式及其性能對比,結(jié)合具體實例形式分析了Java HashMap三種循環(huán)遍歷方式的實現(xiàn)方法、運行效率及性能優(yōu)劣,需要的朋友可以參考下2019-10-10