springboot 數據庫配置信息加密處理


1.情景展示

在項目開發過程中,為了便於對數據庫進行管理,我們通常會將數據庫相關配置放到配置文件當中;例如:

由於這里實際配置的就是用戶名和密碼等信息,具有安全隱患,如果在實際部署web項目時,項目部署地址不是在本公司的話,那別的人員就能通過部署路徑找到項目,進而找到數據庫地址,用戶名,密碼信息,他們就可以通過這台服務器去直接連數據庫,這樣數據庫的數據將不再具有隱蔽性,將會導致信息泄露。

如何解決這個問題?

2.原因分析

可通過jasypt,大致過程就是:在項目加載配置文件的加密信息時,jasypt會對加密信息進行解密。

在初始化數據源時,優先執行解密代碼;

所用算法:PBEWithMD5AndDES;

鹽生成器類名:org.jasypt.salt.RandomSaltGenerator;

看這架勢,可以通過配置jasyptStringEncryptor類,來對加密算法等進行自定義管理(有興趣可以試下,我沒進行)。

3.解決方案

本文將以數據庫的連接地址、用戶名和密碼的加密為例進行介紹。

第一步:導包;

<dependency>
        <groupId>com.github.ulisesbocchio</groupId>
        <artifactId>jasypt-spring-boot-starter</artifactId>
        <version>2.1.0</version>
</dependency>

將其添加到pom.xml文件當中。

第二步:配置加/解的密碼;

# jasypt加密的密匙
jasypt:
  encryptor:
    password: Y6M9fAJQdU7jNp5MW

將其添加到application.xml文件當中。

第三步:根據明文生成密文;

由於需要用到StringEncryptor.java,我以為它是一個實體類,沒想到它是一個接口。

錯誤示例:

它只能在項目啟動后,才知道最終需要調用的是哪個加密工具類。

正確示例:

查看代碼
import org.jasypt.encryption.StringEncryptor;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;

/**
 * 數據庫加密測試類
 * @description:
 * @author: Marydon
 * @date: 2022-01-07 16:35
 * @version: 1.0
 * @email: marydon20170307@163.com
 */
@SpringBootTest
public class DataBaseEncryptorTest {
    @Resource
    private StringEncryptor encryptor;

    @Test
    public void getPass() {
        String url_clear_text = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai";
        String url_cipher_text = encryptor.encrypt(url_clear_text);
        String name_clear_text = "root";
        String name_cipher_text = encryptor.encrypt(name_clear_text);
        String password_clear_text = "123456";
        String password_cipher_text = encryptor.encrypt(password_clear_text);
        System.out.println("-------------------輸出加密結果-------------------");
        System.out.println("database url: " + url_cipher_text);
        System.out.println("database name: " + name_cipher_text);
        System.out.println("database password: " + password_cipher_text);
    }

}

新建一個java類型,將上述代碼復制進去即可; 

運行該類,等待執行結果即可。

 

這樣,要想獲得密文,只需將按照這一步操作即可;

同樣地,如果我們哪天想要知道明文信息,就可以通過這種方式進行解密。

第四步:將加密后的字符串替換原明文。

注意: 上面的 ENC(密文) 是固定寫法,這樣,jasypt才會進行解密。

4.擴展

我們可以看到,上面那種方式,雖然數據庫的配置使用了密文,但是,還是不夠安全,因為我們把解密密碼暴露在了application.yml文件當中,如果規避這種問題呢?

JAR包部署

為了防止salt(鹽)泄露,反解出密碼,可以在項目部署的時候使用命令傳入salt(鹽)值:

java -jar xxx.jar  -Djasypt.encryptor.password=Y6M9fAJQdU7jNp5MW

或者將密碼配置在服務器的環境變量里。

Linux部署

打開/etc/profile文件;

vim /etc/profile

在profile文件末尾插入salt(鹽)變量;

export JASYPT_PASSWORD = Y6M9fAJQdU7jNp5MW

編譯,使配置文件生效;

source /etc/profile

運行:

java -jar -Djasypt.encryptor.password=${JASYPT_PASSWORD} xxx.jar

5.觸類旁通

同樣地,對於非SPRINGBOOT項目,我們也可以將加密結果放到配置文件當中,難點在於:

如何在初始化數據源前完成對密文進行解密,並讓數據庫驅動拿到解密后的明文。

另外,如果配置文件配置了其它的IP地址,可以使用java將IP4轉成long類型,取值的時候,再將其轉成IP4,也可以提高安全性。

2022年2月26日13:48:49

druid本身支持對數據庫的密碼進行加密,非springboot項目,可以使用這個;

具體實現,見文末推薦。

寫在最后

  哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!

 相關推薦:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM