最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot/SpringCloud使用jasypt-spring-boot實(shí)現(xiàn)配置文件加密

 更新時(shí)間:2026年05月08日 08:38:37   作者:北風(fēng)toto  
在現(xiàn)代軟件開發(fā)和部署中,應(yīng)用程序的配置文件常常包含敏感信息,本文將詳細(xì)介紹如何使用 jasypt-spring-boot 庫(kù),在 Spring Boot 和 Spring Cloud 項(xiàng)目中實(shí)現(xiàn)配置文件內(nèi)容的加密與解密,需要的朋友可以參考下

一、 引言:為什么需要配置文件加密?

在現(xiàn)代軟件開發(fā)和部署中,應(yīng)用程序的配置文件(如 application.propertiesapplication.yml)常常包含敏感信息,例如:

  • 數(shù)據(jù)庫(kù)用戶名和密碼
  • 第三方服務(wù)的 API Key 或 Secret
  • 消息隊(duì)列的連接憑證
  • Redis、MongoDB 等中間件的訪問(wèn)密碼
  • 加密密鑰或證書路徑

這些敏感信息如果以明文形式存儲(chǔ)在配置文件中,無(wú)論是在代碼倉(cāng)庫(kù)、服務(wù)器文件系統(tǒng)還是容器鏡像里,都存在極大的安全風(fēng)險(xiǎn)。一旦泄露,可能導(dǎo)致數(shù)據(jù)被竊取、服務(wù)被濫用或系統(tǒng)被攻擊。因此,對(duì)配置文件中的敏感信息進(jìn)行加密處理是保障應(yīng)用安全的重要環(huán)節(jié)。

本文將詳細(xì)介紹如何使用 jasypt-spring-boot 庫(kù),在 Spring Boot 和 Spring Cloud 項(xiàng)目中實(shí)現(xiàn)配置文件內(nèi)容的加密與解密。

二、 核心工具:jasypt-spring-boot

jasypt-spring-boot 是一個(gè)集成 Jasypt (Java Simplified Encryption) 的 Spring Boot Starter,它極大地簡(jiǎn)化了在 Spring Boot 應(yīng)用中進(jìn)行屬性加密和解密的過(guò)程。

  • Jasypt: 一個(gè)強(qiáng)大的 Java 加密庫(kù),提供簡(jiǎn)單的 API 來(lái)加密、解密密碼、文本、數(shù)字等。
  • jasypt-spring-boot: 將 Jasypt 無(wú)縫集成到 Spring Boot 的 Environment 抽象層中,允許開發(fā)者使用特定的格式(如 ENC(encrypted_value))來(lái)標(biāo)記加密后的屬性值。Spring Boot 在啟動(dòng)時(shí)會(huì)自動(dòng)識(shí)別并解密這些值,使應(yīng)用代碼無(wú)需關(guān)心解密過(guò)程。

三、 安裝與依賴

首先,需要在你的 Spring Boot 項(xiàng)目的 pom.xml(Maven)或 build.gradle(Gradle)文件中添加 jasypt-spring-boot-starter 依賴。

Maven (pom.xml)

<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>3.0.5</version> <!-- 請(qǐng)根據(jù)你的 Spring Boot 版本選擇合適的 jasypt 版本 -->
</dependency>

Gradle (build.gradle)

dependencies {
    implementation 'com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5'
    // ... 其他依賴
}

注意jasypt-spring-boot 的版本通常需要與你的 Spring Boot 版本兼容。請(qǐng)查閱 GitHub Releases 頁(yè)面選擇正確的版本。

四、 加密密鑰(Password)管理

Jasypt 加密和解密都需要一個(gè)共享的加密密鑰(Password)。這個(gè)密鑰必須被安全地傳遞給應(yīng)用。常見的設(shè)置方式有:

  1. 命令行參數(shù): java -jar myapp.jar --jasypt.encryptor.password=myStrongPassword
  2. 環(huán)境變量: export JASYPT_ENCRYPTOR_PASSWORD=myStrongPassword && java -jar myapp.jar
  3. 配置文件: 在 application.propertiesapplication.yml 中設(shè)置(強(qiáng)烈不推薦,因?yàn)檫@樣失去了加密的意義,但可用于測(cè)試)。例如:
# application.properties
jasypt.encryptor.password=myStrongPassword
# application.yml
jasypt:
  encryptor:
    password: myStrongPassword

最佳實(shí)踐:將 jasypt.encryptor.password 通過(guò)環(huán)境變量或命令行參數(shù)的方式傳入,避免將其硬編碼在配置文件中。

五、 執(zhí)行加密

加密操作可以通過(guò)多種方式進(jìn)行,最常用的是使用命令行工具或編寫一個(gè)簡(jiǎn)單的 Java 工具類。

方法一:命令行工具(使用 jasypt CLI)

下載 Jasypt 的發(fā)行包,解壓后在 bin 目錄下有各種腳本(encrypt.bat, encrypt.sh 等)。

執(zhí)行命令:

./encrypt.sh input="your-sensitive-value" password="myStrongPassword"

(Windows 用戶使用 encrypt.bat

輸出示例:

----ENVIRONMENT-----------------
Runtime: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 25.201-b09
... (其他環(huán)境信息)
----ARGUMENTS-------------------
input: your-sensitive-value
password: myStrongPassword
...
----OUTPUT----------------------
UyBtaXNzaW5nIHlvdSB0aGVyZQ== # 這是加密后的值

方法二:Java 工具類

創(chuàng)建一個(gè)簡(jiǎn)單的 Java 類來(lái)執(zhí)行加密:

import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.EnvironmentStringPBEConfig;

public class JasyptEncryptionUtil {

    public static void main(String[] args) {
        if (args.length != 1) {
            System.err.println("Usage: java JasyptEncryptionUtil <value_to_encrypt>");
            System.exit(1);
        }
        String valueToEncrypt = args[0];
        String password = System.getenv("JASYPT_ENCRYPTOR_PASSWORD"); // 從環(huán)境變量讀取密碼
        if (password == null || password.isEmpty()) {
             System.err.println("Error: JASYPT_ENCRYPTOR_PASSWORD environment variable is not set.");
             System.exit(2);
        }

        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        EnvironmentStringPBEConfig config = new EnvironmentStringPBEConfig();
        config.setPassword(password); // 設(shè)置加密密碼
        // 可選:設(shè)置算法、迭代次數(shù)等
        // config.setAlgorithm("PBEWithMD5AndDES");
        encryptor.setConfig(config);

        String encryptedValue = encryptor.encrypt(valueToEncrypt);
        System.out.println("Encrypted Value: " + encryptedValue);
    }
}

編譯并運(yùn)行:

javac -cp "path/to/jasypt-*.jar" JasyptEncryptionUtil.java
export JASYPT_ENCRYPTOR_PASSWORD=myStrongPassword
java -cp ".:path/to/jasypt-*.jar" JasyptEncryptionUtil "your-sensitive-value"

方法三:使用 jasypt-spring-boot 提供的工具(需要將庫(kù)引入到測(cè)試或單獨(dú)的工具模塊)

如果你的應(yīng)用已經(jīng)包含了 jasypt-spring-boot-starter,你可以利用其內(nèi)部的 StringEncryptor bean 來(lái)加密,但這通常不如前兩種方法直接。

六、 在配置文件中使用加密值

獲得加密后的字符串后,你需要將其放入你的 Spring Boot 配置文件中。jasypt-spring-boot 會(huì)自動(dòng)識(shí)別 ENC(encrypted_value) 格式的屬性值并進(jìn)行解密。

application.yml 示例:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: ENC(U2FsdGVkX1+...) # 加密后的用戶名
    password: ENC(U2FsdGVkX1+...) # 加密后的密碼
    driver-class-name: com.mysql.cj.jdbc.Driver
myapp:
  api:
    key: ENC(V2FsdGVkX1+...) # 加密后的API Key

application.properties 示例:

spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=ENC(U2FsdGVkX1+...)
spring.datasource.password=ENC(U2FsdEVkX1+...)
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
myapp.api.key=ENC(V2FsdGVkX1+...)

當(dāng) Spring Boot 應(yīng)用啟動(dòng)時(shí),jasypt-spring-boot 會(huì)攔截這些屬性的讀取請(qǐng)求,檢測(cè)到 ENC(...) 標(biāo)記,然后使用配置的密碼對(duì)其進(jìn)行解密,并將解密后的原始值注入到相應(yīng)的 Bean 屬性或通過(guò) @Value 注解注入到變量中。

七、 EncryptablePropertyResolver

EncryptablePropertyResolverjasypt-spring-boot 內(nèi)部使用的一個(gè)關(guān)鍵接口,用于解析包含 ENC() 標(biāo)記的屬性值。它擴(kuò)展了 Spring 的 org.springframework.core.env.PropertyResolver 接口。

  • 當(dāng) Environment 嘗試解析一個(gè)屬性時(shí)(例如 environment.getProperty("spring.datasource.password")),
  • jasypt-spring-boot 會(huì)提供一個(gè)實(shí)現(xiàn)了 EncryptablePropertyResolver 的包裝器。
  • 這個(gè)包裝器檢查屬性值是否以 ENC( 開頭且以 ) 結(jié)尾。
  • 如果是,則提取括號(hào)內(nèi)的加密字符串,使用 StringEncryptor 解密,并返回解密后的結(jié)果。
  • 如果不是,則直接返回原始值。

開發(fā)者通常不需要直接與 EncryptablePropertyResolver 交互,jasypt-spring-boot-starter 會(huì)自動(dòng)完成這一過(guò)程。

八、 進(jìn)階配置與注意事項(xiàng)

  • 自定義加密器: 可以通過(guò)配置 jasypt.encryptor.* 屬性來(lái)自定義加密算法、迭代次數(shù)、鹽值生成器等。
jasypt:
  encryptor:
    algorithm: PBEWITHHMACSHA512ANDAES_256 # 更強(qiáng)的算法
    iv-generator-classname: org.jasypt.iv.RandomIvGenerator # 使用隨機(jī)IV
    # ... 其他配置
  • 性能: 加密/解密操作在應(yīng)用啟動(dòng)時(shí)發(fā)生,對(duì)于運(yùn)行時(shí)性能影響很小。但如果需要頻繁讀取大量加密屬性,可能會(huì)有微小開銷。
  • 安全性: 確保加密密鑰 jasypt.encryptor.password 的安全性至關(guān)重要。不要將其硬編碼在代碼或配置文件中。使用環(huán)境變量、Kubernetes Secrets、HashiCorp Vault 等外部化、安全的密鑰管理方案是更好的選擇。
  • Spring Cloud Config: 如果你使用 Spring Cloud Config 作為配置中心,同樣可以在 Config Server 端或 Client 端啟用 jasypt-spring-boot 來(lái)加密和解密從 Config Server 獲取的配置。

九、 總結(jié)

通過(guò) jasypt-spring-boot,我們可以非常方便地在 Spring Boot 和 Spring Cloud 項(xiàng)目中實(shí)現(xiàn)配置文件的加密。其核心在于使用 ENC() 標(biāo)記加密后的值,并通過(guò) jasypt.encryptor.password 來(lái)解密。EncryptablePropertyResolver 在后臺(tái)自動(dòng)完成了識(shí)別、解密和替換的過(guò)程。正確管理和保護(hù)加密密鑰是確保此安全措施有效性的關(guān)鍵。

希望這篇帖子能幫助您理解并應(yīng)用 Spring Boot / Spring Cloud 的配置文件加密。

以上就是SpringBoot/SpringCloud使用jasypt-spring-boot實(shí)現(xiàn)配置文件加密的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot/SpringCloud配置文件加密的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Spring?Boot?配置文件類型properties?格式與yml?格式

    Spring?Boot?配置文件類型properties?格式與yml?格式

    這篇文章主要介紹了Spring?Boot?配置文件類型properties?格式與yml?格式,文章圍繞主題展開詳細(xì)內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • Spring Cloud Gateway不同頻率限流的解決方案(每分鐘,每小時(shí),每天)

    Spring Cloud Gateway不同頻率限流的解決方案(每分鐘,每小時(shí),每天)

    SpringCloud Gateway 是 Spring Cloud 的一個(gè)全新項(xiàng)目,它旨在為微服務(wù)架構(gòu)提供一種簡(jiǎn)單有效的統(tǒng)一的 API 路由管理方式。這篇文章主要介紹了Spring Cloud Gateway不同頻率限流(每分鐘,每小時(shí),每天),需要的朋友可以參考下
    2020-10-10
  • mybatis-generator 修改表結(jié)構(gòu)后實(shí)體不更新問(wèn)題及解決方法

    mybatis-generator 修改表結(jié)構(gòu)后實(shí)體不更新問(wèn)題及解決方法

    本文主要介紹了如何在MyBatis Generator中修改表結(jié)構(gòu)后更新實(shí)體類的問(wèn)題,并提供了解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-04-04
  • 淺談Java中Lock和Synchronized的區(qū)別

    淺談Java中Lock和Synchronized的區(qū)別

    這篇文章主要介紹了Java中Lock和Synchronized的區(qū)別,Lock和Synchronized都是java中去用來(lái)解決線程安全問(wèn)題的一個(gè)工具,但是具體有什么區(qū)別呢?下面我們一起進(jìn)入文章了解具體詳細(xì)內(nèi)容吧,需要的朋友可以參考一下
    2022-04-04
  • Spring中DeferredResult異步處理

    Spring中DeferredResult異步處理

    DeferredResult是Spring中處理異步請(qǐng)求的強(qiáng)大工具,可以幫助改善應(yīng)用程序的性能和用戶體驗(yàn),本文就來(lái)介紹一下Spring中DeferredResult異步處理,感興趣的可以了解一下
    2023-12-12
  • java實(shí)現(xiàn)時(shí)鐘表盤

    java實(shí)現(xiàn)時(shí)鐘表盤

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)時(shí)鐘表盤,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • 一文掌握Spring中循環(huán)依賴與三級(jí)緩存

    一文掌握Spring中循環(huán)依賴與三級(jí)緩存

    這篇文章主要介紹了Spring中循環(huán)依賴與三級(jí)緩存,Spring通過(guò)三級(jí)緩存解決了循環(huán)依賴,其中一級(jí)緩存為單例池,二級(jí)緩存為早期曝光對(duì)象earlySingletonObjects,三級(jí)緩存為早期曝光對(duì)象工廠(singletonFactories),本文結(jié)合實(shí)例代碼介紹的非常詳細(xì),需要的朋友參考下吧
    2023-09-09
  • response.setContentType()參數(shù)以及作用詳解

    response.setContentType()參數(shù)以及作用詳解

    這篇文章主要介紹了response.setContentType()參數(shù)以及作用詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Spring Boot分段處理List集合多線程批量插入數(shù)據(jù)的解決方案

    Spring Boot分段處理List集合多線程批量插入數(shù)據(jù)的解決方案

    大數(shù)據(jù)量的List集合,需要把List集合中的數(shù)據(jù)批量插入數(shù)據(jù)庫(kù)中,本文給大家介紹Spring Boot分段處理List集合多線程批量插入數(shù)據(jù)的解決方案,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • java中String、StringBuffer與StringBuilder的區(qū)別

    java中String、StringBuffer與StringBuilder的區(qū)別

    這篇文章主要介紹了java 中String和StringBuffer與StringBuilder的區(qū)別,在開發(fā)過(guò)程中經(jīng)常會(huì)用到String這個(gè)類進(jìn)行操作。需要的朋友可以收藏下,方便下次瀏覽觀看
    2021-12-12

最新評(píng)論

长宁县| 高州市| 城步| 鱼台县| 灵台县| 阿巴嘎旗| 湖州市| 绥滨县| 砀山县| 昌邑市| 天津市| 宿松县| 桃园县| 资中县| 如东县| 通海县| 新余市| 精河县| 娄底市| 安平县| 察哈| 夏邑县| 高淳县| 普定县| 依兰县| 孝昌县| 五寨县| 乳山市| 正宁县| 怀安县| 鹤峰县| 兴义市| 宾川县| 历史| 交口县| 灵璧县| 河南省| 茶陵县| 武山县| 岱山县| 云梦县|