Spring Boot 使用Jasypt加密的完整例子
一、配置Jasypt
1.在pom.xml中導(dǎo)入依賴
<!-- Jasypt 加密工具 -->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>注釋:項(xiàng)目使用了@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加密器實(shí)例
*/
@Bean("jasyptStringEncryptor")
public StringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
// 設(shè)置加密密鑰 通過配置闡述,安全
config.setPassword(password);
//設(shè)置加密秘鑰 直接寫死,但是不安全
//config.setPassword("xj20250716");
// 設(shè)置加密算法
// 注意:Jasypt 3.0.0之后默認(rèn)算法為PBEWITHHMACSHA512ANDAES_256
// 需要JDK 9+或添加JCE支持,否則可能報(bào)錯(cuò)
// 如果使用較低版本的JDK,可以選擇兼容的算法如PBEWithMD5AndDES
config.setAlgorithm("PBEWithMD5AndDES");
// 設(shè)置密鑰獲取迭代次數(shù)
config.setKeyObtentionIterations("1000");
// 設(shè)置加密器的池大小
config.setPoolSize("1");
// 設(shè)置隨機(jī)鹽生成器
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
// 設(shè)置字符串輸出格式
config.setStringOutputType("base64");
encryptor.setConfig(config);
return encryptor;
}
}2.2 使用配置文件方式
# Jasypt配置(必須放在最前面)
jasypt:
encryptor:
bean: jasyptStringEncryptor
# 可以使用環(huán)境變量或命令行參數(shù)傳入密鑰
password: ${JASYPT_ENCRYPTOR_PASSWORD:default-secret-key}
algorithm: PBEWithMD5AndDES
iv-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;
@Autowired
public 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 程序啟動時(shí)命令行中帶入
方式一:作為程序啟動時(shí)的命令行參數(shù)來帶入
java -jar app.jar --jasypt.encryptor.password=xxxxxx
方式二:作為程序啟動時(shí)的應(yīng)用環(huán)境變量來帶入
java -Djasypt.encryptor.password=xxxxxx -jar app.jar
5.使用ENC()包裹加密密文
Jasypt使用特定格式來標(biāo)識加密的屬性值。在配置文件中,加密的值需要使用ENC(加密后的值)格式。
二、項(xiàng)目舉例
1.項(xiàng)目架構(gòu)

2.代碼實(shí)現(xiàn)
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加密器實(shí)例
*/
@Bean("jasyptStringEncryptor")
public StringEncryptor stringEncryptor() {
PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
SimpleStringPBEConfig config = new SimpleStringPBEConfig();
// 設(shè)置加密密鑰 通過配置闡述,安全
config.setPassword(password);
//設(shè)置加密秘鑰 直接寫死,但是不安全
//config.setPassword("xj20250716");
// 設(shè)置加密算法
// 注意:Jasypt 3.0.0之后默認(rèn)算法為PBEWITHHMACSHA512ANDAES_256
// 需要JDK 9+或添加JCE支持,否則可能報(bào)錯(cuò)
// 如果使用較低版本的JDK,可以選擇兼容的算法如PBEWithMD5AndDES
config.setAlgorithm("PBEWithMD5AndDES");
// 設(shè)置密鑰獲取迭代次數(shù)
config.setKeyObtentionIterations("1000");
// 設(shè)置加密器的池大小
config.setPoolSize("1");
// 設(shè)置隨機(jī)鹽生成器
config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
// 設(shè)置字符串輸出格式
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;
@Autowired
public 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控制類,用于對銘文進(jìn)行加密或者解密以及驗(yàn)證數(shù)據(jù)庫密碼
*/
@RequestMapping(value = "/jasypt",method = RequestMethod.POST)
@RestController
public class JasyptController {
@Autowired
private 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
#默認(rèn)配置
server:
port: 8080
# Jasypt配置(必須放在最前面)
#jasypt:
# encryptor:
# bean: jasyptStringEncryptor
# # 可以使用環(huán)境變量或命令行參數(shù)傳入密鑰
# password: ${JASYPT_ENCRYPTOR_PASSWORD:default-secret-key}
# algorithm: PBEWithMD5AndDES
# iv-generator-classname: org.jasypt.iv.RandomIvGenerator
# 未加密版本
#spring:
# datasource: #數(shù)據(jù)源連接信息
# 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 #切換配置,指定使用哪個(gè)profile
# 加密版本
spring:
datasource: #數(shù)據(jù)源連接信息
username: ENC(X86Cv+ch9gPTZW7sFcZ+g5NXYUEpSmnB)
password: ENC(tO+OKiSXa20LD80vOjWtjDbpf0vf31/x)
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 #切換配置,指定使用哪個(gè)profile
# 設(shè)置 Mybatis 的 xml 保存路徑
mybatis-plus:
mapper-locations: classpath:mapper/*Mapper.xml
type-aliases-package: com.xj.dao.model
configuration: # 配置打印 MyBatis 執(zhí)行的 SQL
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #需要lombok框架支持,可以添加
# 配置打印 MyBatis 執(zhí)行的 SQL
logging:
level:
com:
example:
demo: debug
---
#開發(fā)環(huán)境
server:
port: 8081
spring:
config:
activate:
on-profile: dev
---
#測試環(huán)境
server:
port: 8082
spring:
config:
activate:
on-profile: test
---
#生產(chǎn)環(huán)境
server:
port: 8083
spring:
config:
activate:
on-profile: prod
logging:
config: classpath:logback-spring.xml #指定使用哪個(gè)日志配置文件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>
<!--導(dǎo)入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>
<!--導(dǎo)入數(shù)據(jù)庫驅(qū)動-->
<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依賴 為了簡化實(shí)體類的編寫代碼量 -->
<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標(biāo)簽描述了如何來編譯及打包項(xiàng)目,而具體的編譯和打包工作是通過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.運(yùn)行結(jié)果
3.1 先將數(shù)據(jù)庫按明文啟動,然后獲取對應(yīng)的加密密文
3.1.1 加密


加密URL:
http://127.0.0.1:8081/jasypt/encrypt?encryptStr=root
3.1.2 解密驗(yàn)證


解密URL:
http://127.0.0.1:8081/jasypt/decrypt
報(bào)文:
{
"decryptStr":"X86Cv+ch9gPTZW7sFcZ+g5NXYUEpSmnB"
}
3.2 再將加密密文用ENC()包裹起來替換明文,若啟動成功,即為加密成功。
替換:

啟動成功:

三、重點(diǎn)說明
1.若解密失敗,會包如下錯(cuò)誤

2.秘鑰最好不要有特殊字符,比如“$”、"_",這樣會導(dǎo)致解密失敗,實(shí)測經(jīng)驗(yàn)
3.解密JasyptController中的decrypt不應(yīng)該用@GetMapping,因?yàn)榻饷苤械淖址喊芏嗵厥庾址热?ldquo;/”,“+”等,這些都會導(dǎo)致解密失敗。@RequestMapping + @RequestParam也不行,必須用@RequestMapping + @RequestBody。
四、感謝:
1.Jasypt概述及整合SpringBoot實(shí)現(xiàn)敏感數(shù)據(jù)加密_jasypt 原理-CSDN博客
3.springboot 跨域以及jasypt加密使用(第六章)_springboot jasypt-CSDN博客
到此這篇關(guān)于Spring Boot 使用Jasypt加密的文章就介紹到這了,更多相關(guān)Spring Boot Jasypt加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot使用Jasypt對YML文件配置內(nèi)容加密的方法(數(shù)據(jù)庫密碼加密)
- springboot3 使用 jasypt 加密配置文件的使用步驟
- JAVA(SpringBoot)集成Jasypt進(jìn)行加密、解密功能
- SpringBoot3使用Jasypt實(shí)現(xiàn)配置文件信息加密的方法
- SpringBoot整合jasypt進(jìn)行重要數(shù)據(jù)加密的操作代碼
- SpringBoot使用Jasypt對配置文件和數(shù)據(jù)庫密碼加密
- springboot使用jasypt對配置文件加密加密數(shù)據(jù)庫連接的操作代碼
- SpringBoot整合Jasypt實(shí)現(xiàn)配置加密的步驟詳解
- Springboot集成Jasypt實(shí)現(xiàn)配置文件加密的方法
相關(guān)文章
Maven熱部署devtools的實(shí)現(xiàn)示例
本文主要介紹了Maven熱部署devtools的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Java Comparable及Comparator接口區(qū)別詳解
這篇文章主要介紹了Java Comparable及Comparator接口區(qū)別詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
Java String創(chuàng)建對象實(shí)例解析
這篇文章主要介紹了Java String創(chuàng)建對象實(shí)例解析,分享了相關(guān)代碼示例,小編覺得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-02-02
OpenFeign服務(wù)接口調(diào)用的過程詳解
Feign是一個(gè)聲明式WebService客戶端。使用Feign能讓編寫Web?Service客戶端更加簡單。它的使用方法是定義一個(gè)服務(wù)接口然后在上面添加注解,這篇文章主要介紹了OpenFeign服務(wù)接口調(diào)用,需要的朋友可以參考下2022-10-10
詳解Spring?@Lazy注解為什么能破解死循環(huán)
這篇文章主要來和大家探討一下Spring中的@Lazy注解為什么能破解死循環(huán),文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,需要的可以了解一下2023-07-07
java+selenium實(shí)現(xiàn)自動化操作瀏覽器
在Web自動化的操作中,我們通常需要使用一些方法來操作瀏覽器,這篇文章主要來和大家介紹一下在自動化測試的時(shí)候,我們常見的一些瀏覽器操作有哪些,希望對大家有一定的幫助2025-05-05

