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

Spring?boot自定義加密解密數(shù)據(jù)庫連接配置示例代碼

 更新時間:2026年05月06日 08:16:33   作者:小瓦碼J碼  
在Spring Boot項(xiàng)目中,為了保護(hù)數(shù)據(jù)庫連接信息的安全,通常需要對敏感信息進(jìn)行加密,這篇文章主要介紹了Spring?boot自定義加密解密數(shù)據(jù)庫連接配置的相關(guān)資料,需要的朋友可以參考下

前言

大家在日常工作中是否有對配置加密的要求呢?

可能你一下子就會想到,Jasypt作為標(biāo)準(zhǔn)的解決方案。不過,你有沒有想過先手動搓一個呢?

本文我們先來看看,如何手動寫一個加密解密配置的機(jī)制。

需求描述

對配置文件中的數(shù)據(jù)庫連接配置,執(zhí)行加密。確保上傳到git倉庫的配置以密文形式存在。

密鑰不會寫到配置文件,可以通過命令行參數(shù)或者環(huán)境變量的方式注入。保證安全性。

方案原理是:手動實(shí)現(xiàn)配置加解密+自定義DataSource Bean完成解密。

本場景針對數(shù)據(jù)庫連接配置進(jìn)行加密解密。當(dāng)然,其他的加密配置項(xiàng)也適用。

準(zhǔn)備

  1. 數(shù)據(jù)庫實(shí)例,demo項(xiàng)目使用的是postgresql。
  2. 對稱加密工具類,可以實(shí)現(xiàn)加密解密。
  3. 自定義DataSource Bean配置類,在此配置類中實(shí)現(xiàn)對用戶名和密碼的解密后,再構(gòu)造DataSource對象。
/**
 * 自定義數(shù)據(jù)源配置類
 * 支持從命令行參數(shù)或環(huán)境變量讀取解密密鑰,解密數(shù)據(jù)庫用戶名和密碼后構(gòu)造 DataSource
 */
@Configuration
public class DataSourceSimpleConfig {

    private static final Logger logger = LoggerFactory.getLogger(DataSourceSimpleConfig.class);

    private static final String ENC_PREFIX = "{enc}";

    // 密鑰獲取優(yōu)先級:命令行參數(shù) > 環(huán)境變量
    @Value("${db.encrypt.key:#{systemEnvironment['ENCRYPT_KEY']}}")
    private String encryptKey;

    private final Environment environment;

    public DataSourceSimpleConfig(Environment environment) {
        this.environment = environment;
    }

    /**
     * 自定義 DataSource Bean
     * 解密數(shù)據(jù)庫配置后構(gòu)造 HikariDataSource
     */
    @Bean
    public DataSource dataSource() throws Exception {
        logger.info("========== 開始配置數(shù)據(jù)源 ==========");

        // 獲取原始配置
        String url = environment.getProperty("spring.datasource.url");
        String encryptedUsername = environment.getProperty("spring.datasource.username");
        String encryptedPassword = environment.getProperty("spring.datasource.password");
        String driverClassName = environment.getProperty("spring.datasource.driver-class-name");

        // 檢查是否需要解密
        String username;
        String password;

        if (encryptedUsername.startsWith(ENC_PREFIX)) {
            // 需要解密用戶名
            logger.info("檢測到加密的用戶名,開始解密...");
            String encryptedUser = encryptedUsername.substring(ENC_PREFIX.length());
            username = decrypt(encryptedUser, encryptKey);
            logger.info("用戶名解密成功");
        } else {
            username = encryptedUsername;
            logger.info("用戶名未加密,直接使用");
        }

        if (encryptedPassword.startsWith(ENC_PREFIX)) {
            // 需要解密密碼
            logger.info("檢測到加密的密碼,開始解密...");
            String encryptedPass = encryptedPassword.substring(ENC_PREFIX.length());
            password = decrypt(encryptedPass, encryptKey);
            logger.info("密碼解密成功");
        } else {
            password = encryptedPassword;
            logger.info("密碼未加密,直接使用");
        }

        // 創(chuàng)建 HikariConfig
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setJdbcUrl(url);
        hikariConfig.setUsername(username);
        hikariConfig.setPassword(password);
        
        if (driverClassName != null && !driverClassName.isEmpty()) {
            hikariConfig.setDriverClassName(driverClassName);
        }

        // 創(chuàng)建數(shù)據(jù)源
        HikariDataSource dataSource = new HikariDataSource(hikariConfig);
        
        logger.info("? 數(shù)據(jù)源配置完成");
        logger.info("   JDBC URL: {}", url);
        logger.info("========== 數(shù)據(jù)源配置完成 ==========");

        return dataSource;
    }

    /**
     * 解密方法
     *
     * @param encryptedText 加密文本(Base64 編碼)
     * @param key           解密密鑰(Base64 編碼)
     * @return 解密后的明文
     */
    private String decrypt(String encryptedText, String key) throws Exception {
        try {
            return AesUtil.decryptGCM(encryptedText, key);
        } catch (Exception e) {
            logger.error("? 解密失?。?, e);
            logger.error("   錯誤信息: {}", e.getMessage());
            throw new RuntimeException("解密失敗,請檢查密鑰是否正確", e);
        }
    }
}
  1. 準(zhǔn)備密鑰,可以隨便寫。密鑰通過環(huán)境變量配置。

步驟

  1. 首先創(chuàng)建空白項(xiàng)目,配置完數(shù)據(jù)庫連接后,啟動項(xiàng)目并確認(rèn)數(shù)據(jù)庫連接正常。
  2. 根據(jù)生成的密鑰,創(chuàng)建用戶名密碼的密文。并以特定的格式替換配置中原來的位置。
url: jdbc:postgresql://
username: "{enc}111111"
password: "{enc}222222"
  1. 添加上一節(jié)準(zhǔn)備好的 DataSourceSimpleConfig類。
  2. 在啟動配置中,添加密鑰環(huán)境變量配置 ENCRYPT_KEY="333333"
  3. 啟動測試,可以看到仍然實(shí)現(xiàn)了正常連接。并且,對用戶名和密碼的解密日志也打印出來了
========== 開始配置數(shù)據(jù)源 ==========
檢測到加密的用戶名,開始解密...
已獲取解密密鑰(長度 4)
用戶名解密成功
檢測到加密的密碼,開始解密...
已獲取解密密鑰(長度 4)
密碼解密成功

測試環(huán)境

  • JDK:17
  • Spring boot:4.0.6

版本僅供參考,無強(qiáng)制要求。

總結(jié)

怎么樣,是不是很簡單!

經(jīng)過這么一番改造,上傳到git中的只有加密后的字符串。密鑰獨(dú)立配置提升了安全性。

對于當(dāng)前示例這個方案足夠了。

但是,如果很多配置項(xiàng)都需要加密呢?這么一個一個寫,豈不是要累死?

解決方案就是拿數(shù)據(jù)庫當(dāng)配置中心來用,將配置存儲到數(shù)據(jù)庫里就能避免傳入git了。所以,本文首先拿數(shù)據(jù)庫連接加密來試水。

下篇,我們來探討,如何將數(shù)據(jù)庫作為配置中心來使用,并在啟動時自動加載數(shù)據(jù)庫配置,敬請期待!

到此這篇關(guān)于Spring boot自定義加密解密數(shù)據(jù)庫連接配置的文章就介紹到這了,更多相關(guān)Springboot配置加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java線程協(xié)調(diào)運(yùn)行操作實(shí)例詳解

    Java線程協(xié)調(diào)運(yùn)行操作實(shí)例詳解

    這篇文章主要介紹了Java線程協(xié)調(diào)運(yùn)行操作,結(jié)合具體實(shí)例形式詳細(xì)分析了Java線程協(xié)調(diào)運(yùn)行原理、實(shí)現(xiàn)方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2019-09-09
  • 使用springboot訪問圖片本地路徑并映射成url

    使用springboot訪問圖片本地路徑并映射成url

    這篇文章主要介紹了使用springboot訪問圖片本地路徑并映射成url的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Ubuntu 15下安裝Eclipse經(jīng)驗(yàn)分享

    Ubuntu 15下安裝Eclipse經(jīng)驗(yàn)分享

    這篇文章主要為大家分享了Ubuntu 15下安裝Eclipse經(jīng)驗(yàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • mybatis用攔截器實(shí)現(xiàn)字段加解密全過程

    mybatis用攔截器實(shí)現(xiàn)字段加解密全過程

    本文通過自定義注解和MyBatis攔截器實(shí)現(xiàn)敏感信息加密,處理Parameter和ResultSet,確保數(shù)據(jù)庫存儲安全且查詢結(jié)果解密可用
    2025-08-08
  • Java反轉(zhuǎn)鏈表測試過程介紹

    Java反轉(zhuǎn)鏈表測試過程介紹

    這篇文章主要介紹了Java反轉(zhuǎn)鏈表測試過程,學(xué)習(xí)過數(shù)據(jù)結(jié)構(gòu)的小伙伴們,對鏈表想來是并不陌生。本篇文章將為大家介紹幾種在Java語言當(dāng)中,實(shí)現(xiàn)鏈表反轉(zhuǎn)的幾種方法,以下是具體內(nèi)容
    2023-04-04
  • springboot自定義注解RateLimiter限流注解技術(shù)文檔詳解

    springboot自定義注解RateLimiter限流注解技術(shù)文檔詳解

    文章介紹了限流技術(shù)的概念、作用及實(shí)現(xiàn)方式,通過Spring AOP攔截方法、緩存存儲計(jì)數(shù)器,結(jié)合注解、枚舉、異常類等核心組件,實(shí)現(xiàn)對訪問頻率的控制,旨在防止攻擊、保障系統(tǒng)穩(wěn)定、提升用戶體驗(yàn)及節(jié)約成本
    2025-07-07
  • Java枚舉的使用方法詳解

    Java枚舉的使用方法詳解

    這篇文章主要介紹了 Java枚舉的使用方法詳解的相關(guān)資料,希望通過本文大家能掌握枚舉的使用方法,需要的朋友可以參考下
    2017-09-09
  • Spring?Bean創(chuàng)建的另一條捷徑

    Spring?Bean創(chuàng)建的另一條捷徑

    這篇文章主要為大家介紹了Spring?Bean創(chuàng)建的另一條方法捷徑詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • JavaWeb購物車項(xiàng)目開發(fā)實(shí)戰(zhàn)指南

    JavaWeb購物車項(xiàng)目開發(fā)實(shí)戰(zhàn)指南

    之前沒有接觸過購物車的東東,也不知道購物車應(yīng)該怎么做,所以在查詢了很多資料,總結(jié)一下購物車的功能實(shí)現(xiàn),下面這篇文章主要給大家介紹了關(guān)于JavaWeb購物車項(xiàng)目開發(fā)的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • Mybatis如何使用@Mapper和@MapperScan注解實(shí)現(xiàn)映射關(guān)系

    Mybatis如何使用@Mapper和@MapperScan注解實(shí)現(xiàn)映射關(guān)系

    這篇文章主要介紹了Mybatis使用@Mapper和@MapperScan注解實(shí)現(xiàn)映射關(guān)系,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評論

邵阳市| 嘉兴市| 连云港市| 彰化县| 名山县| 海淀区| 十堰市| 蒲江县| 子长县| 阳原县| 灯塔市| 仪征市| 开化县| 五莲县| 新郑市| 沁源县| 迁西县| 湾仔区| 沂南县| 合阳县| 昌宁县| 开江县| 钟山县| 南平市| 洮南市| 武强县| 临夏县| 仁寿县| 平果县| 宁都县| 昌江| 剑川县| 孟州市| 新民市| 西乡县| 恩施市| 即墨市| 乐东| 太谷县| 都江堰市| 新营市|