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

在SpringBoot項(xiàng)目中使用Jasypt加密敏感配置信息的完整方案

 更新時(shí)間:2026年06月05日 08:53:26   作者:霸道流氓氣質(zhì)  
本文詳細(xì)介紹了在SpringBoot項(xiàng)目中使用Jasypt進(jìn)行配置文件加密的方法,包括環(huán)境配置、代碼示例、多環(huán)境部署等常見問題排查,助你實(shí)現(xiàn)安全配置管理,需要的朋友可以參考下

在Spring Boot項(xiàng)目中,數(shù)據(jù)庫密碼、API密鑰等敏感信息直接以明文形式寫在application.yml中是非常危險(xiǎn)的,這不僅讓配置文件在代碼倉庫中處于“裸奔”狀態(tài),也為安全審計(jì)埋下了隱患。Jasypt(Java Simplified Encryption)作為Spring Boot官方推薦的配置加密方案,用極低的接入成本解決了這一問題。本文將從環(huán)境配置、完整代碼示例到多環(huán)境部署與常見坑點(diǎn),系統(tǒng)梳理整個(gè)加密方案的全流程。

一、為何需要配置文件加密

application.yml中直接寫入數(shù)據(jù)庫密碼,實(shí)際上相當(dāng)于把家門鑰匙插在門鎖上。大量安全事件表明,配置文件中的明文憑據(jù)已成為企業(yè)數(shù)據(jù)泄露的第二大來源。常見的安全風(fēng)險(xiǎn)包括:

  • 版本控制系統(tǒng)歷史殘留:即使后續(xù)修改了密碼,Git歷史中仍保留舊版本密碼,任何有倉庫訪問權(quán)限的人均可通過git log找回。
  • CI/CD流水線暴露:部署過程中控制臺(tái)打印的配置可能被 日志系統(tǒng)捕獲,導(dǎo)致憑據(jù)意外泄露。
  • 權(quán)限擴(kuò)散風(fēng)險(xiǎn):開發(fā)、測(cè)試、運(yùn)維等多個(gè)角色均可訪問配置文件,權(quán)限管理鏈條越長,泄露風(fēng)險(xiǎn)越大。

Jasypt所遵循的是一種“防御縱深”思想——即便代碼倉庫或配置文件被攻破,攻擊者也拿不到可用的明文密碼。

二、Maven依賴配置與環(huán)境要求

2.1 依賴引入

pom.xml中添加Jasypt Spring Boot Starter依賴。注意該starter內(nèi)置了兼容的jasypt-core,無需單獨(dú)引入原生Jasypt庫。

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

2.2 版本兼容性對(duì)照表

Spring Boot版本推薦Jasypt版本說明
2.4.x - 2.7.x3.0.5+兼容JDK 11+
3.0.x - 3.5.x3.0.5+ 或 4.x3.0.5已兼容Spring Boot 3.x及Jakarta EE 9+

Jasypt 3.x版本配合Spring Boot 2.4+以上版本使用效果最佳,JDK 8及以上均無兼容問題。

2.3 JDK要求

JDK 8或更高版本均可支持,項(xiàng)目須使用Maven或Gradle構(gòu)建工具。

三、添加Jasypt配置

application.yml中添加以下配置,告訴Jasypt使用何種算法和密鑰(用于生成密文):

jasypt:
  encryptor:
    password: ${JASYPT_ENCRYPTOR_PASSWORD:}  # 從環(huán)境變量讀取,留空則拋出異常
    algorithm: PBEWITHHMACSHA512ANDAES_256  # 推薦的高級(jí)加密算法
    iv-generator-classname: org.jasypt.iv.RandomIvGenerator  # 為強(qiáng)算法配置隨機(jī)IV生成器

重要jasypt.encryptor.password絕不應(yīng)以明文寫入配置文件中并提交到版本控制。上述寫法從環(huán)境變量JASYPT_ENCRYPTOR_PASSWORD中讀取密鑰值,是最安全的生產(chǎn)部署方式。

如果使用的是舊版(PBEWithMD5AndDES)或遇到解密失敗,可能還需補(bǔ)充iv-generator-classname: org.jasypt.iv.NoIvGenerator。

四、生成加密密文的多種方法

4.1 方法一:CLI命令行工具(推薦生產(chǎn)環(huán)境使用)

下載Jasypt JAR包后執(zhí)行以下命令生成密文:

java -cp jasypt-3.0.5.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI \
  input="數(shù)據(jù)庫明文密碼" \
  password="你的主密鑰" \
  algorithm=PBEWITHHMACSHA512ANDAES_256

輸出結(jié)果如BLC3UQBxshlcA9tnMyJL7w==,之后以ENC(密文)的形式放入配置文件中。

4.2 方法二:代碼生成工具類(適合開發(fā)調(diào)試)

編寫一個(gè)Jasypt工具類,一次性生成密文備用:

import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.EnvironmentPBEConfig;

public class JasyptUtil {
    public static void main(String[] args) {
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        EnvironmentPBEConfig config = new EnvironmentPBEConfig();
        
        // 加密算法必須與配置文件中保持一致
        config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
        config.setPassword("YOUR_MASTER_SECRET_KEY");
        encryptor.setConfig(config);
        
        String plainText = "123456";
        String cipherText = encryptor.encrypt(plainText);
        System.out.println("密文:" + cipherText);
        System.out.println("解密驗(yàn)證:" + encryptor.decrypt(cipherText));
    }
}

說明:Jasypt每次調(diào)用encrypt()生成的密文不同,但解密后均能得到相同的明文,這是其內(nèi)部使用了隨機(jī)鹽值(salt)的正常行為。

五、將密文寫入數(shù)據(jù)源配置

拿到密文后,將其放入數(shù)據(jù)源的密碼字段中:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC
    username: root
    password: ENC(wDk3zX2h1f9pRq8yLmNk5vJb=)  # 加密后的密文

框架在啟動(dòng)時(shí)會(huì)自動(dòng)識(shí)別ENC(…)格式并調(diào)用Jasypt解密,無須在業(yè)務(wù)代碼中做任何額外處理。如果使用的是Druid連接池,請(qǐng)確保加解密作用于 spring.datasource.password,而非spring.datasource.druid.password,后者可能存在兼容性問題。

六、密鑰管理的安全實(shí)踐

生產(chǎn)環(huán)境中,密鑰與密文必須嚴(yán)格分離存儲(chǔ)。以下是推薦的安全注入方式:

6.1 方式一:操作系統(tǒng)環(huán)境變量(最普遍)

Linux/macOS~/.bashrc~/.zshrc):

export JASYPT_ENCRYPTOR_PASSWORD=你的強(qiáng)密鑰

Windows:通過“系統(tǒng)屬性 → 環(huán)境變量”添加JASYPT_ENCRYPTOR_PASSWORD。

6.2 方式二:JVM啟動(dòng)參數(shù)

java -Djasypt.encryptor.password=你的強(qiáng)密鑰 -jar your-app.jar

6.3 方式三:Docker容器部署

docker run -e JASYPT_ENCRYPTOR_PASSWORD="你的強(qiáng)密鑰" your-image

或在docker-compose.yml中定義環(huán)境變量塊。

6.4 Kubernetes生產(chǎn)推薦

apiVersion: v1
kind: Secret
metadata:
  name: jasypt-secret
type: Opaque
data:
  password: <base64編碼的密鑰>
---
apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      containers:
      - env:
        - name: JASYPT_ENCRYPTOR_PASSWORD
          valueFrom:
            secretKeyRef:
              name: jasypt-secret
              key: password

6.5 IntelliJ IDEA調(diào)試運(yùn)行配置

IDE默認(rèn)不繼承系統(tǒng)環(huán)境變量,需在Run/Debug Configuration → Environment variables中手動(dòng)添加JASYPT_ENCRYPTOR_PASSWORD=你的密鑰。

七、支持的加密算法與選型建議

7.1 常見可用算法

Jasypt支持以下PBE類加密算法:

算法安全性推薦度
PBEWITHHMACSHA512ANDAES_256強(qiáng)加密??? 推薦(生產(chǎn)首選)
PBEWITHHMACSHA256ANDAES_128中等??(性能均衡)
PBEWithMD5AndDES弱加密? 不推薦(JDK 17+已禁用)

版本差異:Jasypt 3.x版本后默認(rèn)加密方式已從PBEWithMD5AndDES切換為PBEWITHHMACSHA512ANDAES_256,對(duì)應(yīng)也需指定RandomIvGenerator。

7.2 如何查看當(dāng)前JDK支持的算法

在Java代碼中執(zhí)行以下腳本,快速列出所有可用算法:

import java.security.Security;
public class AlgorithmList {
    public static void main(String[] args) {
        for (java.security.Provider provider : Security.getProviders()) {
            for (Object key : provider.keySet()) {
                String str = (String) key;
                if (str.toLowerCase().contains("pbewith")) {
                    System.out.println(str);
                }
            }
        }
    }
}

八、多環(huán)境配置與啟動(dòng)方式

8.1 開發(fā)環(huán)境

開發(fā)階段仍建議使用環(huán)境變量注入,與生產(chǎn)保持一致,避免環(huán)境差異導(dǎo)致的加解密失敗。

8.2 測(cè)試/生產(chǎn)環(huán)境

嚴(yán)格將密鑰存放于環(huán)境變量或K8s Secret中,配置文件中絕不出現(xiàn)明文密鑰。關(guān)鍵安全建議:

  • 不同的環(huán)境使用不同的加密密鑰(防止跨環(huán)境憑據(jù)復(fù)用);
  • 定期輪換加密密鑰
  • 結(jié)合配置中心(如Nacos、Apollo)時(shí),確保加密后的密文存儲(chǔ)在配置中心,密鑰通過環(huán)境變量下發(fā)。

九、常見異常排查清單

問題1:EncryptionOperationNotPossibleException

原因jasypt.encryptor.password未正確注入,或加密/解密時(shí)使用的算法、密鑰不一致。

解決方法

  • 檢查JVM啟動(dòng)參數(shù)或環(huán)境變量是否生效;
  • 確認(rèn)配置文件中的算法與加密密文時(shí)使用的算法相同;
  • 若在JDK 17環(huán)境中使用舊算法PBEWithMD5AndDES,需顯式指定iv-generator-classname: org.jasypt.iv.NoIvGenerator。

問題2:Failed to bind properties under 'spring.datasource.password'

原因:Druid連接池場(chǎng)景下,加解密作用于Druid專用屬性路徑被遺漏。

解決方法:將密碼統(tǒng)一放置在spring.datasource.password中,Druid配置可通過引用此值解決,而非使用spring.datasource.druid.password。

問題3:環(huán)境變量JASYPT_ENCRYPTOR_PASSWORD不生效

排查步驟

  1. 確認(rèn)變量名拼寫為全大寫,并檢查末尾無多余空格;
  2. Windows中設(shè)置后需重啟命令行或IDE方可生效;
  3. IntelliJ IDEA需在Run Configuration中手動(dòng)添加此環(huán)境變量;
  4. 若使用mvn spring-boot:run啟動(dòng),Maven進(jìn)程默認(rèn)不繼承父終端變量,改用java -jar方式。

問題4:NoClassDefFoundError

原因:依賴版本不匹配或引入了錯(cuò)誤的庫。

解決方法:確保使用的是jasypt-spring-boot-starter而非原生jasypt庫,且版本與Spring Boot版本兼容。

十、最佳實(shí)踐總結(jié)

  1. 絕不在配置文件中明文寫入密鑰。永遠(yuǎn)使用環(huán)境變量、K8s Secret或?qū)S妹荑€管理服務(wù)(如Vault)注入;
  2. 生產(chǎn)環(huán)境使用強(qiáng)加密算法,如PBEWITHHMACSHA512ANDAES_256,避開舊版PBEWithMD5AndDES;
  3. 統(tǒng)一加解密路徑,尤其在配合Druid連接池時(shí),敏感屬性統(tǒng)一放置在標(biāo)準(zhǔn)spring.datasource.password中,規(guī)避自定義路徑無法解密的問題;
  4. 不同環(huán)境使用不同密鑰,避免因開發(fā)密鑰泄露波及生產(chǎn)數(shù)據(jù);
  5. 結(jié)合CI/CD自動(dòng)化部署時(shí),確保構(gòu)建腳本不輸出密鑰值到日志中;
  6. 定期輪換密鑰,降低長期使用單一密鑰帶來的暴露風(fēng)險(xiǎn);
  7. 版本兼容性先行:Spring Boot 3.x用戶選擇jasypt-spring-boot-starter 3.0.5+版本,并確保算法配置適配。

通過以上系統(tǒng)化的配置和密鑰管理,即可在Spring Boot項(xiàng)目中實(shí)現(xiàn)“配置文件零明文”的安全目標(biāo),讓數(shù)據(jù)庫密碼等敏感信息真正穿上“防彈衣”。

以上就是在SpringBoot項(xiàng)目中使用Jasypt加密敏感配置信息的完整方案的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Jasypt加密敏感配置信息的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java實(shí)現(xiàn)文件監(jiān)控器FileMonitor的實(shí)例代碼

    Java實(shí)現(xiàn)文件監(jiān)控器FileMonitor的實(shí)例代碼

    這篇文章主要介紹了Java實(shí)現(xiàn)文件監(jiān)控器FileMonitor的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • SSH框架網(wǎng)上商城項(xiàng)目第30戰(zhàn)之項(xiàng)目總結(jié)(附源碼下載地址)

    SSH框架網(wǎng)上商城項(xiàng)目第30戰(zhàn)之項(xiàng)目總結(jié)(附源碼下載地址)

    這篇文章主要介紹了SSH框架網(wǎng)上商城項(xiàng)目第30戰(zhàn)之項(xiàng)目總結(jié),并附源碼下載地址,感興趣的小伙伴們可以參考一下
    2016-06-06
  • eclipse的git插件安裝、配置與使用詳解

    eclipse的git插件安裝、配置與使用詳解

    這篇文章主要介紹了eclipse的git插件安裝、配置與使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • SpringMVC日期類型參數(shù)傳遞實(shí)現(xiàn)步驟講解

    SpringMVC日期類型參數(shù)傳遞實(shí)現(xiàn)步驟講解

    這篇文章主要介紹了SpringMVC日期類型參數(shù)傳遞實(shí)現(xiàn)步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-02-02
  • 關(guān)于logBack配置日志文件及編碼配置的問題

    關(guān)于logBack配置日志文件及編碼配置的問題

    這篇文章主要介紹了logBack配置日志文件及編碼配置的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Spring中MVC模塊代碼詳解

    Spring中MVC模塊代碼詳解

    這篇文章主要介紹了Spring中MVC模塊代碼詳解,涉及Controller的簡單介紹,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-11-11
  • Java的Spring框架中bean的繼承與內(nèi)部bean的注入

    Java的Spring框架中bean的繼承與內(nèi)部bean的注入

    這篇文章主要介紹了Java的Spring框架中bean的繼承與內(nèi)部bean的注入,Spring框架是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下
    2015-12-12
  • 如何用java編寫微信小程序消息提醒推送

    如何用java編寫微信小程序消息提醒推送

    最近參與開發(fā)的項(xiàng)目有用到微信模板消息推送,在這離記錄一下,下面這篇文章主要給大家介紹了關(guān)于如何用java編寫微信小程序消息提醒推送的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • 使用Java visualVM監(jiān)控遠(yuǎn)程JVM的流程分析

    使用Java visualVM監(jiān)控遠(yuǎn)程JVM的流程分析

    我們經(jīng)常需要對(duì)我們的開發(fā)的軟件做各種測(cè)試, 軟件對(duì)系統(tǒng)資源的使用情況更是不可少,JDK1.6開始自帶的VisualVM就是不錯(cuò)的監(jiān)控工具,本文給大家分享使用Java visualVM監(jiān)控遠(yuǎn)程JVM的問題,感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • Java實(shí)現(xiàn)汽車租賃系統(tǒng)

    Java實(shí)現(xiàn)汽車租賃系統(tǒng)

    這篇文章介紹了Java實(shí)現(xiàn)汽車租賃系統(tǒng)的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03

最新評(píng)論

景谷| 广河县| 济宁市| 莱芜市| 汤原县| 伊金霍洛旗| 南丰县| 田东县| 唐山市| 施秉县| 吉木萨尔县| 阳新县| 抚松县| 精河县| 高清| 大理市| 富平县| 南木林县| 江城| 上林县| 资兴市| 吉水县| 闽清县| 绵阳市| 吕梁市| 大悟县| 鞍山市| 河源市| 和田市| 北海市| 丰宁| 息烽县| 互助| 饶河县| 吉隆县| 万荣县| 永康市| 茂名市| 石景山区| 靖江市| 罗平县|