JAVA SpringBoot集成Jasypt進行加密、解密的詳細過程
JAVA (SpringBoot) 集成 Jasypt 進行加密、解密 - 詳細教程
在開發(fā)過程中,我們經(jīng)常需要處理敏感數(shù)據(jù),如數(shù)據(jù)庫密碼、API 密鑰等。為了確保這些數(shù)據(jù)的安全性,我們可以使用加密技術(shù)來保護它們不被泄露。Jasypt(Java Simplified Encryption)是一個簡單易用的加密庫,非常適合用來保護配置文件中的敏感數(shù)據(jù)。本文將詳細介紹如何在 Spring Boot 項目中集成 Jasypt,并展示加密、解密的實際使用方式。
一、Jasypt 簡介
Jasypt 是 Java 平臺的簡化加密工具,支持對文本和數(shù)據(jù)進行加密和解密,尤其適合應(yīng)用于 Spring Boot 項目的配置文件加密。其主要特點包括:
- 簡單易用的 API
- 支持對屬性文件內(nèi)容加密
- 支持常見的加密算法
- 與 Spring Boot 的無縫集成
二、在 Spring Boot 中集成 Jasypt
1. 添加 Jasypt 依賴
在 pom.xml 文件中添加 Jasypt 依賴:
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.4</version> <!-- 請根據(jù)需要更新到最新版本 -->
</dependency>如果使用的是 Gradle,則添加如下依賴:
implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.4'
2. 配置加密密鑰
為了加密和解密數(shù)據(jù),Jasypt 需要一個密鑰(secret key)。你可以將這個密鑰配置在 Spring Boot 的 application.properties 或 application.yml 文件中:
application.properties配置:- jasypt.encryptor.password=mysecretkey
application.yml配置:- jasypt:
- encryptor:
- password: mysecretkey
注意:
mysecretkey是你用于加密和解密的密鑰,請確保密鑰的安全性,避免公開泄露??梢酝ㄟ^環(huán)境變量或其他安全手段來管理該密鑰。
3. 加密敏感數(shù)據(jù)
假設(shè)我們需要對數(shù)據(jù)庫密碼進行加密,首先,我們需要生成加密后的密碼。
3.1 使用 Jasypt 命令行工具加密
Jasypt 提供了命令行工具來加密數(shù)據(jù),執(zhí)行以下命令加密數(shù)據(jù)庫密碼:
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="your_password" password="mysecretkey" algorithm=PBEWithMD5AndDES
其中:
input是要加密的文本(例如數(shù)據(jù)庫密碼)password是加密密鑰(與我們在配置文件中設(shè)置的mysecretkey一致)algorithm是加密算法,這里使用PBEWithMD5AndDES。
執(zhí)行后,將得到類似以下的加密文本輸出:
5MG1sSxAx+EeJsBdmcVdKg==
3.2 將加密后的密碼寫入配置文件
加密后的密碼需要在配置文件中使用 ENC() 包裹。例如,假設(shè)加密的是數(shù)據(jù)庫密碼:
application.properties:- spring.datasource.password=ENC(5MG1sSxAx+EeJsBdmcVdKg==)
application.yml:- spring:
- datasource:
- password: ENC(5MG1sSxAx+EeJsBdmcVdKg==)
Jasypt 會在應(yīng)用啟動時自動解密使用 ENC() 包裹的加密值。
4. 啟動應(yīng)用并解密數(shù)據(jù)
當 Spring Boot 項目啟動時,Jasypt 會自動識別 ENC() 包裹的加密內(nèi)容,并使用密鑰進行解密,無需額外的代碼邏輯。這意味著在運行時,應(yīng)用能夠使用解密后的值。
三、自定義 Jasypt 加密配置
Jasypt 支持多種加密算法和配置項。如果你需要使用不同的加密算法、密鑰生成方式等,可以通過 Java 配置進行自定義。
1. 自定義加密器配置
通過自定義 StringEncryptor,我們可以配置加密算法、密鑰迭代次數(shù)等:
import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class JasyptConfig {
@Bean
public StringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
// 配置加密密鑰,務(wù)必保密
config.setPassword("mysecretkey");
// 設(shè)置加密算法
config.setAlgorithm("PBEWithMD5AndDES");
// 設(shè)置密鑰迭代次數(shù),影響破解難度
config.setKeyObtentionIterations("1000");
// 設(shè)置加密池的大小,1 表示單個實例使用
config.setPoolSize("1");
// 鹽生成器類,防止彩虹表攻擊
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
// 設(shè)置輸出編碼類型為 base64
config.setStringOutputType("base64");
encryptor.setConfig(config);
return encryptor;
}
}2. 參數(shù)說明:
- Password: 加密和解密時使用的密鑰。應(yīng)與配置文件中的
jasypt.encryptor.password保持一致。 - Algorithm: 加密算法??梢赃x擇
PBEWithMD5AndDES、PBEWithSHA1AndDESede等。 - KeyObtentionIterations: 密鑰生成的迭代次數(shù),值越高,破解難度越大。
- SaltGeneratorClassName: 鹽生成器,防止使用預計算好的哈希表(彩虹表)破解。
- StringOutputType: 設(shè)置輸出的編碼方式。通常使用
base64或hexadecimal。
四、加密與解密的詳細示例
以下是一個詳細的加密與解密的單元測試示例,用于測試自定義加密器的加密和解密功能。
import org.jasypt.util.text.BasicTextEncryptor;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class JasyptEncryptionTest {
@Test
public void testEncryptionDecryption() {
// 創(chuàng)建 BasicTextEncryptor 對象進行簡單的加密解密操作
BasicTextEncryptor encryptor = new BasicTextEncryptor();
// 設(shè)置加密密鑰,與應(yīng)用程序中使用的密鑰一致
encryptor.setPassword("mysecretkey");
// 待加密的敏感數(shù)據(jù)
String originalText = "mySensitiveData";
// 使用 encrypt() 方法對文本進行加密
String encryptedText = encryptor.encrypt(originalText);
System.out.println("加密后的文本: " + encryptedText);
// 使用 decrypt() 方法解密文本
String decryptedText = encryptor.decrypt(encryptedText);
System.out.println("解密后的文本: " + decryptedText);
// 確保解密后的文本與原始文本一致
assertEquals(originalText, decryptedText);
}
}詳細注釋:
- BasicTextEncryptor: Jasypt 提供的簡易加密類,用于文本加密和解密。
- encrypt(): 加密方法,將明文轉(zhuǎn)換為加密后的文本。
- decrypt(): 解密方法,將加密后的文本還原為明文。
- assertEquals(): 測試框架中的斷言方法,用于驗證加密和解密是否正確。
測試輸出:
加密后的文本: yxKTmDKoxkOTxF5GyqaDLw==
解密后的文本: mySensitiveData
測試通過則說明加密與解密功能正常。
五、總結(jié)
通過本文的詳細步驟,我們了解了如何在 Spring Boot 項目中集成 Jasypt 進行加密和解密。Jasypt 可以通過簡單的配置將敏感數(shù)據(jù)加密保存,從而提高應(yīng)用程序的安全性。
集成步驟總結(jié):
- 引入 Jasypt 依賴。
- 配置加密密鑰。
- 對敏感數(shù)據(jù)進行加密,并在配置文件中使用
ENC()包裹加密值。 - Spring Boot 自動解密
ENC()包裹的值。 - 可根據(jù)需求自定義加密器,選擇適合的加密算法和配置。
通過這種方式,我們可以在不修改代碼的情況下輕松保護應(yīng)用程序的敏感信息。
參考文檔:
到此這篇關(guān)于JAVA SpringBoot集成Jasypt進行加密、解密的詳細過程的文章就介紹到這了,更多相關(guān)java jasypt加密解密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java組件commons-fileupload實現(xiàn)文件上傳
這篇文章主要介紹了java借助commons-fileupload組件實現(xiàn)文件上傳,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10
手寫簡版kedis分布式key及value服務(wù)的實現(xiàn)及配置
這篇文章主要為大家介紹了手寫簡版的kedis分布式key及value服務(wù)的實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-02-02
JAVA中實現(xiàn)原生的 socket 通信機制原理
本篇文章主要介紹了JAVA中實現(xiàn)原生的 socket 通信機制原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-08-08

