Spring Boot 使用Jasypt加密

一、配置Jasypt

1.在pom.xml中導入依賴

        <!-- Jasypt 加密工具 --><dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version></dependency>

注釋:項目使用了@SpringBootApplication@EnableAutoConfiguration注解,可以直接使用starter依賴,否則要用其他方法。其他方法見參考文章里。

2.配置Jasypt信息

2.1 使用@Configuration配置信息

package com.xj.util.jasypt;import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/*** @Author: xjfu* @Create: 2025/07/16 15:13* @Description: Jastpt配置信息*/@Configuration
public class JasyptConfig {@Value("${jasypt.encryptor.password:default-secret-key}")private String password;/*** 配置Jasypt加密器** @return StringEncryptor加密器實例*/@Bean("jasyptStringEncryptor")public StringEncryptor stringEncryptor() {PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();SimpleStringPBEConfig config = new SimpleStringPBEConfig();// 設置加密密鑰 通過配置闡述,安全config.setPassword(password);//設置加密秘鑰 直接寫死,但是不安全//config.setPassword("xj20250716");// 設置加密算法// 注意:Jasypt 3.0.0之后默認算法為PBEWITHHMACSHA512ANDAES_256// 需要JDK 9+或添加JCE支持,否則可能報錯// 如果使用較低版本的JDK,可以選擇兼容的算法如PBEWithMD5AndDESconfig.setAlgorithm("PBEWithMD5AndDES");// 設置密鑰獲取迭代次數config.setKeyObtentionIterations("1000");// 設置加密器的池大小config.setPoolSize("1");// 設置隨機鹽生成器config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");// 設置字符串輸出格式config.setStringOutputType("base64");encryptor.setConfig(config);return encryptor;}
}

2.2 使用配置文件方式

# Jasypt配置(必須放在最前面)
jasypt:encryptor:bean: jasyptStringEncryptor# 可以使用環境變量或命令行參數傳入密鑰password: ${JASYPT_ENCRYPTOR_PASSWORD:default-secret-key}algorithm: PBEWithMD5AndDESiv-generator-classname: org.jasypt.iv.RandomIvGenerator

2.3?配置文件詳解

3.Jasypt工具類

package com.xj.util.jasypt;import org.jasypt.encryption.StringEncryptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
/*** @Author: xjfu* @Create: 2025/07/16 15:15* @Description: Jasypt工具類*/
@Component
public class JasyptUtil {private final StringEncryptor encryptor;@Autowiredpublic JasyptUtil(@Qualifier("jasyptStringEncryptor") StringEncryptor encryptor) {this.encryptor = encryptor;}/*** 加密方法** @param value 待加密的字符串* @return 加密后的字符串*/public String encrypt(String value) {return encryptor.encrypt(value);}/*** 解密方法** @param value 待解密的字符串* @return 解密后的字符串*/public String decrypt(String value) {return encryptor.decrypt(value);}
}

4.配置Jasypt的秘鑰

4.1 IDEA中配置

4.1.1 配置方法一

--jasypt.encryptor.password=xj20250716

4.1.2?配置方法二

-Djasypt.encryptor.password=xj20250716

4.2 程序啟動時命令行中帶入

方式一:作為程序啟動時的命令行參數來帶入
java -jar app.jar --jasypt.encryptor.password=xxxxxx
?
方式二:作為程序啟動時的應用環境變量來帶入
java -Djasypt.encryptor.password=xxxxxx -jar app.jar

5.使用ENC()包裹加密密文

Jasypt使用特定格式來標識加密的屬性值。在配置文件中,加密的值需要使用ENC(加密后的值)格式。

二、項目舉例

1.項目架構

2.代碼實現

MainApplication.java:

package com.xj.main;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;/*** @Author : xjfu* @Date : 2022/6/8 8:38* @Description :Spring Boot 啟動類*/
@ComponentScan("com.xj")
@SpringBootApplication
@MapperScan("com.xj.dao.mapper")
public class MainApplication {public static void main(String[] args) {try{SpringApplication.run(MainApplication.class, args);}catch (Exception e){e.printStackTrace();}}
}

JasyptConfig.java:

package com.xj.util.jasypt;import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/*** @Author: xjfu* @Create: 2025/07/16 15:13* @Description: Jastpt配置信息*/@Configuration
public class JasyptConfig {@Value("${jasypt.encryptor.password:default-secret-key}")private String password;/*** 配置Jasypt加密器** @return StringEncryptor加密器實例*/@Bean("jasyptStringEncryptor")public StringEncryptor stringEncryptor() {PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();SimpleStringPBEConfig config = new SimpleStringPBEConfig();// 設置加密密鑰 通過配置闡述,安全config.setPassword(password);//設置加密秘鑰 直接寫死,但是不安全//config.setPassword("xj20250716");// 設置加密算法// 注意:Jasypt 3.0.0之后默認算法為PBEWITHHMACSHA512ANDAES_256// 需要JDK 9+或添加JCE支持,否則可能報錯// 如果使用較低版本的JDK,可以選擇兼容的算法如PBEWithMD5AndDESconfig.setAlgorithm("PBEWithMD5AndDES");// 設置密鑰獲取迭代次數config.setKeyObtentionIterations("1000");// 設置加密器的池大小config.setPoolSize("1");// 設置隨機鹽生成器config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");// 設置字符串輸出格式config.setStringOutputType("base64");encryptor.setConfig(config);return encryptor;}
}

JasyptUtil.java:

package com.xj.util.jasypt;import org.jasypt.encryption.StringEncryptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
/*** @Author: xjfu* @Create: 2025/07/16 15:15* @Description: Jasypt工具類*/
@Component
public class JasyptUtil {private final StringEncryptor encryptor;@Autowiredpublic JasyptUtil(@Qualifier("jasyptStringEncryptor") StringEncryptor encryptor) {this.encryptor = encryptor;}/*** 加密方法** @param value 待加密的字符串* @return 加密后的字符串*/public String encrypt(String value) {return encryptor.encrypt(value);}/*** 解密方法** @param value 待解密的字符串* @return 解密后的字符串*/public String decrypt(String value) {return encryptor.decrypt(value);}
}

JasyptController.java:

package com.xj.controller;import com.xj.entity.JasyptRequest;
import com.xj.util.jasypt.JasyptUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;/*** @Author: xjfu* @Create: 2025/07/16 15:18* @Description: Jasypt控制類,用于對銘文進行加密或者解密以及驗證數據庫密碼*/
@RequestMapping(value = "/jasypt",method = RequestMethod.POST)
@RestController
public class JasyptController {@Autowiredprivate JasyptUtil jasyptUtil;@Value("${spring.datasource.password}")private String databasePassword;/*** 加密接口*/@RequestMapping(value = "/encrypt", method = RequestMethod.GET)public String encrypt(@RequestParam String encryptStr) {return jasyptUtil.encrypt(encryptStr);}/*** 解密接口*/@RequestMapping(value = "/decrypt", method = RequestMethod.POST)public String decrypt(@RequestBody JasyptRequest jasyptRequest) {return jasyptUtil.decrypt(jasyptRequest.getDecryptStr());}/*** 測試配置文件中的加密屬性是否正確解密*/@GetMapping("/test")public String test() {return "Database password: " + databasePassword;}
}

JasyptRequest.java:

package com.xj.entity;import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;import java.io.Serializable;/*** @Author: xjfu* @Create: 2025/07/16 15:25* @Description: Jasypt解密請求體*/
@Data
public class JasyptRequest implements Serializable {private static final long serialVersionUID = -256451235446545L;/***  待解密字符串*/@JsonProperty(value = "decryptStr")private String decryptStr;public String getDecryptStr() {return decryptStr;}public void setDecryptStr(String decryptStr) {this.decryptStr = decryptStr;}
}

application.yml

#默認配置
server:port: 8080# Jasypt配置(必須放在最前面)
#jasypt:
#    encryptor:
#        bean: jasyptStringEncryptor
#        # 可以使用環境變量或命令行參數傳入密鑰
#        password: ${JASYPT_ENCRYPTOR_PASSWORD:default-secret-key}
#        algorithm: PBEWithMD5AndDES
#        iv-generator-classname: org.jasypt.iv.RandomIvGenerator# 未加密版本
#spring:
#    datasource: #數據源連接信息
#        username: root
#        password: 12345
#        url: jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=UTF-8
#        driver-class-name: com.mysql.cj.jdbc.Driver
#    profiles:
#        active: dev #切換配置,指定使用哪個profile# 加密版本
spring:datasource: #數據源連接信息username: ENC(X86Cv+ch9gPTZW7sFcZ+g5NXYUEpSmnB)password: ENC(tO+OKiSXa20LD80vOjWtjDbpf0vf31/x)url: jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=UTF-8driver-class-name: com.mysql.cj.jdbc.Driverprofiles:active: dev #切換配置,指定使用哪個profile# 設置 Mybatis 的 xml 保存路徑
mybatis-plus:mapper-locations: classpath:mapper/*Mapper.xmltype-aliases-package: com.xj.dao.modelconfiguration: # 配置打印 MyBatis 執行的 SQLlog-impl: org.apache.ibatis.logging.stdout.StdOutImpl #需要lombok框架支持,可以添加# 配置打印 MyBatis 執行的 SQL
logging:level:com:example:demo: debug---
#開發環境
server:port: 8081spring:config:activate:on-profile: dev
---
#測試環境
server:port: 8082spring:config:activate:on-profile: test
---
#生產環境
server:port: 8083spring:config:activate:on-profile: prodlogging:config: classpath:logback-spring.xml #指定使用哪個日志配置文件

pom.xml

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.xj</groupId><artifactId>SpringBootStudyProject</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.5</version><relativePath/></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--導入JDBC的場景啟動器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><!--jquery引入--><dependency><groupId>org.webjars</groupId><artifactId>jquery</artifactId><version>3.6.0</version></dependency><!--Thymeleaf 啟動器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><!--導入數據庫驅動--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><!-- MyBatis Plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.1</version></dependency><!-- junit測試依賴 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><scope>test</scope></dependency><!-- lombok依賴 為了簡化實體類的編寫代碼量 --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!-- Jasypt 加密工具 --><dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.5</version></dependency></dependencies><!--build標簽描述了如何來編譯及打包項目,而具體的編譯和打包工作是通過build中配置的 plugin 來完成--><build><plugins><!--使用SpringBoot的打包插件--><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><executions><execution><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>
</project>

3.運行結果

3.1 先將數據庫按明文啟動,然后獲取對應的加密密文

3.1.1 加密

加密URL:

http://127.0.0.1:8081/jasypt/encrypt?encryptStr=root

3.1.2 解密驗證

解密URL:

http://127.0.0.1:8081/jasypt/decrypt

報文:

{

????"decryptStr":"X86Cv+ch9gPTZW7sFcZ+g5NXYUEpSmnB"

}

3.2 再將加密密文用ENC()包裹起來替換明文,若啟動成功,即為加密成功。

替換:

啟動成功:

三、重點說明

1.若解密失敗,會包如下錯誤

2.秘鑰最好不要有特殊字符,比如“$”、"_",這樣會導致解密失敗,實測經驗

3.解密JasyptController中的decrypt不應該用@GetMapping,因為解密中的字符春包含很多特殊字符,比如“/”,“+”等,這些都會導致解密失敗。@RequestMapping + @RequestParam也不行,必須用@RequestMapping + @RequestBody。

四、感謝:

1.Jasypt概述及整合SpringBoot實現敏感數據加密_jasypt 原理-CSDN博客

2.Jasypt 開源加密庫使用教程-CSDN博客

3.springboot 跨域以及jasypt加密使用(第六章)_springboot jasypt-CSDN博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/89983.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/89983.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/89983.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【電影剖析】千鈞一發

目錄 1 人物介紹 2 電影名解讀 3 電影開頭 3.1 電影開頭的兩段話 3.2 片頭設計 4 電影正文 4.1 “杰羅米”各種詭異的行為 4.2 文森特 – 失敗的man 4.3 真正的杰羅米以及假基因身份證 4.4 文森特新征程 4.5 基因人的不容易 4.6 睫毛被查出有問題 4.7 文森特身份初…

論文略讀:Arcee’s MergeKit: A Toolkit for Merging Large Language Models

emnlp 2024在過去的一年里&#xff0c;開源大型語言模型&#xff08;LLMs&#xff09;迅速發展&#xff0c;并已可通過 Hugging Face 模型庫獲取。這些模型的訓練規模可達數萬億個 token&#xff0c;參數量通常在 1 億至 700 億以上不等開源模型檢查點涵蓋了多種任務&#xff0…

刀客doc:Netflix與YouTube開始在廣告戰場正面交鋒

01廣告一開始并不是Netflix的核心業務&#xff0c;但眼下&#xff0c;廣告正逐步成為這家公司與YouTube正面對抗的關鍵戰場。在上周剛發布的Q2財報里&#xff0c;Netflix廣告層已覆蓋全球12個核心市場&#xff0c;月活躍用戶已經逼近9400萬&#xff0c;主要集中在CTV滲透率高的…

(四)Unity3d-ROS聯合仿真:turtlebot在Unity3d中仿真

運行環境Ubuntu20.04Unity3d 1.下載運行 &#xff08;1&#xff09;項目下載地址&#xff1a; Robotics-Nav2-SLAM-Example 最好執行下面命令能將子模塊也下載 git clone --recurse-submodule gitgithub.com:Unity-Technologies/Robotics-Nav2-SLAM-Example.gitgit submodu…

信息學奧賽一本通 1553:【例 2】暗的連鎖

【題目鏈接】 ybt 1553&#xff1a;【例 2】暗的連鎖 【題目考點】 1. 樹上差分&#xff1a;邊差分 類似對差分序列進行修改可以完成對原序列的區間修改。對樹上邊差分進行修改可以完成對樹上一條路徑中所有邊的邊權進行修改。 一條邊的差分值為該邊的權值減去該邊連接的深…

二分查找-852.山峰數組的峰頂索引-力扣(LeetCode)

一、題目解析1.山峰數組數據嚴格滿足arr[0]<arr[1]……<arr[i]>arr[i1]……arr[arr.size()-1]2.時間復雜度要求為O(logN)二、算法解析解法1&#xff1a;暴力解法-O(N)遍歷數組arr&#xff0c;結合山峰數組性質&#xff0c;我們發現峰頂存在arr[i]>arr[i-1]&#xf…

高可用架構模式——數據集群和數據分區

目錄 一、數據集群 1.1、 數據集中集群 1.2、 數據集中集群的復雜度具體體現 1.3、數據分散集群 1.4、數據分散集群的復雜度具體體現 1.5、數據分散集群和數據集中集群的不同點 二、數據分區 2.1、數據分區架構需要考慮的因素 2.1.1、數據量 2.1.2、分區規則 2.1.3、復制規則 2…

上電復位斷言的自動化

POR是所有SoC設計的關鍵功能序列&#xff0c;其作用是將系統從任意狀態恢復至正常狀態。任何未被檢測到的POR缺陷都可能導致實際芯片中的災難性后果。復雜數量的重置邏輯給驗證工程師帶來了更大挑戰——他們需要在RTL仿真過程中捕捉這些設計缺陷。隨著SoC規模和復雜度的持續增長…

2025 年最新 AI 技術:全景洞察與深度解析?

2025 年最新 AI 技術&#xff1a;全景洞察與深度解析?在科技飛速發展的當下&#xff0c;AI 技術無疑是最耀眼的那顆星&#xff0c;持續為我們的生活與工作帶來前所未有的變革。步入 2025 年&#xff0c;AI 技術更是呈現出多點突破、全面開花的態勢&#xff0c;下面就為大家深入…

Vue項目中的AJAX請求與跨域問題解析

一、AJAX請求方式對比與選型1. 原生XHR方式基本使用示例&#xff1a;缺點分析&#xff1a;代碼冗長復雜回調地獄問題需要手動處理JSON轉換錯誤處理不夠直觀2. jQuery的AJAX基本使用示例&#xff1a;$.ajax({url: http://localhost:5000/api/data,type: GET,success: function(d…

使用 Longformer-base-4096 進行工單問題分類

簡述最近接了對Ticket 進行問題分類的任務&#xff0c;使用了prompt和機器學習兩種方式來解決&#xff0c;這里重點介紹Longformer-base-4096 模型訓練的方案使用 Longformer-base-4096 模型實現文本分類系統&#xff0c;利用 Longformer 處理長序列的能力進行準確分類。該解決…

Matplotlib和Plotly知識點(Dash+Plotly分頁展示)

Matplotlib和Plotly知識點&#xff08;DashPlotly分頁展示&#xff09;0、Matplotlib、Plotly和Dash區別 &#xff08;推薦用DashPlotly&#xff09;1.1、Matplotlib &#xff08;靜態圖&#xff09;1. Figures&#xff08;圖形&#xff09;概念創建Figure保存和顯示Figure2. S…

YOLO12論文閱讀:Attention-Centric Real-Time Object Detectors

文章鏈接&#xff1a; 2502.12524https://arxiv.org/pdf/2502.12524 摘要 (Abstract)?? 長期以來&#xff0c;增強 YOLO 框架的網絡架構至關重要&#xff0c;但盡管注意力機制在建模能力方面已被證明具有優越性&#xff0c;改進卻主要集中在基于 CNN 的方面。這是因為基于…

秋招Day17 - Spring - 事務

Spring事務的種類編程式事務和聲明式事務介紹一下編程式事務管理&#xff1f;通過編程的方式顯式控制事務的開始、提交和回滾&#xff0c;一般使用TransactionTemplate的execute方法介紹一下聲明式事務管理&#xff1f;基于AOP&#xff0c;通過調用代理對象攔截目標方法&#x…

多維基分析求導法則

對于n維點R0(I1,I2,I3,......In)如果到R&#xff08;I1&#xff0c; I2 , I3 ,......,In )有基分析求導定理&#xff1a;即R0 R0 *&#xff08;x1 ,x2 ,x3 ,.............xn) R當I1&#xff0c;I2&#xff0c;....,In獨立不能轉化時有了獨立變量的求導和積分不相干法則…

Java值傳遞和構造函數

一.Java值傳遞首先我們來看一串代碼&#xff1a;輸出 10 20&#xff0c;而不是20 10 這是為什么呢&#xff1f;有內存圖可以知道&#xff0c;這個change方法所改變的東西最終沒有寫回到main之中&#xff0c;且他傳的是具體的數據&#xff0c;所以還會輸出原數據&#xff0c;就相…

電商項目_秒殺_架構及核心

秒殺架構設計先看下普通web項目架構&#xff1a; &#xff08;Nginx : 反向代理、負載均衡&#xff0c;一般是運維部分做生產搭建的時候配置好&#xff09;秒殺架構設計&#xff1a;和普通架構區別&#xff1a;原先由Web 服務或Nginx服務提供的靜態資源放到了CDNNginx的職責放?…

4x4矩陣教程

4x4矩陣教程 1. 簡介 四維矩陣是計算機圖形學和3D變換中的重要工具&#xff0c;用于表示三維空間中的仿射變換。本教程將介紹如何使用C實現四維矩陣的基本運算和變換。 2. 代碼實現 2.1 頭文件 (matrix4x4.h) #ifndef MATRIX4X4_H #define MATRIX4X4_H#include <array> #…

Oracle 數據庫共享池與大池調優指南

在 Oracle 數據庫的內存管理中&#xff0c;共享池&#xff08;Shared Pool&#xff09;和大池&#xff08;Large Pool&#xff09;是 SGA&#xff08;系統全局區&#xff09;中負責緩存與資源分配的核心組件。合理配置和調優這兩個池&#xff0c;能顯著提升數據庫性能 —— 尤其…

C# Lambdab表達式 Var 類

Lambdab 是用于創建一個方法的表達式Func<參數1類型, 參數2類型, 返回值類型> fnName >(參數1 參數2) {方法代碼體}Func<int, int, bool> fnName (int a, int b) > {return a > b; };//調用時和普通方法一致 Console.WriteLine(fnName(10,20)); // false…