SpringBoot+ENC實(shí)現(xiàn)密鑰加密的使用示例
前言
Spring Boot中使用ENC(Environment-Neutral Configuration)主要是為了將配置信息從應(yīng)用程序代碼中分離出來(lái),以提高安全性和可維護(hù)性。ENC的主要優(yōu)點(diǎn)包括:
- 安全性增強(qiáng): 敏感信息(如數(shù)據(jù)庫(kù)密碼、API密鑰等)不應(yīng)硬編碼在代碼中,而是應(yīng)該使用加密的方式存儲(chǔ)在配置文件中,然后通過(guò)ENC進(jìn)行解密和使用,從而減少泄露風(fēng)險(xiǎn)。
- 可維護(hù)性: 將配置信息與代碼分離,使得配置可以獨(dú)立地修改和管理,而不需要重新編譯和部署應(yīng)用程序。這樣可以降低維護(hù)成本,并使應(yīng)用程序更易于管理。
- 靈活性: 使用ENC可以根據(jù)不同的環(huán)境(開(kāi)發(fā)、測(cè)試、生產(chǎn)等)提供不同的配置,而不需要修改應(yīng)用程序代碼,從而提高了部署的靈活性和可移植性。
1、整合SpringBoot
1.1、POM
<dependencies>
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
</dependencies>
1.2、加密鹽值配置
整合SpringBoot時(shí),
鹽值的配置最好式寫(xiě)到配置中心的文件中,鹽值寫(xiě)到本地文件,泄露后也容易被進(jìn)行解密
jasypt:
encryptor:
# password值任意,最好隨機(jī)字符
password: hhX4FzbwcT
1.3、工具類(lèi)使用
使用工具類(lèi)對(duì)需要處理的明文數(shù)據(jù)進(jìn)行加密處理,再將加密結(jié)果寫(xiě)入到配置文件中
注意:工具類(lèi)使用完成后,應(yīng)該刪除
加密鹽
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
public class JasyptTest {
/**
* 加密鹽值,使用完成后進(jìn)行刪除,或者不能提交到`生產(chǎn)環(huán)境`,比如:
*/
private final static String PASSWORD = "hhX4FzbwcT";
public static void main(String[] args) {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
// 用于設(shè)置加密密鑰。密鑰是用于加密和解密字符串的關(guān)鍵信息。
config.setPassword(PASSWORD);
// 加密算法的名稱(chēng),jasypt-3.0.5版本后默認(rèn)的加密方式
config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
// 用于設(shè)置加密時(shí)迭代次數(shù)的數(shù)量,增加迭代次數(shù)可以使攻擊者更難進(jìn)行密碼破解。
config.setKeyObtentionIterations("1000");
// 加密器池的大小。池是一組加密器實(shí)例,可確保加密操作的并發(fā)性。
config.setPoolSize("1");
// 用于設(shè)置JCE(Java Cryptography Extension)提供程序的名稱(chēng)。
config.setProviderName("SunJCE");
// 用于設(shè)置生成鹽的類(lèi)名稱(chēng)。在此配置中,我們使用了org.jasypt.salt.RandomSaltGenerator,表示使用隨機(jī)生成的鹽。
config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
// 用于設(shè)置Jasypt使用的初始化向量(IV)生成器的類(lèi)名。初始化向量是在加密過(guò)程中使用的一個(gè)固定長(zhǎng)度的隨機(jī)數(shù),用于加密數(shù)據(jù)塊,使每個(gè)數(shù)據(jù)塊的加密結(jié)果都是唯一的。在此配置中,我們使用了org.jasypt.iv.RandomIvGenerator類(lèi),該類(lèi)是一個(gè)隨機(jī)生成器,用于生成實(shí)時(shí)隨機(jī)IV的實(shí)例。這樣可以確保每次加密的IV都是唯一的,從而增加加密強(qiáng)度。
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
// 指定加密輸出類(lèi)型。在此配置中,我們選擇了base64輸出類(lèi)型。
config.setStringOutputType("base64");
encryptor.setConfig(config);
// 明文1
String name_encrypt = "root";
// 明文2
String password_encrypt = "123456";
// 明文加密
String encrypt1 = encryptor.encrypt(name_encrypt);
String encrypt2 = encryptor.encrypt(password_encrypt);
System.out.println("明文加密1:" + encrypt1);
System.out.println("明文加密2:" + encrypt2);
// 密文解密
String decrypt1 = encryptor.decrypt(encrypt1);
String decrypt2 = encryptor.decrypt(encrypt2);
System.out.println("密文解密1:" + decrypt1);
System.out.println("密文解密2:" + decrypt2);
}
}

1.4、加密配置使用
YAML:
sys: name: ENC(Yt36hceu3xGXEzrz2jCPjvalaXQ5yIHE04SVT6lIkcktrxqtBZrlivkAkA9/9oZ2) password: ENC(0Ci6irPOko9IG+hBZJAGoguIuE52gF/XiigCV4DwLm6NfkoyvV4Etgc9FzKK3MYl)
1.5、測(cè)試
項(xiàng)目成功啟動(dòng),Yaml中設(shè)置密文文本,Controller正常打印明文信息,就表示ENC配置成功了
@RestController
public class TestController {
@Value("${sys.name}")
private String name;
@Value("${sys.password}")
private String password;
@GetMapping("/test")
public void test() {
System.out.println("name = " + name);
System.out.println("password = " + password);
}
}
2、ENC加載原理
1、在jasypt-spring-boot-starter包的自動(dòng)配置類(lèi)JasyptSpringBootAutoConfiguration中通過(guò)@Import注解引入了EnableEncryptablePropertiesConfiguration配置類(lèi),該類(lèi)中environment參數(shù)儲(chǔ)存了yaml文件元數(shù)據(jù);
2、在postProcessBeanFactory方法中,調(diào)用environment.getPropertySources()方法獲取yaml配置項(xiàng)目;

3、通過(guò)convertPropertySources進(jìn)行數(shù)據(jù)轉(zhuǎn)換,修改yaml中配置項(xiàng)值,具體實(shí)現(xiàn)為調(diào)用instantiatePropertySource()方法,在該方法中,匹配propertySource instanceof MapPropertySource,轉(zhuǎn)化為EncryptableMapPropertySourceWrapper對(duì)象;





4、EncryptableMapPropertySourceWapper類(lèi)中,通過(guò)getProperty(name)方法進(jìn)行匹配,匹配成功后調(diào)用resolver.resolvePropertyValue進(jìn)行ENC配置的解密并且替換原有的propertySource值;

到此這篇關(guān)于SpringBoot+ENC實(shí)現(xiàn)密鑰加密的使用示例的文章就介紹到這了,更多相關(guān)SpringBoot ENC密鑰加密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot實(shí)現(xiàn)圖形驗(yàn)證碼的示例代碼
驗(yàn)證碼的實(shí)現(xiàn)方式有很多,可以由前端實(shí)現(xiàn),也可以由后端進(jìn)行實(shí)現(xiàn),也有很多的插件和工具包可以使用,在這里,我們使用 Hutool 提供的小工具實(shí)現(xiàn),本文介紹SpringBoot實(shí)現(xiàn)圖形驗(yàn)證碼的實(shí)例,感興趣的朋友跟隨小編一起看看吧2025-12-12
Java 調(diào)用Restful API接口的幾種方式(HTTPS)
這篇文章主要介紹了Java 調(diào)用Restful API接口的幾種方式(HTTPS),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02
SpringBoot3實(shí)現(xiàn)優(yōu)雅停機(jī)的完整流程
在現(xiàn)代微服務(wù)架構(gòu)中,優(yōu)雅停機(jī)(Graceful Shutdown)是一項(xiàng)重要功能,可以確保服務(wù)在關(guān)閉時(shí)處理完所有當(dāng)前請(qǐng)求,避免突然終止連接或丟失數(shù)據(jù),Spring Boot 3 提供了對(duì)優(yōu)雅停機(jī)的內(nèi)置支持,本文給大家介紹了SpringBoot3怎樣優(yōu)雅停機(jī),需要的朋友可以參考下2024-10-10
修改Maven settings.xml 后配置未生效的解決
這篇文章主要介紹了修改Maven settings.xml 后配置未生效的解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10
Java實(shí)現(xiàn)數(shù)組反轉(zhuǎn)翻轉(zhuǎn)的方法實(shí)例
本篇文章主要介紹了Java實(shí)現(xiàn)數(shù)組反轉(zhuǎn)翻轉(zhuǎn)的方法實(shí)例,詳細(xì)的介紹了3種實(shí)現(xiàn)方法,有興趣的可以了解一下。2017-04-04
Java中把一個(gè)文件夾下的所有文件復(fù)制到另一個(gè)文件夾的完整實(shí)現(xiàn)方案
這篇文章主要介紹了如何使用Java原生API實(shí)現(xiàn)文件夾復(fù)制,支持多級(jí)目錄、空文件夾和文件覆蓋等場(chǎng)景,并提供了基于File和FileChannel的實(shí)現(xiàn)方案,此外,還介紹了使用Java 7的Files工具類(lèi)進(jìn)行簡(jiǎn)化實(shí)現(xiàn),需要的朋友可以參考下2026-01-01

