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

Spring Boot 使用Jasypt加密的完整例子

 更新時間:2025年07月24日 10:58:30   作者:人……杰  
本文介紹SpringBoot集成Jasypt加密的配置方法,涵蓋依賴導(dǎo)入、秘鑰設(shè)置、ENC()加密值使用及項目示例,重點說明秘鑰格式規(guī)范與解密請求方式,幫助實現(xiàn)敏感數(shù)據(jù)加密,感興趣的朋友一起看看吧

一、配置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>

注釋:項目使用了@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();
        // 設(shè)置加密密鑰 通過配置闡述,安全
        config.setPassword(password);
        //設(shè)置加密秘鑰 直接寫死,但是不安全
        //config.setPassword("xj20250716");
        // 設(shè)置加密算法
        // 注意:Jasypt 3.0.0之后默認(rèn)算法為PBEWITHHMACSHA512ANDAES_256
        // 需要JDK 9+或添加JCE支持,否則可能報錯
        // 如果使用較低版本的JDK,可以選擇兼容的算法如PBEWithMD5AndDES
        config.setAlgorithm("PBEWithMD5AndDES");
        // 設(shè)置密鑰獲取迭代次數(shù)
        config.setKeyObtentionIterations("1000");
        // 設(shè)置加密器的池大小
        config.setPoolSize("1");
        // 設(shè)置隨機鹽生成器
        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ù)來帶入
java -jar app.jar --jasypt.encryptor.password=xxxxxx
 
方式二:作為程序啟動時的應(yīng)用環(huán)境變量來帶入
java -Djasypt.encryptor.password=xxxxxx -jar app.jar

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

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

二、項目舉例

1.項目架構(gòu)

2.代碼實現(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加密器實例
     */
    @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支持,否則可能報錯
        // 如果使用較低版本的JDK,可以選擇兼容的算法如PBEWithMD5AndDES
        config.setAlgorithm("PBEWithMD5AndDES");
        // 設(shè)置密鑰獲取迭代次數(shù)
        config.setKeyObtentionIterations("1000");
        // 設(shè)置加密器的池大小
        config.setPoolSize("1");
        // 設(shè)置隨機鹽生成器
        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控制類,用于對銘文進行加密或者解密以及驗證數(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 #切換配置,指定使用哪個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 #切換配置,指定使用哪個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 #指定使用哪個日志配置文件

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依賴 為了簡化實體類的編寫代碼量 -->
        <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)簽描述了如何來編譯及打包項目,而具體的編譯和打包工作是通過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.運行結(jié)果

3.1 先將數(shù)據(jù)庫按明文啟動,然后獲取對應(yīng)的加密密文

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.秘鑰最好不要有特殊字符,比如“$”、"_",這樣會導(dǎo)致解密失敗,實測經(jīng)驗

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

四、感謝:

1.Jasypt概述及整合SpringBoot實現(xiàn)敏感數(shù)據(jù)加密_jasypt 原理-CSDN博客

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

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

到此這篇關(guān)于Spring Boot 使用Jasypt加密的文章就介紹到這了,更多相關(guān)Spring Boot Jasypt加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 解決dubbo錯誤ip及ip亂入問題的方法

    解決dubbo錯誤ip及ip亂入問題的方法

    今天小編就為大家分享一篇關(guān)于解決dubbo錯誤ip及ip亂入問題的方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Java設(shè)置請求響應(yīng)時間的多種實現(xiàn)方式

    Java設(shè)置請求響應(yīng)時間的多種實現(xiàn)方式

    在前后端分離的開發(fā)模式中,前端請求后端獲取數(shù)據(jù)時,合理設(shè)置響應(yīng)時間(超時時間)是提升系統(tǒng)性能和用戶體驗的關(guān)鍵,本文將深入探討如何在Java中設(shè)置請求的響應(yīng)時間,需要的朋友可以參考下
    2025-01-01
  • spring整合redis緩存并以注解(@Cacheable、@CachePut、@CacheEvict)形式使用

    spring整合redis緩存并以注解(@Cacheable、@CachePut、@CacheEvict)形式使用

    本篇文章主要介紹了spring整合redis緩存并以注解(@Cacheable、@CachePut、@CacheEvict)形式使用,具有一定的參考價值,有興趣的可以了解一下。
    2017-04-04
  • java String.split 無法使用小數(shù)點分割的問題

    java String.split 無法使用小數(shù)點分割的問題

    這篇文章主要介紹了java String.split 無法使用小數(shù)點分割的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • java.net.UnknownHostException異常的一般原因及解決步驟

    java.net.UnknownHostException異常的一般原因及解決步驟

    關(guān)于java.net.UnknownHostException大家也許都比較熟悉,這篇文章主要給大家介紹了關(guān)于java.net.UnknownHostException異常的一般原因及解決步驟,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • 深入理解spring boot異步調(diào)用方式@Async

    深入理解spring boot異步調(diào)用方式@Async

    Spring為任務(wù)調(diào)度與異步方法執(zhí)行提供了注解支持。通過在方法上設(shè)置@Async注解,可使得方法被異步調(diào)用。下面這篇文章主要給大家介紹了關(guān)于spring boot異步調(diào)用方式@Async的相關(guān)資料,需要的朋友可以參考下。
    2017-07-07
  • Java super關(guān)鍵字的使用方法詳解

    Java super關(guān)鍵字的使用方法詳解

    這篇文章主要介紹了Java super關(guān)鍵字的使用方法詳解的相關(guān)資料,希望通過本文能幫助到大家,讓大家對super關(guān)鍵字徹底掌握,需要的朋友可以參考下
    2017-10-10
  • Java客戶端連接Redis的詳細(xì)步驟

    Java客戶端連接Redis的詳細(xì)步驟

    這篇文章主要介紹了在本地IDEA通過Java連接云服務(wù)器Redis的步驟:配置Redis外部訪問(修改綁定地址和保護模式),設(shè)置端口轉(zhuǎn)發(fā)保障安全,添加Jedis依賴,編寫代碼建立連接池并執(zhí)行Redis操作,需要的朋友可以參考下
    2025-08-08
  • java springmvc亂碼解決歸納整理詳解

    java springmvc亂碼解決歸納整理詳解

    本篇文章介紹了java 中spring mvc 解決亂碼的問題方法實例,需要的朋友可以參考下
    2017-04-04
  • java 將字符串、list 寫入到文件,并讀取內(nèi)容的案例

    java 將字符串、list 寫入到文件,并讀取內(nèi)容的案例

    這篇文章主要介紹了java 將字符串、list 寫入到文件,并讀取內(nèi)容的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09

最新評論

弥渡县| 涟水县| 沧源| 灵璧县| 临汾市| 广水市| 启东市| 永吉县| 临澧县| 南华县| 江源县| 图片| 白玉县| 仁化县| 平邑县| 崇义县| 贵南县| 银川市| 象山县| 宜君县| 房产| 沙坪坝区| 杂多县| 贵德县| 扶风县| 固始县| 徐水县| 石棉县| 大名县| 杭锦旗| 册亨县| 安塞县| 尉犁县| 武城县| 万宁市| 双鸭山市| 霍山县| 营口市| 磐安县| 兴国县| 尼玛县|