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

SpringBoot整合Jasypt實(shí)現(xiàn)配置文件和數(shù)據(jù)庫(kù)字段敏感數(shù)據(jù)的加解密

 更新時(shí)間:2025年09月29日 08:42:42   作者:Micro麥可樂  
很多時(shí)候?yàn)榱吮WC數(shù)據(jù)的安全,在處理敏感數(shù)據(jù)、前后端數(shù)據(jù)傳輸、數(shù)據(jù)庫(kù)敏感數(shù)據(jù)入庫(kù)等,數(shù)據(jù)的加密和解密是不可忽視的重要環(huán)節(jié),下面我們就來(lái)看看如何在SpringBoot整合Jasypt實(shí)現(xiàn)配置文件和數(shù)據(jù)庫(kù)字段敏感數(shù)據(jù)的加解密吧

1、前言

在我們?nèi)粘i_發(fā)中,很多時(shí)候?yàn)榱吮WC數(shù)據(jù)的安全,在處理敏感數(shù)據(jù)、前后端數(shù)據(jù)傳輸、數(shù)據(jù)庫(kù)敏感數(shù)據(jù)入庫(kù)等,數(shù)據(jù)的加密和解密是不可忽視的重要環(huán)節(jié),特別是一些政企項(xiàng)目這點(diǎn)就尤為重要,避免每一次安全審計(jì)后反復(fù)的調(diào)整,所以在系統(tǒng)設(shè)計(jì)之初我們就應(yīng)當(dāng)把數(shù)據(jù)安全的問(wèn)題考慮進(jìn)去!

今天博主就給大家詳細(xì)介紹Jasypt-Spring-Boot的功能,并展示如何在Spring Boot項(xiàng)目中實(shí)現(xiàn)各種加解密操作

2、什么是Jasypt

Jasypt(Java Simplified Encryption)是一個(gè)用于加密和解密數(shù)據(jù)的Java庫(kù)。它提供了簡(jiǎn)單易用的API,可以輕松地將加密功能集成到Java應(yīng)用程序中。Jasypt支持多種加密算法,并且可以保護(hù)各種類型的數(shù)據(jù),包括文本、配置文件和數(shù)據(jù)庫(kù)字段等。

3、什么是Jasypt-Spring-Boot

Jasypt-Spring-Boot是一個(gè)用于在Spring Boot應(yīng)用程序中集成Jasypt的Starter。通過(guò)使用Jasypt-Spring-Boot,我們可以輕松地在Spring Boot項(xiàng)目中配置和使用Jasypt的加解密功能。

目前該庫(kù)已經(jīng)有2.8K的Star,且目前最新版本是 3.0.5

GitHub地址:https://github.com/ulisesbocchio/jasypt-spring-boot

4、接入初體驗(yàn)

在開始接入前首先構(gòu)建我們的 Spring Boot 項(xiàng)目, 引入相關(guān)依賴

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

4.1 yml配置方式

修改 Spring Boot 配置文件,增加密鑰

jasypt:
    encryptor:
        password: 123456

Spring Boot 啟動(dòng)類上 或配置類Configuration類上追加 @EnableEncryptableProperties注解

具體參數(shù)說(shuō)明可以查看以下表格

配置項(xiàng)必填默認(rèn)值說(shuō)明
jasypt.encryptor.password設(shè)置密鑰
jasypt.encryptor.algorithmPBEWITHHMACSHA512ANDAES_256設(shè)置算法
jasypt.encryptor.key-obtention-iterations1000設(shè)置密鑰生成的迭代次數(shù)
jasypt.encryptor.pool-size1設(shè)置加密池的大小
jasypt.encryptor.provider-nameSunJCE設(shè)置加密提供者名稱
jasypt.encryptor.provider-class-namenull設(shè)置加密提供類名
jasypt.encryptor.salt-generator-classnameorg.jasypt.salt.RandomSaltGenerator設(shè)置鹽值生成器的類名
jasypt.encryptor.iv-generator-classnameorg.jasypt.iv.RandomIvGenerator設(shè)置初始化向量生成器的類名
jasypt.encryptor.string-output-typebase64設(shè)置輸出字符串的編碼方式
jasypt.encryptor.proxy-property-sourcesfalse
jasypt.encryptor.skip-property-sourcesempty list

最后一個(gè)屬性jasypt.encryptor.proxy-property-sources用于指示jasyp-spring-boot如何攔截屬性值以進(jìn)行解密

  • 默認(rèn)值false使用PropertySourceEnumerablePropertySourceMapPropertySource的自定義包裝器實(shí)現(xiàn)。
  • 當(dāng)為該屬性指定true時(shí),攔截機(jī)制將在每個(gè)特定的PropertySource實(shí)現(xiàn)上使用CGLib代理。這在某些必須保留原始PropertySource類型的場(chǎng)景中可能很有用

4.2 自定義配置類方式

創(chuàng)建一個(gè)自定義配置類:Bean名稱為: jasyptStringEncryptor

import com.ulisesbocchio.jasyptspringboot.annotation.EnableEncryptableProperties;
import org.jasypt.encryption.StringEncryptor;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableEncryptableProperties
public class StringEncryptorConfig {
    @Bean("jasyptStringEncryptor")
    public StringEncryptor stringEncryptor() {
        PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
        SimpleStringPBEConfig config = new SimpleStringPBEConfig();
        config.setPassword("password");
        config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256");
        config.setKeyObtentionIterations("1000");
        config.setPoolSize("1");
        config.setProviderName("SunJCE");
        config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator");
        config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);
        return encryptor;
    }
}

溫馨提示

  • 在自定義StringEncryptor的時(shí)候,會(huì)覆蓋默認(rèn)的加密器,且Bean名稱固定為 jasyptStringEncryptor
  • 如果你需要自定義Bean名稱,則需要在springboot配置文件追加
    jasypt.encryptor.bean = your encryptorBean Name

如下面自定義自定義Bean名稱

    @Bean("encryptorBean")
    public StringEncryptor stringEncryptor() {
    	//參考上面的配置參數(shù)
        ...
    }

4.3 開始測(cè)試

我們現(xiàn)在來(lái)編寫一個(gè)測(cè)試類,來(lái)體驗(yàn)加解密的效果

	@Resource(name = "jasyptStringEncryptor")
    private StringEncryptor stringEncryptor;

    @Test
    public void testJasypt() {
        String mysqlRoot = stringEncryptor.encrypt("root");
        String mysqlPassword = stringEncryptor.encrypt("123456");
        System.out.println("mysqlroot加密后:"+mysqlRoot);
        System.out.println("mysqlPassword加密后:"+mysqlPassword);
        System.out.println("===================");
        System.out.println("mysqlRoot解密后:"+ stringEncryptor.decrypt(mysqlRoot));
        System.out.println("mysqlPassword解密后:"+ stringEncryptor.decrypt(mysqlPassword));
    }

測(cè)試輸出如下:

4.4 修改mysql參數(shù)加密

我們已經(jīng)獲得了mysql加密后的賬號(hào)以及密碼,現(xiàn)在我們來(lái)給mysql配置的明文賬戶密碼改一下

加密格式:默認(rèn)的前后綴是 ENC() 括號(hào)里是密文

# 數(shù)據(jù)源配置
spring:
    #數(shù)據(jù)源配置
    datasource:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.cj.jdbc.Driver
        druid:
            url: jdbc:mysql://localhost:3306/docker_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
            # 未加密前
            #username: root
            #password: 123456
            # 加密后
            username: ENC(TBTl1fiJ7tilJ91sEdym6G8vEQG7Wn3QhIBU77mrfzCtqkHPMEMAihvpjokqUgMP)
            password: ENC(9galEBTwYzgGG6ER3oY+k45463tkvYSnt+epH8SE/hldbi13hg3+XL7CPKpgJAQp)

啟動(dòng)SpringBoot項(xiàng)目。觀察控制臺(tái)輸出,數(shù)據(jù)庫(kù)是否完成連接初始化,且項(xiàng)目啟動(dòng)成功!

特別說(shuō)明

小伙伴發(fā)現(xiàn)了在mysql的配置中,我們使用 ENC() 來(lái)包裹我們的密文,這個(gè)前后綴是可以修改的,如MICRO()

修改配置文件方式

jasypt:
  encryptor:
    property:
      prefix: "MICRO["
      suffix: "]"

編碼方式

我們可以通過(guò)創(chuàng)建一個(gè)名為 encryptablePropertyDetector 類型為 EncryptablePropertyDetector 的Bean來(lái)覆蓋默認(rèn)實(shí)現(xiàn),如果你需要修改默認(rèn)名稱,需要覆蓋屬性 jasypt.encryptor.property.detector-bean 并指定您希望給予bean的名稱

private static class MyEncryptablePropertyDetector implements EncryptablePropertyDetector {
    @Override
    public boolean isEncrypted(String value) {
        if (value != null) {
            return value.startsWith("MICRO");
        }
        return false;
    }
    @Override
    public String unwrapEncryptedValue(String value) {
        return value.substring("MICRO".length());
    }
}
@Bean(name = "encryptablePropertyDetector")
    public EncryptablePropertyDetector encryptablePropertyDetector() {
        return new MyEncryptablePropertyDetector();
    }

5、使用JVM啟動(dòng)參數(shù)設(shè)置密鑰

在我們 YML 配置方式中, jasypt.encryptor.password=123456 是明文的,有小伙伴會(huì)問(wèn),哎呀這不也是暴露了加密密鑰么? 要解決這個(gè)問(wèn)題,我們可以使用JVM啟動(dòng)參數(shù)設(shè)置

在IDEA項(xiàng)目里 ,點(diǎn)擊 Edit Configurations ,添加 VM 啟動(dòng)參數(shù) -Djasypt.encryptor.password=123456

在生產(chǎn)環(huán)境部署jar包的時(shí)候,可以使用如下命令啟動(dòng):

java -jar your-project.jar --jasypt.encryptor.password=password

6、加密和解密數(shù)據(jù)庫(kù)字段

在我們公司某些項(xiàng)目中,用戶的敏感信息是不允許明文存儲(chǔ)數(shù)據(jù)庫(kù)的,比如手機(jī)號(hào)、身份證等,接下來(lái)我們來(lái)演示如何在實(shí)體類中使用Jasypt進(jìn)行數(shù)據(jù)庫(kù)字段實(shí)現(xiàn)加解密

注意引入JPA支持 spring-boot-starter-data-jpa

import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import org.jasypt.util.text.AES256TextEncryptor;

@Component
@Converter
public class EncryptedStringConverter implements AttributeConverter<String, String> {

    @Resource(name = "jasyptStringEncryptor")
    private StringEncryptor stringEncryptor;

    @Override
    public String convertToDatabaseColumn(String attribute) {
        return stringEncryptor.encrypt(attribute);
    }

    @Override
    public String convertToEntityAttribute(String dbData) {
        return stringEncryptor.decrypt(dbData);
    }
}

然后在實(shí)體類中使用這個(gè)轉(zhuǎn)換器

import javax.persistence.Column;
import javax.persistence.Convert;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Convert(converter = EncryptedStringConverter.class)
    @Column(name = "password")
    private String password;

    // Getters and Setters
}

7、結(jié)語(yǔ)

Jasypt-Spring-Boot是一個(gè)強(qiáng)大且易于使用的工具,可以在Spring Boot應(yīng)用程序中實(shí)現(xiàn)加密和解密操作。通過(guò)本文的介紹,我們了解了如何在Spring Boot項(xiàng)目中配置和使用Jasypt,并展示了各種加解密操作的實(shí)現(xiàn)方法。

以上就是SpringBoot整合Jasypt實(shí)現(xiàn)配置文件和數(shù)據(jù)庫(kù)字段敏感數(shù)據(jù)的加解密的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Jasypt加解密的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot切面實(shí)現(xiàn)token權(quán)限校驗(yàn)詳解

    SpringBoot切面實(shí)現(xiàn)token權(quán)限校驗(yàn)詳解

    這篇文章主要介紹了SpringBoot切面實(shí)現(xiàn)token權(quán)限校驗(yàn)詳解,要實(shí)現(xiàn)權(quán)限校驗(yàn),首先數(shù)據(jù)表和實(shí)體類上需要有權(quán)限字段,我的表中permission和gender是通過(guò)外鍵約束permission表和gender表實(shí)現(xiàn)枚舉的,因?yàn)榭赏卣剐愿?需要的朋友可以參考下
    2024-01-01
  • java中HashMap的七種遍歷方式小結(jié)

    java中HashMap的七種遍歷方式小結(jié)

    本文主要介紹了java中HashMap的七種遍歷方式小結(jié),包括迭代器,For Each,Lambda,Streams API等,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • Java?synchronized底層實(shí)現(xiàn)原理以及鎖優(yōu)化

    Java?synchronized底層實(shí)現(xiàn)原理以及鎖優(yōu)化

    Synchronized是Java中解決并發(fā)問(wèn)題的一種最常用的方法,也是最簡(jiǎn)單的一種方法,下面這篇文章主要給大家介紹了關(guān)于Java?synchronized底層實(shí)現(xiàn)原理以及鎖優(yōu)化的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • 深入理解Java編程線程池的實(shí)現(xiàn)原理

    深入理解Java編程線程池的實(shí)現(xiàn)原理

    這篇文章主要介紹了深入理解Java編程線程池的實(shí)現(xiàn)原理,涉及ThreadPoolExecutor類,線程池實(shí)現(xiàn)原理及示例等相關(guān)內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Java中map和flatMap的區(qū)別舉例詳解

    Java中map和flatMap的區(qū)別舉例詳解

    這篇文章主要給大家介紹了關(guān)于Java中map和flatMap區(qū)別的相關(guān)資料,在Java中Stream接口有map()和flatmap()方法,兩者都有中間流操作,并返回另一個(gè)流作為方法輸出,需要的朋友可以參考下
    2023-10-10
  • Spring MVC獲取查詢參數(shù)及路徑參數(shù)代碼實(shí)例

    Spring MVC獲取查詢參數(shù)及路徑參數(shù)代碼實(shí)例

    這篇文章主要介紹了Spring MVC獲取查詢參數(shù)及路徑參數(shù)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Apache POI導(dǎo)出Excel遇NoClassDefFoundError的原因分析與解決方案

    Apache POI導(dǎo)出Excel遇NoClassDefFoundError的原因分析與解決方案

    在日常的Java開發(fā)中,我們經(jīng)常需要實(shí)現(xiàn)數(shù)據(jù)導(dǎo)出到Excel的功能,本文將簡(jiǎn)單介紹Apache POI導(dǎo)出Excel遇NoClassDefFoundError錯(cuò)誤的原因與解決,希望對(duì)大家有所幫助
    2025-10-10
  • Java注解Annotation的使用詳解

    Java注解Annotation的使用詳解

    文章介紹了Java注解的基本概念、定義使用方法、元注解(如@Retention、@Target)的作用及內(nèi)置注解(@Override、@Deprecated、@SuppressWarnings)的功能與應(yīng)用場(chǎng)景,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • SpringCloud Gateway 利用 Mysql 實(shí)現(xiàn)動(dòng)態(tài)路由的方法

    SpringCloud Gateway 利用 Mysql 實(shí)現(xiàn)動(dòng)態(tài)路由的方法

    這篇文章主要介紹了SpringCloud Gateway 利用 Mysql 實(shí)現(xiàn)動(dòng)態(tài)路由的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-02-02
  • 基于SpringMVC入門案例及講解

    基于SpringMVC入門案例及講解

    這篇文章主要介紹了基于SpringMVC入門案例及講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評(píng)論

称多县| 灵川县| 龙里县| 湛江市| 衡阳县| 阿尔山市| 太仆寺旗| 乌兰县| 榆树市| 三都| 家居| 临夏县| 外汇| 交城县| 虞城县| 许昌县| 鲜城| 股票| 弥勒县| 随州市| 弋阳县| 九江县| 青川县| 邵阳县| 安福县| 黔东| 乡城县| 神农架林区| 越西县| 舒城县| 黄龙县| 泸西县| 唐海县| 民权县| 邹平县| 峨眉山市| 西和县| 泰州市| 枣阳市| 湾仔区| 通化县|