国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Springboot+dynamic-datasource+Druid數(shù)據(jù)庫(kù)配置加密

這篇具有很好參考價(jià)值的文章主要介紹了Springboot+dynamic-datasource+Druid數(shù)據(jù)庫(kù)配置加密。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

Springboot+mybatis-plus+dynamic-datasource+Druid數(shù)據(jù)庫(kù)配置加密

0.前言

背景
生產(chǎn)環(huán)境中, 為了保密,我們希望將數(shù)據(jù)庫(kù)密碼加密, 甚至用戶名和jdbc連接串加密。本章我們使用由苞米豆(baomidou)團(tuán)隊(duì)開(kāi)發(fā)的dynamic-datasource多數(shù)據(jù)源組件自帶的加密工具實(shí)現(xiàn)數(shù)據(jù)庫(kù)配置加密
dynamic.datasource特俗字符,Mybatis-Plus進(jìn)階系列,數(shù)據(jù)庫(kù),spring boot,mybatis,安全,后端

1. 動(dòng)態(tài)添加移除數(shù)據(jù)源

dynamic-datasource-starter官方給的特性說(shuō)明中,我們可以看到 dynamic-datasource-starter 支持?jǐn)?shù)據(jù)庫(kù)敏感配置信息 加密(可自定義) ENC()。,所以我們擼一下源碼看看到底怎么實(shí)現(xiàn)的。
經(jīng)過(guò)查看源碼發(fā)現(xiàn), 該框架使用自帶的加密工具類(lèi)com.baomidou.dynamic.datasource.toolkit.CryptoUtils進(jìn)行加解密, 且自帶有公鑰私鑰。但是源碼咋看都覺(jué)得眼熟,而且注釋是@author alibaba,翻看druid 的加密方法 com.alibaba.druid.filter.config.ConfigTools 。原來(lái)作者直接借鑒了Druid加密方法,之前看druid 的加密的時(shí)候發(fā)現(xiàn)公鑰和私鑰的使用反了,wenshao給的解釋是歷史原因。歷史背景和源碼咱們就聊到這,所以直接使用此工具類(lèi)加密我們的明文密碼, 然后用ENC()包裹即可實(shí)現(xiàn)加解密。
dynamic.datasource特俗字符,Mybatis-Plus進(jìn)階系列,數(shù)據(jù)庫(kù),spring boot,mybatis,安全,后端

2.基礎(chǔ)介紹

在使用 Spring Boot、MyBatis-Plus、 Druid 進(jìn)行數(shù)據(jù)庫(kù)配置時(shí),如果需要對(duì)敏感配置信息進(jìn)行加密,可以通過(guò)以下方式實(shí)現(xiàn):

  1. 使用加密算法對(duì)敏感信息進(jìn)行加密,如數(shù)據(jù)庫(kù)的用戶名、密碼等信息??梢赃x擇對(duì)稱加密算法(如AES)或非對(duì)稱加密算法(如RSA)進(jìn)行加密。
  2. 將加密后的敏感信息保存在安全的位置,如配置文件或系統(tǒng)環(huán)境變量。
  3. 在應(yīng)用啟動(dòng)時(shí),通過(guò)配置文件或環(huán)境變量讀取加密后的敏感信息。
  4. 在配置動(dòng)態(tài)數(shù)據(jù)源時(shí),使用解密的敏感信息進(jìn)行數(shù)據(jù)庫(kù)配置。

這是基本的思路,本章我們不造輪子,直接使用國(guó)產(chǎn)優(yōu)秀框架baomidou團(tuán)隊(duì)的工具 dynamic-datasource多數(shù)據(jù)源組件自帶的加密工具實(shí)現(xiàn)數(shù)據(jù)庫(kù)配置加密

3. 使用步驟示例

簡(jiǎn)單方式,使用默認(rèn)的加密

1. 使用下面 工具類(lèi)輸出,加密后的密碼

import com.baomidou.dynamic.datasource.toolkit.CryptoUtils;
public class DBCryptoUtils extends CryptoUtils{

        // 第一種方式 使用默認(rèn)key 加密解密
        public static void test1( ) throws Exception {
            System.out.println("-------------------------------------默認(rèn)加密-------------------------------------");
            String password = "abc123";
            String encodePassword = CryptoUtils.encrypt(password);
            System.out.println("加密后密碼:"+CryptoUtils.encrypt(password));
        }
        // 第二種方式 使用自定義key,強(qiáng)烈建議
        public static void test2( ) throws Exception {
            System.out.println("-------------------------------------自定義key-------------------------------------");
            String[] pair = CryptoUtils.genKeyPair(512);
            System.out.println("privateKey:  " + pair[0]);
            System.out.println("publicKey:  " + pair[1]);
             // 按道理應(yīng)該用公鑰加密,私鑰解密,作者直接抄的druid 的,把這個(gè)不規(guī)范的寫(xiě)法也給抄過(guò)來(lái)了,不影響效果,只覺(jué)得怪怪的。
            System.out.println("加密后密碼:  " + CryptoUtils.encrypt(pair[0], "abc123"));
        }

        public static void main(String[] args) throws Exception {
            test1();
            test2();
        }
}

dynamic.datasource特俗字符,Mybatis-Plus進(jìn)階系列,數(shù)據(jù)庫(kù),spring boot,mybatis,安全,后端

1. 將上面加密后的密碼配置到配置文件中

如果使用的默認(rèn)key,即上面生成加密后密碼的第一種,則使用下面方式配置
spring:
  datasource:
    dynamic:
     #有默認(rèn)值可以不配置,強(qiáng)烈建議更換
      public-key: 
      datasource:
        master:
          url: DB地址
          username: 用戶名
          #配置加密后的密碼
          password: ENC(Ue9QTmtvOX8XMdRIZVqUAbmbLNfAjQQO9jokfVEfaew+HFGZPndSmcq2pOTS2xuC7Pg/z1gUGS82HOmWw0d9Cw==)  
          driver-class-name: com.mysql.jdbc.Driver# 驅(qū)動(dòng)保持jdbc url一致
          public-key: #在多數(shù)據(jù)源下每個(gè)數(shù)據(jù)源可以獨(dú)立設(shè)置,沒(méi)有就繼承上面的。
如果使用的自定義的key,即上面既生成publicKey和privateKey 以及加密后密碼的第2種方式,則使用下面方式配置
spring:
  datasource:
    dynamic:
     # 配置上面輸出的 public key
      public-key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJirfs9pc4fsDdXqjMto4zY+sYZ7d/XYwIQIYqj2FoqxvVC61tjKtG12nMSlwgXbV+DNpWh9W76QjM2XCNYB6VUCAwEAAQ==
      datasource:
        master:
          url: DB地址
          username: 用戶名
          #配置加密后的密碼 根據(jù)上面生成的秘鑰,加密后的密碼
          password: ENC(BSbigK5YuTXLOUDekSm3uU+h/n2/rIwa4DxQWPbfuhf9irwoakQy777AYHqJVz/WEG5BTFp4Ym+lguH3o+f4kQ==)  
          driver-class-name: com.mysql.jdbc.Driver# 驅(qū)動(dòng)保持jdbc url一致
          public-key: #在多數(shù)據(jù)源下每個(gè)數(shù)據(jù)源可以獨(dú)立設(shè)置,沒(méi)有就繼承上面的。

到這兒基本上就OK了,如果想知道源碼是怎么執(zhí)行的可以繼續(xù)向下看

4. 官方源碼分析

5.1. 解密的核心源碼

我們先來(lái)看EncDataSourceInitEvent 源碼.我們可以看到EncDataSourceInitEvent類(lèi),實(shí)現(xiàn)了DataSourceInitEvent接口。該類(lèi)用于在數(shù)據(jù)源初始化之前對(duì)數(shù)據(jù)源屬性進(jìn)行解密操作。

/**
 * 多數(shù)據(jù)源默認(rèn)解密事件
 *
 * @author TaoYu
 */
@Slf4j
public class EncDataSourceInitEvent implements DataSourceInitEvent {

    /**
     * 加密正則
     */
    private static final Pattern ENC_PATTERN = Pattern.compile("^ENC\\((.*)\\)$");

    @Override
    public void beforeCreate(DataSourceProperty dataSourceProperty) {
        String publicKey = dataSourceProperty.getPublicKey();
        if (StringUtils.hasText(publicKey)) {
            dataSourceProperty.setUrl(decrypt(publicKey, dataSourceProperty.getUrl()));
            dataSourceProperty.setUsername(decrypt(publicKey, dataSourceProperty.getUsername()));
            dataSourceProperty.setPassword(decrypt(publicKey, dataSourceProperty.getPassword()));
        }
    }

    @Override
    public void afterCreate(DataSource dataSource) {

    }

    /**
     * 字符串解密
     */
    private String decrypt(String publicKey, String cipherText) {
        if (StringUtils.hasText(cipherText)) {
            Matcher matcher = ENC_PATTERN.matcher(cipherText);
            if (matcher.find()) {
                try {
                    return CryptoUtils.decrypt(publicKey, matcher.group(1));
                } catch (Exception e) {
                    log.error("DynamicDataSourceProperties.decrypt error ", e);
                }
            }
        }
        return cipherText;
    }
}

DataSourceInitEvent 接口 又是干什么用的呢,我們點(diǎn)進(jìn)去可以看到
dynamic.datasource特俗字符,Mybatis-Plus進(jìn)階系列,數(shù)據(jù)庫(kù),spring boot,mybatis,安全,后端

DataSourceInitEvent是 baomidou的dynamic.datasource組件 位于com.baomidou.dynamic.datasource.event包下定義的一個(gè)鉤子接口,在創(chuàng)建連接池前和后可以搞事情。

  1. 該接口定義了兩個(gè)方法:beforeCreateafterCreate,用于在連接池創(chuàng)建前后執(zhí)行一些操作。
  2. beforeCreate方法接受一個(gè)DataSourceProperty參數(shù),用于傳遞數(shù)據(jù)源的基本信息。
  3. afterCreate方法接受一個(gè)DataSource參數(shù),表示已創(chuàng)建的連接池對(duì)象。

總之,這段代碼是一個(gè)事件接口,用于在多數(shù)據(jù)源連接池創(chuàng)建過(guò)程中執(zhí)行一些自定義操作。
讓我們逐行解析代碼的功能:

  1. 定義了一個(gè)名為ENC_PATTERN的正則表達(dá)式模式,用于匹配加密字符串的格式。

  2. 實(shí)現(xiàn)了beforeCreate方法,該方法在數(shù)據(jù)源創(chuàng)建之前調(diào)用。它接收一個(gè)DataSourceProperty對(duì)象作為參數(shù),表示數(shù)據(jù)源的屬性。

  3. beforeCreate方法中,首先獲取數(shù)據(jù)源屬性中的公鑰(publicKey)。如果公鑰存在,表示需要進(jìn)行解密操作。

  4. 接下來(lái),使用公鑰對(duì)數(shù)據(jù)源的URL、用戶名和密碼進(jìn)行解密操作。調(diào)用decrypt方法對(duì)這些屬性進(jìn)行解密,并將解密后的值設(shè)置回dataSourceProperty對(duì)象中。

  5. 實(shí)現(xiàn)了afterCreate方法,該方法在數(shù)據(jù)源創(chuàng)建之后調(diào)用。在該方法中可以執(zhí)行一些額外的操作,但是該方法在給定的代碼中沒(méi)有實(shí)現(xiàn)任何邏輯。

  6. 定義了一個(gè)私有方法decrypt,用于對(duì)加密字符串進(jìn)行解密。該方法接收公鑰和密文作為參數(shù),并返回解密后的明文字符串。

  7. decrypt方法中,首先判斷密文是否符合加密格式(通過(guò)ENC_PATTERN進(jìn)行匹配)。如果匹配成功,就使用給定的公鑰和密文調(diào)用CryptoUtils.decrypt方法進(jìn)行解密操作。

總結(jié)起來(lái),EncDataSourceInitEvent類(lèi)實(shí)現(xiàn)了DataSourceInitEvent接口,用于在數(shù)據(jù)源初始化之前對(duì)數(shù)據(jù)源屬性進(jìn)行解密操作。它通過(guò)正則表達(dá)式匹配加密字符串的格式,并使用給定的公鑰對(duì)密文進(jìn)行解密。解密后的明文值將用于設(shè)置數(shù)據(jù)源的URL、用戶名和密碼屬性。

5.2. 自定義解密

到這兒我們可能,已經(jīng)知道怎么自定義解密,無(wú)外乎就是實(shí)現(xiàn)DataSourceInitEvent 接口的beforeCreate方法然后自定義處理。但是我們自定義的這個(gè)實(shí)現(xiàn)類(lèi)和官方默認(rèn)的解密實(shí)現(xiàn)類(lèi)優(yōu)先級(jí)怎么搞呢,其實(shí)官方在DynamicDataSourceAutoConfiguration配置類(lèi)中已經(jīng)使用了@condition條件注解。滿足優(yōu)先使用我們自定義的加密的實(shí)現(xiàn)類(lèi)了。我們只需要交給Spring 容器就OK.
dynamic.datasource特俗字符,Mybatis-Plus進(jìn)階系列,數(shù)據(jù)庫(kù),spring boot,mybatis,安全,后端

dynamic.datasource特俗字符,Mybatis-Plus進(jìn)階系列,數(shù)據(jù)庫(kù),spring boot,mybatis,安全,后端文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-763086.html

/**
 * 自定義多數(shù)據(jù)源默認(rèn)解密事件
 */
@Slf4j
@Configuration
public class CustomeEncDataSourceInitEvent implements DataSourceInitEvent {

    /**
     * 加密正則 實(shí)現(xiàn)自定義的 例如BCC
     */
    private static final Pattern ENC_PATTERN = Pattern.compile("^BCC\\((.*)\\)$");

    @Override
    public void beforeCreate(DataSourceProperty dataSourceProperty) {
    	// TODO 實(shí)現(xiàn)自定義的解密
        String publicKey = dataSourceProperty.getPublicKey();
        if (StringUtils.hasText(publicKey)) {
            dataSourceProperty.setUrl(decrypt(publicKey, dataSourceProperty.getUrl()));
            dataSourceProperty.setUsername(decrypt(publicKey, dataSourceProperty.getUsername()));
            dataSourceProperty.setPassword(decrypt(publicKey, dataSourceProperty.getPassword()));
        }
    }

    @Override
    public void afterCreate(DataSource dataSource) {

    }

    /**
     * 字符串解密
     */
    private String decrypt(String publicKey, String cipherText) {
        if (StringUtils.hasText(cipherText)) {
            Matcher matcher = ENC_PATTERN.matcher(cipherText);
            if (matcher.find()) {
                try {
                    return CryptoUtils.decrypt(publicKey, matcher.group(1));
                } catch (Exception e) {
                    log.error("DynamicDataSourceProperties.decrypt error ", e);
                }
            }
        }
        return cipherText;
    }
}

5. 參考資料

  1. dynamic-datasource GitHub 倉(cāng)庫(kù) ↗:dynamic-datasource 的官方 GitHub 倉(cāng)庫(kù),包含源代碼、文檔和示例等資源。

到了這里,關(guān)于Springboot+dynamic-datasource+Druid數(shù)據(jù)庫(kù)配置加密的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • SpringBoot+dynamic-datasource實(shí)現(xiàn)多數(shù)據(jù)源(msyql、sqlserver、postgresql)手動(dòng)切換

    SpringBoot+dynamic-datasource實(shí)現(xiàn)多數(shù)據(jù)源(msyql、sqlserver、postgresql)手動(dòng)切換

    SpringBoot+MybatisPlus+dynamic-datasources實(shí)現(xiàn)連接Postgresql和mysql多數(shù)據(jù)源: SpringBoot+MybatisPlus+dynamic-datasources實(shí)現(xiàn)連接Postgresql和mysql多數(shù)據(jù)源-CSDN博客 上面實(shí)現(xiàn)通過(guò)注解和配置文件的方式去進(jìn)行多數(shù)據(jù)源操作。 如果業(yè)務(wù)需求,比如查詢第三方接口時(shí)提供的是sqlserver的視圖連接方式時(shí),

    2024年01月20日
    瀏覽(27)
  • SpringBoot+MybatisPlus+dynamic-datasources實(shí)現(xiàn)連接Postgresql和mysql多數(shù)據(jù)源

    SpringBoot+MybatisPlus+dynamic-datasources實(shí)現(xiàn)連接Postgresql和mysql多數(shù)據(jù)源

    dynamic-datasource-spring-boot-starter實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源Mysql和Sqlserver: dynamic-datasource-spring-boot-starter實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)源Mysql和Sqlserver_dynamic-datasource-spring-boot-starter mysql sqlse-CSDN博客 SpringBoot中整合MybatisPlus快速實(shí)現(xiàn)Mysql增刪改查和條件構(gòu)造器: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/13

    2024年01月21日
    瀏覽(31)
  • Dynamic DataSource 多數(shù)據(jù)源配置【 Springboot + DataSource + MyBatis Plus + Druid】

    Dynamic DataSource 多數(shù)據(jù)源配置【 Springboot + DataSource + MyBatis Plus + Druid】

    MybatisPlus多數(shù)據(jù)源配置主要解決的是多數(shù)據(jù)庫(kù)連接和切換的問(wèn)題。在一些大型應(yīng)用中,由于數(shù)據(jù)量的增長(zhǎng)或者業(yè)務(wù)模塊的增多,可能需要訪問(wèn)多個(gè)數(shù)據(jù)庫(kù)。這時(shí),就需要配置多個(gè)數(shù)據(jù)源。 2.1.1、引用依賴 2.1.2、application.yml 配置 2.1.3、通用配置類(lèi) 2.1.4、使用方式 這里便不過(guò)多的

    2024年02月03日
    瀏覽(32)
  • 【源碼解析】多數(shù)據(jù)源 dynamic-datasource快速入門(mén)及源碼解析

    【源碼解析】多數(shù)據(jù)源 dynamic-datasource快速入門(mén)及源碼解析

    啟動(dòng)的時(shí)候,會(huì)加載在 dynamic-datasource-spring-boot-starter 的jar包中的 spring.factories 在 DynamicDataSourceAutoConfiguration 會(huì)注入 DynamicRoutingDataSource DynamicRoutingDataSource#afterPropertiesSet ,系統(tǒng)啟動(dòng)的時(shí)候會(huì)加載所有的數(shù)據(jù)源 在 DynamicDataSourceAutoConfiguration 會(huì)注入 DynamicDataSourceProvider AbstractData

    2023年04月21日
    瀏覽(21)
  • dynamic-datasource can not find primary datasource

    dynamic-datasource can not find primary datasource

    動(dòng)態(tài)數(shù)據(jù)源找不到主數(shù)據(jù)源 可能導(dǎo)入多數(shù)據(jù)源依賴導(dǎo)致 把依賴注釋 運(yùn)行成功

    2024年02月08日
    瀏覽(19)
  • dynamic-datasource Please check the setting of primary解決方案

    dynamic-datasource Please check the setting of primary解決方案

    報(bào)這個(gè)錯(cuò)的原因是數(shù)據(jù)庫(kù)使用多數(shù)據(jù)源沒(méi)有指定主數(shù)據(jù)源導(dǎo)致的錯(cuò)誤。 ?解決方法如圖所示,通過(guò)配置指定dynamic的primary指定主數(shù)據(jù)庫(kù)的配置 切記箭頭兩處的名稱一樣

    2024年02月13日
    瀏覽(33)
  • spring boot mybatis-plus dynamic-datasource 配置文件 相關(guān)依賴環(huán)境配置

    spring boot mybatis-plus dynamic-datasource 配置文件 相關(guān)依賴環(huán)境配置

    spring boot mybatis-plus dynamic-datasource 配置文件 相關(guān)依賴環(huán)境配置 ##yaml配置 ##父級(jí)pom.xml配置 ##子模塊pom.xml配置 ##表結(jié)構(gòu) ##Test.java ##TestMapper.xml ##TestMapper.java ##TestService.java ##TestController ##項(xiàng)目啟動(dòng)類(lèi)BootStrap.java ##瀏覽器訪問(wèn) 192.168.3.188:8866/yym/test/v1/test

    2024年02月02日
    瀏覽(32)
  • 使用mybatis和dynamic-datasource-spring-boot-starter動(dòng)態(tài)切換數(shù)據(jù)源操作數(shù)據(jù)庫(kù)

    記錄 :415 場(chǎng)景 :使用mybatis和dynamic-datasource-spring-boot-starter動(dòng)態(tài)切換數(shù)據(jù)源操作數(shù)據(jù)庫(kù)。 版本 :JDK 1.8,Spring?Boot 2.6.3,dynamic-datasource-spring-boot-starter-3.3.2,mybatis-3.5.9。 源碼 :https://github.com/baomidou/dynamic-datasource-spring-boot-starter dynamic-datasource-spring-boot-starter :一個(gè)基于springboot的快

    2023年04月19日
    瀏覽(23)
  • 使用dynamic-datasource-spring-boot-starter動(dòng)態(tài)切換數(shù)據(jù)源操作數(shù)據(jù)庫(kù)(MyBatis-3.5.9)

    記錄 :383 場(chǎng)景 :使用dynamic-datasource-spring-boot-starter動(dòng)態(tài)切換數(shù)據(jù)源,使用MyBatis操作數(shù)據(jù)庫(kù)。提供三種示例:一,使用@DS注解作用到類(lèi)上。二,使用@DS注解作用到方法上。三,不使用注解,使用DynamicDataSourceContextHolder類(lèi)在方法內(nèi)靈活切換不同數(shù)據(jù)源。 源碼: https://github.com/

    2024年01月20日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包