成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

太強(qiáng)了!Spring Boot 配置參數(shù)名可控、值加密可查,全鏈路守護(hù)配置安全

開發(fā) 前端
不少企業(yè)上線前對(duì)配置文件有嚴(yán)格審查規(guī)則:禁止出現(xiàn)?username、password?等敏感字段名,更不能出現(xiàn)明文密碼。

不少企業(yè)上線前對(duì)配置文件有嚴(yán)格審查規(guī)則:禁止出現(xiàn) usernamepassword 等敏感字段名,更不能出現(xiàn)明文密碼。這種規(guī)則雖然出發(fā)點(diǎn)是安全,但卻給開發(fā)帶來了不少困擾:

  • 字段名被屏蔽,程序無法讀取
  • 值不能加密,容易泄漏
  • 改配置影響啟動(dòng),難以排查

如何兼顧審查要求、代碼規(guī)范與安全性?本文提供一種優(yōu)雅高效的解決方案:

自定義字段名 + 值使用國(guó)密 SM4 加密 + 啟動(dòng)監(jiān)聽器解密還原

 項(xiàng)目結(jié)構(gòu)

/src
 └── main
     ├── java
     │    └── com
     │         └── icoderoad
     │              ├── listener            # 啟動(dòng)解密監(jiān)聽器
     │              ├── utils               # 加解密工具(SM4)
     │              └── Application.java    # 主啟動(dòng)類
     └── resources
          └── application.properties        # 自定義字段 + 加密值

示例配置(字段脫敏 + SM4 加密值)

原始配置(上線不允許)

spring.datasource.url=jdbc:mysql://localhost:3306/study2
spring.datasource.username=root
spring.datasource.password=root

安全配置(字段名脫敏 + 值加密)

spring.datasource.dbu=lUMr5GMPQUghyqRZpH8U3rfWcWoOFl2F1lmuX9u2tNc=
spring.datasource.usr=gAvu3DuUOecT43AjtA1Rmw==
spring.datasource.pwd=gAvu3DuUOecT43AjtA1Rmw==

解密后示例值

  • URL:jdbc:mysql://localhost:3306/study2
  • 用戶名/密碼:root

上述密文通過 SM4 加密生成(工具類示例見下方)

SM4 加解密工具類(國(guó)密算法)

國(guó)密算法采用 BouncyCastle 實(shí)現(xiàn),確保兼容性與安全性。

引入依賴(Maven)

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.70</version>
</dependency>

工具類實(shí)現(xiàn)

// com/icoderoad/utils/Sm4Util.java
package com.icoderoad.utils;


import org.bouncycastle.crypto.CryptoException;
import org.bouncycastle.crypto.engines.SM4Engine;
import org.bouncycastle.crypto.modes.ECBBlockCipher;
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;
import org.bouncycastle.crypto.paddings.PKCS7Padding;
import org.bouncycastle.crypto.params.KeyParameter;


import java.nio.charset.StandardCharsets;
import java.util.Base64;


public class Sm4Util {


    private static final String DEFAULT_KEY = "1234567890abcdef"; // 16字節(jié)國(guó)密Key


    public static String encrypt(String plainText) throws Exception {
        return encrypt(plainText, DEFAULT_KEY);
    }


    public static String decrypt(String cipherText) throws Exception {
        return decrypt(cipherText, DEFAULT_KEY);
    }


    public static String encrypt(String plainText, String key) throws Exception {
        PaddedBufferedBlockCipher cipher = createCipher(true, key.getBytes(StandardCharsets.UTF_8));
        byte[] input = plainText.getBytes(StandardCharsets.UTF_8);
        byte[] output = new byte[cipher.getOutputSize(input.length)];
        int len = cipher.processBytes(input, 0, input.length, output, 0);
        len += cipher.doFinal(output, len);
        byte[] encrypted = new byte[len];
        System.arraycopy(output, 0, encrypted, 0, len);
        return Base64.getEncoder().encodeToString(encrypted);
    }


    public static String decrypt(String base64Cipher, String key) throws Exception {
        byte[] input = Base64.getDecoder().decode(base64Cipher);
        PaddedBufferedBlockCipher cipher = createCipher(false, key.getBytes(StandardCharsets.UTF_8));
        byte[] output = new byte[cipher.getOutputSize(input.length)];
        int len = cipher.processBytes(input, 0, input.length, output, 0);
        len += cipher.doFinal(output, len);
        byte[] decrypted = new byte[len];
        System.arraycopy(output, 0, decrypted, 0, len);
        return new String(decrypted, StandardCharsets.UTF_8);
    }


    private static PaddedBufferedBlockCipher createCipher(boolean forEncryption, byte[] key) {
        SM4Engine engine = new SM4Engine();
        PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new ECBBlockCipher(engine), new PKCS7Padding());
        cipher.init(forEncryption, new KeyParameter(key));
        return cipher;
    }


    public static void main(String[] args) throws Exception {
        String url = "jdbc:mysql://localhost:3306/study2";
        String encryptedUrl = encrypt(url);
        System.out.println("Encrypted URL: " + encryptedUrl);
        System.out.println("Decrypted: " + decrypt(encryptedUrl));


        String user = "root";
        System.out.println("Encrypted user: " + encrypt(user));
    }
}

啟動(dòng)監(jiān)聽器還原明文配置項(xiàng)

// com/icoderoad/listener/EnvironmentDecryptListener.java
package com.icoderoad.listener;


import com.icoderoad.utils.Sm4Util;
import org.springframework.boot.context.event.ApplicationEnvironmentPreparedEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.core.env.ConfigurableEnvironment;


public class EnvironmentDecryptListener implements ApplicationListener<ApplicationEnvironmentPreparedEvent> {


    @Override
    public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
        ConfigurableEnvironment env = event.getEnvironment();
        try {
            String url = env.getProperty("spring.datasource.dbu");
            String usr = env.getProperty("spring.datasource.usr");
            String pwd = env.getProperty("spring.datasource.pwd");


            System.setProperty("spring.datasource.url", Sm4Util.decrypt(url));
            System.setProperty("spring.datasource.username", Sm4Util.decrypt(usr));
            System.setProperty("spring.datasource.password", Sm4Util.decrypt(pwd));
        } catch (Exception e) {
            System.err.println("配置解密失敗: " + e.getMessage());
        }
    }
}

啟動(dòng)類注冊(cè)監(jiān)聽器

// com/icoderoad/Application.java
package com.icoderoad;


import com.icoderoad.listener.EnvironmentDecryptListener;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;


@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class)
                .listeners(new EnvironmentDecryptListener())
                .run(args);
    }
}

結(jié)語:一站式配置安全守護(hù)方案

通過以上實(shí)戰(zhàn)方案,我們實(shí)現(xiàn)了配置安全的三重防護(hù):

  1. 字段名自定義:繞過審查敏感關(guān)鍵字
  2. 值加密保護(hù):使用國(guó)密 SM4 算法替代常見 AES,更符合監(jiān)管要求
  3. 啟動(dòng)自動(dòng)還原:無侵入式接入 Spring Boot 項(xiàng)目

此方案不僅適用于數(shù)據(jù)源連接,還可擴(kuò)展用于 Redis、MQ、API Token 等敏感配置項(xiàng)的保護(hù)。

建議將加密工具提取為開發(fā)工具類,加密后再錄入配置文件,運(yùn)行階段解密即可,無需人工干預(yù)。

責(zé)任編輯:武曉燕 來源: 路條編程
相關(guān)推薦

2025-01-13 13:47:13

2025-03-26 08:28:36

2025-05-14 01:00:00

Spring工具工廠類

2025-01-22 14:02:35

2022-06-06 12:18:44

配置可視化Nginx

2024-12-16 13:34:35

2025-04-10 00:25:00

Spring@JsonView注解

2025-03-04 08:53:10

2025-04-08 01:00:00

Spring開發(fā)系統(tǒng)

2025-04-02 04:55:00

2023-01-30 22:34:44

Node.js前端

2022-05-30 16:31:08

CSS

2025-02-08 08:00:00

JavaDeepSeekIDEA

2024-01-05 00:29:36

全鏈路灰度發(fā)布云原生

2025-04-29 07:44:26

配置校驗(yàn)機(jī)制

2018-05-30 15:10:24

Spring BootList類型

2021-03-04 09:31:42

開源技術(shù) 項(xiàng)目

2025-02-13 07:45:26

APISpringHTTP

2023-11-13 10:41:44

Spring微服務(wù)

2023-10-16 23:43:52

云原生可觀測(cè)性
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久综合爱 | 国产com | 亚洲欧美日韩一区 | 黄频在线观看 | 综合一区二区三区 | 天天射天天 | 国产精品一区二区在线免费观看 | 国产福利精品视频 | 久视频在线 | 日韩精品黄 | 欧美一区二区免费 | 中文字幕在线观看日本 | 可以在线观看的av | 欧美另类激情 | av不卡在线观看 | 天天射天天干天天操 | 四虎久久久 | 日韩三级大片 | 免费一级片| 午夜精品视频 | 欧美一区二区三 | 亚洲精品91| 日韩精品免费观看 | 91麻豆产精品久久久久久夏晴子 | 中文字幕在线网站 | 91成人看片| 国产无遮挡又黄又爽免费网站 | 国产欧美日韩一区二区三区 | 国产免费一级 | 中文字幕免费看 | 黄色三级在线 | 日韩午夜在线 | 国产成人99久久亚洲综合精品 | 97精品国产露脸对白 | 99国产免费 | av片网站 | 精品在线看 | 四虎影院成人 | av观看免费 | 在线播放日韩 | 久久免费看视频 |