SpringBoot使用Jasypt對YML文件配置內(nèi)容加密的方法(數(shù)據(jù)庫密碼加密)
SpringBoot使用Jasypt對YML文件配置內(nèi)容進行加密(例:數(shù)據(jù)庫密碼加密)
前言
在SpringBoot的項目開發(fā)中,大多數(shù)情況下 yml 配置文件中存儲的密碼均以明文形式展示,這種方式顯然存在較大的安全隱患。一旦有開發(fā)人員離職,其可能會利用掌握的密碼信息進行不當操作,從而對系統(tǒng)安全造成威脅。因此,為了提升系統(tǒng)的安全性,我們有必要對配置文件中的敏感信息(如密碼)進行加密處理。
通過加密,只有特定的人員(例如領(lǐng)導、架構(gòu)師或技術(shù)經(jīng)理)知曉解密所需的密鑰,而普通開發(fā)人員無法直接獲取到明文密碼。這樣不僅可以有效降低因密碼泄露帶來的風險,還能更好地保護系統(tǒng)的敏感數(shù)據(jù),確保信息安全可控。這一措施不僅符合最佳安全實踐,也是企業(yè)安全管理的重要一環(huán)。
一、Jasypt 簡介
Jasypt 是一個用于 Java 的簡易加密庫,它允許開發(fā)者以最小的努力為項目添加基本的加密功能,而無需深入了解密碼學的工作原理。Jasypt 提供了多種加密算法,并且可以與 Spring Boot 無縫集成,使得開發(fā)者能夠輕松地對配置文件中的敏感信息進行加密。
二、環(huán)境準備
在開始之前,請確保已經(jīng)安裝并配置好了以下工具和環(huán)境:
- JDK 8 或更高版本
- Maven 或 Gradle 構(gòu)建工具
- IntelliJ IDEA 或其他 IDE
- Spring Boot 項目
三、步驟詳解
1. 引入 Jasypt 依賴
在 pom.xml
文件中添加 Jasypt 的依賴:
<!-- jasypt 加解密--> <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>2.1.2</version> </dependency>
注意:如果你使用的是 JDK 8,請確保選擇適合的 Jasypt 版本(通常是 2.x),而對于 JDK 9 及以上版本,則應選擇 3.x 版本。
2. 配置秘鑰與測試
為了保證安全性,我們需要設(shè)置一個加密密鑰,該密鑰將用于加密和解密敏感信息。
接下來,我們需要對敏感信息(如數(shù)據(jù)庫密碼)進行加密??梢酝ㄟ^編寫一個簡單的工具類來完成這一任務。
import org.jasypt.encryption.pbe.StandardPBEStringEncryptor; import org.jasypt.encryption.pbe.config.EnvironmentPBEConfig; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest public class JasyptTest { @Test public void testPwdEncrypt() { // 實例化加密器 StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); // 配置加密算法和秘鑰 EnvironmentPBEConfig config = new EnvironmentPBEConfig(); config.setAlgorithm("PBEWithMD5AndDES"); // 設(shè)置加密算法,默認的 config.setPassword("lvdamao"); // 用于加密的秘鑰(鹽),可以是隨機字符串,一定要記住并且存儲好 encryptor.setConfig(config); // 對自己的密碼進行加密 String myPwd = "huang3978850"; String encryptedPwd = encryptor.encrypt(myPwd); System.out.println("++++++++++++++++++++++++++++++"); System.out.println("+ 原密碼為:" + myPwd); System.out.println("+ 加密后的密碼為:" + encryptedPwd); System.out.println("++++++++++++++++++++++++++++++"); // 備注:此方式也可以用于賬號密碼登錄的加鹽操作 } // m4g9wdfnu4gMiWbCRGZjnF4T80NFO4yC @Test public void testPwdDecrypt() { // 實例化加密器 StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); // 配置加密算法和秘鑰 EnvironmentPBEConfig config = new EnvironmentPBEConfig(); config.setAlgorithm("PBEWithMD5AndDES"); // 設(shè)置加密算法,默認的 config.setPassword("lvdamao"); // 用于加密的秘鑰(鹽),可以是隨機字符串,一定要記住并且存儲好 encryptor.setConfig(config); String pendingPwd = "m4g9wdfnu4gMiWbCRGZjnF4T80NFO4yC"; String myPwd = encryptor.decrypt(pendingPwd); System.out.println("++++++++++++++++++++++++++++++"); System.out.println("+ 解密后的密碼為:" + myPwd); System.out.println("++++++++++++++++++++++++++++++"); } }
執(zhí)行測試加密程序,獲得加密后的字符串
例如:
秘鑰:lvdamao,密碼:lvdamaoluguo,加密后:q+diStq05V6enG/Dcvcc6kPk0f8vc0Ii
將秘鑰lvdamao
和加密后的字符串q+diStq05V6enG/Dcvcc6kPk0f8vc0Ii
填入第二段測試代碼進行解密測試:
成功得到原始密碼lvdamaoluguo則表示成功
使用思路:可以給項目經(jīng)理或者架構(gòu)師使用此工具,通過秘鑰和原始密碼(例如數(shù)據(jù)庫密碼),獲取到一個新的加密后的字符串,后續(xù)其他項目開發(fā)人員只能拿到加密字符串對數(shù)據(jù)庫進行連接,從而有效的減少了數(shù)據(jù)庫密碼的暴露風險
3. 修改配置文件
找到項目的啟動文件所在模塊,修改application.yml配置文件
設(shè)置jasypt和秘鑰lvdamao
jasypt: encryptor: algorithm: PBEWithMD5AndDES password: lvdamao
將加密后的字符串替換掉原來的明文密碼,并確保格式正確:
spring: datasource: # 數(shù)據(jù)源的相關(guān)配置 type: com.zaxxer.hikari.HikariDataSource # 數(shù)據(jù)源的類型,可以更改為其他的數(shù)據(jù)源配置,比如druid driver-class-name: com.mysql.cj.jdbc.Driver # mysql/MariaDB 的數(shù)據(jù)庫驅(qū)動類名稱 url: jdbc:mysql://192.168.88.160:3306/mpw-dev?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC username: root password: ENC(q+diStq05V6enG/Dcvcc6kPk0f8vc0Ii) hikari: connection-timeout: 30000 # 等待連接池分配連接的最大時間(毫秒),超過這個時長還沒有可用的連接,則會拋出SQLException minimum-idle: 5 # 最小連接數(shù) maximum-pool-size: 20 # 最大連接數(shù) auto-commit: true # 自動提交 idle-timeout: 600000 # 連接超時的最大時長(毫秒),超時則會被釋放(retired) pool-name: DataSourceHikariCP # 連接池的名字 max-lifetime: 18000000 # 連接池的最大生命時長(毫秒),超時則會被釋放(retired) connection-test-query: SELECT 1 # 用于發(fā)送sql語句保持連接狀態(tài)
例如在數(shù)據(jù)庫密碼上使用
4. 測試解密功能
當 Spring Boot 應用啟動時,Jasypt 會自動對 ENC()
標識的字符串進行解密??梢酝ㄟ^以下方式驗證解密是否成功:
import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @Slf4j @RestController @RequestMapping("/test") public class HelloWorld { @Value("${spring.datasource.password}") private String decryptedPassword; @GetMapping("/paswword") public String hello(){ return "Decrypted Password: " + decryptedPassword; } }
訪問 /password
接口,應該能夠看到解密后的明文密碼。
四、進階配置
1. 自定義加密標識
默認情況下,Jasypt 使用 ENC()
作為加密標識。如果你希望自定義加密標識,可以在 application.yml
文件中進行如下配置:
jasypt: encryptor: property: prefix: MY_ENC( suffix: ) password: your-secret-key
這樣,加密后的字符串將以 MY_ENC()
形式表示。
2. 指定加密算法
Jasypt 默認使用 PBEWithMD5AndDES
算法進行加密。如果你希望使用更高級別的加密算法(如 AES),可以在 application.yml
文件中指定:
jasypt: encryptor: algorithm: PBEWITHHMACSHA512ANDAES_256 iv-generator-classname: org.jasypt.iv.NoIvGenerator password: your-secret-key
注意:某些高級加密算法可能需要安裝 Java Cryptography Extension (JCE) 無限強度權(quán)限策略文件。
五、總結(jié)
通過本文的學習,我們了解了如何在 Spring Boot 項目中使用 Jasypt 對 application.yml
文件中的敏感信息進行加密。具體步驟包括引入 Jasypt 依賴、配置加密密鑰、加密敏感信息以及測試解密功能。此外,還介紹了如何自定義加密標識和指定加密算法等進階配置。
使用 Jasypt 不僅可以提高配置文件的安全性,還可以減少因配置文件泄露而導致的安全風險。希望本文對你有所幫助!
到此這篇關(guān)于SpringBoot使用Jasypt對YML文件配置內(nèi)容進行加密(例:數(shù)據(jù)庫密碼加密)的文章就介紹到這了,更多相關(guān)SpringBoot Jasypt配置內(nèi)容加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring中SmartLifecycle和Lifecycle的作用和區(qū)別
這篇文章主要介紹了Spring中SmartLifecycle和Lifecycle的作用和區(qū)別,本文通過實例代碼給大家介紹的非常詳細對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03SpringBoot實現(xiàn)接口的各種參數(shù)校驗的示例
本文主要介紹了SpringBoot實現(xiàn)接口的各種參數(shù)校驗的示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01在SpringBoot下讀取自定義properties配置文件的方法
這篇文章主要介紹了在SpringBoot下讀取自定義properties配置文件的方法,文中涉及到了Spring-boot中讀取config配置文件的兩種方式,需要的朋友可以參考下2017-12-12