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

SpringBoot中配置文件敏感信息加密解密的實現(xiàn)方案詳解

 更新時間:2025年06月04日 10:02:00   作者:代碼怪獸大作戰(zhàn)  
在現(xiàn)代企業(yè)級應用中,application.yml 或 application.properties 常用于配置數(shù)據(jù)庫等中間件的連接信息,但將明文密碼直接寫入配置文件中存在諸多風險,下面我們就來看看如何對配置文件敏感信息加密解密吧

背景與挑戰(zhàn) 

在現(xiàn)代企業(yè)級應用中,application.yml 或 application.properties 常用于配置數(shù)據(jù)庫(DataSource)、Redis、RabbitMQ 等中間件的連接信息。

spring:
  datasource:
    username: myuser
    password: my-secret-password

但問題來了:

將明文密碼直接寫入配置文件中存在諸多風險,主要包括:

風險類型詳細描述
代碼倉庫泄露風險配置文件可能被誤提交到 Git 等版本管理系統(tǒng),導致敏感信息外泄
構(gòu)建與發(fā)布風險打包過程或日志文件可能暴露敏感數(shù)據(jù),帶來安全隱患
調(diào)試與共享風險第三方人員或調(diào)試時可能接觸到明文,增加信息暴露概率

因此,敏感信息必須避免以明文形式存儲。

一、設(shè)計目標

目標說明
零明文配置配置文件中敏感字段均以 ENC(...) 形式存儲,無明文密碼。
自動解密應用啟動時自動解密,業(yè)務代碼無感知,無需改動。
多算法支持兼容 RSA、AES 等主流加密算法,滿足不同安全需求
開關(guān)靈活支持配置及環(huán)境變量動態(tài)啟停解密功能,滿足多環(huán)境多場景。
無侵入業(yè)務代碼保持 Spring Boot 原生配置機制,業(yè)務層透明使用解密后的配置。

二、整體啟動流程

1.密鑰注入

通過環(huán)境變量(如 DB_SECRET_KEY)注入 RSA 私鑰或?qū)ΨQ密鑰。

2.EnvironmentPostProcessor 掃描

Spring Boot 啟動時自動加載實現(xiàn)了 EnvironmentPostProcessor 的解密組件。

3.配置源掃描

遍歷所有 PropertySource,查找形如 ENC(...) 的密文字段。

4.調(diào)用解密工具

根據(jù)配置的算法(RSA/AES)還原明文。

5.注入環(huán)境變量

將解密后的結(jié)果以 MapPropertySource 形式優(yōu)先加載,覆蓋原加密值。

6.后續(xù)加載

DataSource、Redis、RabbitMQ 等配置自動獲得解密后的明文。

三、方案實現(xiàn)詳解

3.1 配置解密入口:EnvironmentPostProcessor

利用 Spring Boot 啟動機制的 EnvironmentPostProcessor,啟動早期掃描并解密所有配置文件中的敏感字段。

@Slf4j
public class DecryptEnvPostProcessor implements EnvironmentPostProcessor {

    // 預定義需要解密的配置項 key,只對這些 key 進行解密處理
    private static final Set<String> ENCRYPTED_KEYS = Set.of(
            "spring.datasource.password",
            "custom.service.password"
    );

    @Override
    public void postProcessEnvironment(ConfigurableEnvironment env, SpringApplication app) {
        boolean enabled = Boolean.parseBoolean(env.getProperty("config.decrypt.enabled", "true"));
        if (!enabled) {
            log.info("配置解密功能已關(guān)閉,跳過解密流程");
            return;
        }

        String key = System.getenv("DB_SECRET_KEY");
        if (StringUtils.isBlank(key)) {
            throw new IllegalStateException("缺少解密密鑰(DB_SECRET_KEY),無法完成解密");
        }

        Map<String, Object> decryptedValues = new HashMap<>();

        for (PropertySource<?> source : env.getPropertySources()) {
            if (source instanceof EnumerablePropertySource<?> eps) {
                for (String name : eps.getPropertyNames()) {
                    if (ENCRYPTED_KEYS.contains(name)) {
                        Object val = eps.getProperty(name);
                        if (val instanceof String s && s.startsWith("ENC(") && s.endsWith(")")) {
                            String cipherText = s.substring(4, s.length() - 1);
                            try {
                                String plainText = EncryptionTool.decrypt(key, cipherText, "RSA");
                                decryptedValues.put(name, plainText);
                            } catch (Exception e) {
                                log.warn("解密配置項 [{}] 失敗,保持原密文", name, e);
                            }
                        }
                    }
                }
            }
        }

        if (!decryptedValues.isEmpty()) {
            env.getPropertySources().addFirst(new MapPropertySource("decryptedProperties", decryptedValues));
        }
        log.info("配置文件敏感信息解密完成");
    }
}

關(guān)鍵點說明:

配置掃描與解密:支持 YAML、properties、環(huán)境變量等多種配置源。

解密開關(guān)靈活控制:通過 config.decrypt.enabled 配置項動態(tài)啟用或禁用解密邏輯。

優(yōu)先級注入:通過 addFirst 優(yōu)先注入解密后的配置,確保后續(xù) Bean 讀取時獲得明文。

異常安全:解密異常僅警告,保證啟動流程不受阻斷。

拓展建議

建議將 ENCRYPTED_KEYS 設(shè)計為項目可配置項,甚至支持通配符或注解形式,提高靈活性。

addFirst 保證解密后的配置覆蓋原加密內(nèi)容,確保業(yè)務讀取到明文。

3.2 通用解密工具類:EncryptionTool

支持多種主流加密算法,默認實現(xiàn) RSA 和 AES,使用 Base64 作為密鑰和密文的編碼方式。

public class EncryptionTool {

    private static final String RSA = "RSA";

    public static String decrypt(String key, String cipherText, String algorithm) throws Exception {
        if (RSA.equalsIgnoreCase(algorithm)) {
            return decryptByPrivateKey(cipherText, key);
        } else {
            SecretKey secretKey = decodeKey(key, algorithm);
            Cipher cipher = Cipher.getInstance(algorithm);
            cipher.init(Cipher.DECRYPT_MODE, secretKey);
            byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(cipherText));
            return new String(decrypted, StandardCharsets.UTF_8);
        }
    }

    private static String decryptByPrivateKey(String cipherText, String base64PrivateKey) throws Exception {
        byte[] keyBytes = Base64.getDecoder().decode(base64PrivateKey);
        PrivateKey privateKey = KeyFactory.getInstance(RSA).generatePrivate(new PKCS8EncodedKeySpec(keyBytes));
        Cipher cipher = Cipher.getInstance(RSA);
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(cipherText));
        return new String(decryptedBytes, StandardCharsets.UTF_8);
    }

    private static SecretKey decodeKey(String encodedKey, String algorithm) {
        byte[] decodedKey = Base64.getDecoder().decode(encodedKey);
        return new SecretKeySpec(decodedKey, algorithm);
    }
}

拓展建議

可實現(xiàn)更多算法,如 DESede(3DES)、ChaCha20,滿足不同安全合規(guī)需求。

對于性能敏感場景,可考慮解密緩存策略。

四、快速上手指南

4.1 依賴引入

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter</artifactId>
</dependency>

4.2 注冊 EnvironmentPostProcessor

1.在Spring Boot 項目的 resources 目錄下添加一個文件:

src/main/resources/META-INF/spring.factories

注意:路徑和文件名都必須完全正確!

2.文件內(nèi)容示例

org.springframework.boot.env.EnvironmentPostProcessor=\
com.example.config.DecryptionEnvironmentPostProcessor

com.example.config.DecryptionEnvironmentPostProcessor 替換成你自己的類的完整包名。

逗號分隔可以注冊多個 EnvironmentPostProcessor。

必須沒有拼寫錯誤,且類必須能被 Spring Boot classpath 加載。

3.示例項目結(jié)構(gòu)(最小可運行)

your-project/
├── src/
│   └── main/
│       ├── java/
│       │   └── com/example/config/
│       │       └── DecryptionEnvironmentPostProcessor.java
│       └── resources/
│           └── META-INF/
│               └── spring.factories
├── pom.xml

4.3 生成密鑰

算法說明工具示例
RSA生成一對公私鑰,私鑰需 PKCS#8 格式 Base64 編碼OpenSSL, Keytool
AES生成 128/256 位隨機密鑰,Base64 編碼OpenSSL, Java KeyGenerator

4.4 配置示例

spring:
  datasource:
    username: db_user
    password: ENC(rGA1bK3t...EncryptedText...)

config:
  decrypt:
    enabled: true

4.5 啟動注入密鑰

export DB_SECRET_KEY=$(cat /etc/secure/rsa_private_key.pem)
java -jar app.jar --spring.profiles.active=prod

五、安全最佳實踐

建議說明
專業(yè)密鑰管理使用 Vault、AWS KMS、Azure Key Vault 等專業(yè)平臺管理密鑰,杜絕硬編碼及磁盤持久化。
最小權(quán)限原則嚴格限制密鑰環(huán)境變量或文件權(quán)限,避免非授權(quán)訪問。
日志審計控制絕不在日志中輸出明文或解密結(jié)果,防止敏感信息泄露
定期密鑰輪換定期更新密鑰,縮短密鑰生命周期,降低風險。
分級加密策略針對不同環(huán)境/服務使用獨立密鑰,降低橫向攻擊風險

六、總結(jié)

借助本方案,可以實現(xiàn):

  • 配置文件零明文:徹底消除明文密碼泄露風險
  • 啟動自動解密:業(yè)務代碼無侵入,透明使用明文配置
  • 多算法靈活支持:滿足多場景安全合規(guī)需求
  • 開關(guān)靈活控制:方便多環(huán)境適配,快速切換
  • 安全規(guī)范完善:符合企業(yè)級安全管理最佳實踐

本方案不僅滿足高安全標準,還保持了 Spring Boot 配置體系的自然兼容與開發(fā)便利性。建議結(jié)合項目實際,進一步擴展支持密鑰動態(tài)更新、配置加密校驗等高級特性。

到此這篇關(guān)于SpringBoot中配置文件敏感信息加密解密的實現(xiàn)方案詳解的文章就介紹到這了,更多相關(guān)SpringBoot敏感信息加解密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解UDP協(xié)議格式及在java中的使用

    詳解UDP協(xié)議格式及在java中的使用

    這篇文章主要介紹了UDP協(xié)議格式及在java中的使用,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • Java實現(xiàn)將Doc/Docx格式的Word文檔轉(zhuǎn)換為PDF文件

    Java實現(xiàn)將Doc/Docx格式的Word文檔轉(zhuǎn)換為PDF文件

    這篇文章主要為大家詳細介紹了如何通過Java將Word文檔轉(zhuǎn)換為PDF、PDF/A和密碼保護的PDF文件,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下
    2025-08-08
  • springboot中thymeleaf模板使用詳解

    springboot中thymeleaf模板使用詳解

    這篇文章將更加全面詳細的介紹thymeleaf的使用。thymeleaf 是新一代的模板引擎,在spring4.0中推薦使用thymeleaf來做前端模版引擎。
    2017-05-05
  • Java使用FileInputStream流讀取文件示例詳解

    Java使用FileInputStream流讀取文件示例詳解

    這篇文章主要介紹了Java使用FileInputStream流讀取文件示例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Java中對象的創(chuàng)建和銷毀過程詳析

    Java中對象的創(chuàng)建和銷毀過程詳析

    這篇文章主要介紹了Java中對象的創(chuàng)建和銷毀過程,對象的創(chuàng)建過程包括類加載檢查、內(nèi)存分配、初始化零值內(nèi)存、設(shè)置對象頭和執(zhí)行init方法,對象的銷毀過程由垃圾回收機制負責,文中介紹的非常詳細,需要的朋友可以參考下
    2025-02-02
  • MyBatis/mybatis-plus項目打印SQL的方法實現(xiàn)

    MyBatis/mybatis-plus項目打印SQL的方法實現(xiàn)

    SpringBoot項目中,經(jīng)常需要打印SQL語句及其參數(shù),本文就來介紹一下MyBatis/mybatis-plus項目打印SQL的方法實現(xiàn),具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • 詳解java模板和回調(diào)機制

    詳解java模板和回調(diào)機制

    這篇文章主要為大家詳細介紹了java模板和回調(diào)機制,學習java模板,感興趣的朋友可以參考一下
    2016-03-03
  • Java讀取文本文件的各種方法

    Java讀取文本文件的各種方法

    這篇文章主要介紹了Java讀取文本文件的各種方法,在 Java 中有多種方法可以讀取純文本文件,例如你可以使用FileReader、BufferedReader或Scanner來讀取文本文件,感興趣的小伙伴和小編一起進入文章了解更多內(nèi)容吧,希望能幫助到大家
    2021-11-11
  • Spring boot創(chuàng)建自定義starter的完整步驟

    Spring boot創(chuàng)建自定義starter的完整步驟

    這篇文章主要給大家介紹了關(guān)于Spring boot創(chuàng)建自定義starter的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Spring boot具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-09-09
  • Spring注入方式與原理分析

    Spring注入方式與原理分析

    本文介紹了Spring框架中的依賴注入(DI)機制,包括基于XML和注解的依賴注入方式,如構(gòu)造器注入、setter注入和基于屬性(字段)注入,還討論了如何解決接口多實現(xiàn)類的注入問題,以及如何通過applicationContext手動獲取bean
    2026-05-05

最新評論

井冈山市| 行唐县| 石河子市| 绥化市| 沙雅县| 林甸县| 大埔县| 巴彦县| 远安县| 枞阳县| 安仁县| 通辽市| 布尔津县| 长泰县| 三江| 常宁市| 个旧市| 正蓝旗| 彭阳县| 宿松县| 清涧县| 栖霞市| 凌海市| 南涧| 汕头市| 云和县| 五华县| 宁河县| 澄城县| 古蔺县| 获嘉县| 江西省| 屯门区| 棋牌| 浏阳市| 洪泽县| 塘沽区| 教育| 德格县| 玛沁县| 河池市|