SpringBoot對(duì)數(shù)據(jù)庫用戶名和密碼進(jìn)行加密的兩種方案
引言
在當(dāng)今互聯(lián)網(wǎng)時(shí)代, 數(shù)據(jù)庫安全的重要性不言而喻。作為Java開發(fā)的主流框架,Spring Boot項(xiàng)目通常需要連接數(shù)據(jù)庫,而數(shù)據(jù)庫的 用戶名和密碼作為最敏感的信息之一,如果直接以明文形式存儲(chǔ)在 application.properties或 application.yml配置文件中,將存在極大的安全隱患。特別是在項(xiàng)目代碼需要上傳到GitHub等開源平臺(tái)或團(tuán)隊(duì)協(xié)作開發(fā)時(shí), 明文數(shù)據(jù)庫憑證可能會(huì)被惡意利用,導(dǎo)致數(shù)據(jù)泄露甚至被刪除的風(fēng)險(xiǎn)。
因此,對(duì)Spring Boot項(xiàng)目中的數(shù)據(jù)庫用戶名和密碼進(jìn)行加密處理,是每個(gè)開發(fā)者都應(yīng)該重視的安全實(shí)踐。本文將從實(shí)際應(yīng)用出發(fā),詳細(xì)介紹兩種主流的數(shù)據(jù)源配置加密方案:Jasypt(通用性加密庫)和Druid(自帶加密功能的數(shù)據(jù)源),幫助你根據(jù)項(xiàng)目需求選擇最適合的方案,全面提升應(yīng)用安全性。
下面是一個(gè)快速對(duì)比,幫助你了解兩種主要方案的特點(diǎn):
| 特性 | Jasypt | Druid 數(shù)據(jù)源加密 |
|---|---|---|
| 加密方式 | 對(duì)配置值進(jìn)行對(duì)稱加密,使用 ENC(密文) 包裹 | 使用內(nèi)置的 RSA 非對(duì)稱加密工具對(duì)密碼進(jìn)行加密 |
| 集成度 | 與 Spring Boot 生態(tài)集成度高,配置簡單 | 主要針對(duì) Druid 數(shù)據(jù)源,配置稍復(fù)雜 |
| 工作原理 | 程序啟動(dòng)時(shí)自動(dòng)識(shí)別并解密 ENC() 中的內(nèi)容 | 通過配置 ConfigFilter 在連接池初始化時(shí)解密 |
| 依賴 | 需添加 jasypt-spring-boot-starter 依賴 | 需使用 druid 數(shù)據(jù)源 |
| 推薦場景 | 通用性強(qiáng),適用于加密配置文件中的任何敏感信息 | 適用于專注于使用 Druid 數(shù)據(jù)源并提供額外安全的場景 |
一、使用 Jasypt 加密
Jasypt(Java Simplified Encryption)是一個(gè)簡單易用的Java加密庫,它與Spring Boot生態(tài)集成度高,可以非常方便地對(duì)配置文件中的任何敏感信息進(jìn)行加密處理。其核心思想是對(duì)明文字段進(jìn)行對(duì)稱加密,然后將加密后的密文(用ENC()包裹)置于配置文件中。應(yīng)用程序在啟動(dòng)時(shí),Jasypt會(huì)自動(dòng)識(shí)別并解密這些密文,獲取真實(shí)的配置值。
步驟 1:添加依賴
在項(xiàng)目的 pom.xml 中添加 Jasypt 依賴。請(qǐng)注意版本兼容性,部分 Spring Boot 版本與較新的 Jasypt 版本可能存在兼容性問題,有資料推薦使用 2.1.2 或 3.0.4 等穩(wěn)定版本。
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.4</version> <!-- 請(qǐng)根據(jù)你的Spring Boot版本選擇合適版本 -->
</dependency>
注意:如果后續(xù)啟動(dòng)應(yīng)用時(shí)出現(xiàn)Failed to bind properties等錯(cuò)誤,可能是版本不兼容所致,可以嘗試降低Jasypt版本(例如使用2.1.2)。
步驟 2:獲取加密密文
你需要使用 Jasypt 提供的工具對(duì)明文密碼進(jìn)行加密。
方法一:使用 JAR 包命令行加密(常用)
- 找到本地 Maven 倉庫中的
jasypt-1.9.3.jar(版本號(hào)可能不同)。 - 在命令行中執(zhí)行以下命令(請(qǐng)?zhí)鎿Q
your_secret_key為你的加密密鑰,plain_text為你的明文密碼):
java -cp jasypt-1.9.3.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input="plain_text" password="your_secret_key" algorithm="PBEWithMD5AndDES"
命令輸出中的 OUTPUT 就是加密后的密文。
方法二:在 Java 代碼中加密
你也可以編寫一個(gè)簡單的工具類來加密:
import org.jasypt.util.text.BasicTextEncryptor;
public class JasyptEncryptor {
public static void main(String[] args) {
BasicTextEncryptor encryptor = new BasicTextEncryptor();
encryptor.setPassword("your_secret_key"); // 設(shè)置加密密鑰
String encryptedPassword = encryptor.encrypt("your_db_password"); // 加密
System.out.println("Encrypted password: " + encryptedPassword);
// 如果需要解密驗(yàn)證
// String decryptedPassword = encryptor.decrypt(encryptedPassword);
// System.out.println("Decrypted password: " + decryptedPassword);
}
}
步驟 3:修改配置文件
將加密后的密文(例如:LPbn37xuIIAfCkaermp5cQ)用 ENC() 包裹,替換到 application.properties 或 application.yml 中,并配置加密密鑰。
application.yml 示例:
spring:
datasource:
url: jdbc:mysql://localhost:3306/your_database
username: ENC(加密后的用戶名密文) # 如果用戶名也加密了
password: ENC(LPbn37xuIIAfCkaermp5cQ) # 加密后的密碼密文
jasypt:
encryptor:
password: your_secret_key # 此處是加密時(shí)使用的密鑰
# algorithm: PBEWithMD5AndDES # 如需指定算法,默認(rèn)可能已是更安全的算法
步驟 4:安全地傳遞加密密鑰
絕不能將加密密鑰(your_secret_key)直接寫死在配置文件中。推薦通過環(huán)境變量或啟動(dòng)參數(shù)傳遞:
啟動(dòng)參數(shù)傳遞:
java -jar -Djasypt.encryptor.password=your_secret_key your-app.jar
環(huán)境變量傳遞:
在應(yīng)用啟動(dòng)前設(shè)置環(huán)境變量JASYPT_ENCRYPTOR_PASSWORD。
注意事項(xiàng)
- 版本兼容性:Jasypt 新版本(如 3.0.3+)有時(shí)會(huì)更改默認(rèn)加密算法,可能導(dǎo)致與舊版本不兼容而啟動(dòng)報(bào)錯(cuò)。若遇到
Failed to bind properties等相關(guān)錯(cuò)誤,可嘗試降低 Jasypt 版本(例如使用2.1.2)或檢查算法配置是否匹配。 - 加密算法:早期版本默認(rèn)使用
PBEWithMD5AndDES。對(duì)于更高安全需求,建議使用更強(qiáng)大的算法(如PBEWITHHMACSHA512ANDAES_256),但這可能需要安裝 Java Cryptography Extension (JCE)。 - 啟用加密功能:在某些舊版本或特定配置下,可能需要在主應(yīng)用類上添加
@EnableEncryptableProperties注解。但許多較新版本的jasypt-spring-boot-starter會(huì)自動(dòng)配置。 - 不僅僅是數(shù)據(jù)庫密碼:Jasypt 可用于加密配置文件中的任何敏感信息,如 Redis 密碼、API 密鑰等。
- 測試:配置完成后,務(wù)必啟動(dòng)測試,確保應(yīng)用能成功解密并連接數(shù)據(jù)庫。
二、使用Druid 數(shù)據(jù)源加密方案
如果你在項(xiàng)目中使用的是阿里巴巴開發(fā)的Druid數(shù)據(jù)源,那么它自身就提供了數(shù)據(jù)庫密碼加密的功能。Druid使用的是非對(duì)稱的RSA加密方案,相較于Jasypt的對(duì)稱加密,安全性更高。
Druid提供了命令行工具來生成加密后的密碼和相應(yīng)的公鑰、私鑰。
下載Druid的JAR包(例如druid-1.2.6.jar)。
在命令行中執(zhí)行以下命令:
java -cp druid-1.2.6.jar com.alibaba.druid.filter.config.ConfigTools your_db_password
此命令會(huì)輸出:
如下圖,在命令窗口執(zhí)行上述命令后后會(huì)生成私鑰(privateKey)、公鑰(publicKey)和加密后的密碼(password)

privateKey: 你的私鑰 (必須妥善保管,用于解密)publicKey: 你的公鑰 (可以配置在連接池中)password: 加密后的密碼
配置 application.yml:
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
url: jdbc:mysql://localhost:3306/your_database
username: your_username # 若用戶名也需要加密,則替換為加密后的用戶名
password: ${encrypted_password} # 此處替換為加密后密碼
filters: config
connection-properties: config.decrypt=true;config.decrypt.key=${public_key} # 此處public_key需替換或通過環(huán)境變量注入
filter:
config:
enabled: true
同樣,公鑰(public_key)也應(yīng)通過環(huán)境變量等安全方式注入,而非硬編碼在配置文件中。
借助Druid中的ConfigTools工具類來加密數(shù)據(jù)庫對(duì)應(yīng)的密碼:
public static void main(String[] args) throws Exception {
String password = "123456";
ConfigTools.main(new String[]{password});
}

如需對(duì)用戶名進(jìn)行加密,可使用上述密碼加密后生成的privateKey進(jìn)行用戶名加密,代碼如下:
public static void main(String[] args) throws Exception {
String username = "root";
String privateKey = ""; // 填充密碼加密生成的privateKey
String encrypt = ConfigTools.encrypt(pr, name);
System.out.println(encrypt);
// 如需解密驗(yàn)證,使用下面的方法
// String publicKey = ""; // 填充密碼加密生成的publicKey
// String decrypt = ConfigTools.decrypt(publicKey, encrypt);
// System.out.println(decrypt);
}
三、總結(jié)
為 Spring Boot 應(yīng)用配置數(shù)據(jù)庫密碼加密是提升安全性的重要一步。
- 對(duì)于大多數(shù)項(xiàng)目,推薦使用 Jasypt,它通用且與 Spring Boot 集成簡單。使用時(shí)請(qǐng)注意版本兼容性,并務(wù)必通過安全方式(如啟動(dòng)參數(shù)、環(huán)境變量)傳遞加密密鑰,避免硬編碼。
- 若項(xiàng)目已使用 Druid 數(shù)據(jù)源,且安全要求較高,可以考慮使用其自帶的 RSA 加密方案。
以上就是SpringBoot對(duì)數(shù)據(jù)庫用戶名和密碼進(jìn)行加密的兩種方案的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot數(shù)據(jù)庫用戶名和密碼加密的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot定制三種錯(cuò)誤頁面及錯(cuò)誤數(shù)據(jù)方法示例
Spring Boot提供的默認(rèn)異常處理機(jī)制通常并不一定適合我們實(shí)際的業(yè)務(wù)場景,因此,我們通常會(huì)根據(jù)自身的需要對(duì)Spring Boot全局異常進(jìn)行統(tǒng)一定制,例如定制錯(cuò)誤頁面,定制錯(cuò)誤數(shù)據(jù)等。本文主要介紹了SpringBoot三種自定義錯(cuò)誤頁面的實(shí)現(xiàn),快來學(xué)習(xí)吧2021-12-12
詳解OAuth2 Token 一定要放在請(qǐng)求頭中嗎
這篇文章主要介紹了詳解OAuth2 Token 一定要放在請(qǐng)求頭中嗎,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
Java通過反射機(jī)制將對(duì)象封裝成JSON和JsonArray格式
這篇文章主要介紹了Java通過反射機(jī)制將對(duì)象封裝成JSON和JsonArray格式,JAVA反射機(jī)制是在運(yùn)行狀態(tài)中,對(duì)于任意一個(gè)實(shí)體類,都能夠知道這個(gè)類的所有屬性和方法,需要的朋友可以參考下2023-10-10
Java服務(wù)實(shí)現(xiàn)開啟Debug遠(yuǎn)程調(diào)試
文章介紹如何通過JVM參數(shù)開啟Java服務(wù)遠(yuǎn)程調(diào)試,便于在線上排查問題,在IDEA中配置客戶端連接,實(shí)現(xiàn)無需頻繁部署的調(diào)試,提升效率2025-09-09
Spring Cloud Alibaba和Dubbo融合實(shí)現(xiàn)
這篇文章主要介紹了Spring Cloud Alibaba和Dubbo融合實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
對(duì)比Java設(shè)計(jì)模式編程中的狀態(tài)模式和策略模式
這篇文章主要介紹了Java設(shè)計(jì)模式編程中的狀態(tài)模式和策略模式對(duì)比,文中列舉了兩種模式的相似點(diǎn)和不同點(diǎn),并都舉了代碼的實(shí)例作為參照,需要的朋友可以參考下2016-04-04

