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

Springboot采用jasypt加密配置的項(xiàng)目實(shí)踐

 更新時(shí)間:2024年12月06日 08:30:21   作者:竹鹿眾猿  
本文主要介紹了在Spring Boot項(xiàng)目中使用Jasypt對(duì)配置文件中的敏感信息進(jìn)行加密,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

在以往的多數(shù)項(xiàng)目中,配置文件中的數(shù)據(jù)庫(kù)密碼、redis密碼、nacos密碼等敏感性信息一般是以明文形式存在,存在泄露的風(fēng)險(xiǎn),因此,對(duì)敏感信息加固是很有必要,加固的一個(gè)重要環(huán)節(jié)就是對(duì)重要信息做加密處理。

這里簡(jiǎn)單的介紹一下Jasypt加密

一、Jasypt簡(jiǎn)介

Jasypt 是一個(gè) java 庫(kù),可以使開發(fā)者不需要太多操作來給 Java 項(xiàng)目添加基本加密功能,而且不需要知道加密原理。Jasypt 為開發(fā)人員提供了一種簡(jiǎn)單易用加密功能,包括:密碼認(rèn)證、字符串加密等。

二、運(yùn)用場(chǎng)景

一般來說,項(xiàng)目配置文件里,所有涉及信息安全的配置項(xiàng)(或字段)都應(yīng)該做處理,典型的比如:

  • 數(shù)據(jù)庫(kù)密碼,如mysql、oracle
  • 緩存中間件的密碼,如 redis、mongodb
  • 其他中間件,如消息中間件、zk、nacos等
  • 第三方服務(wù)的,如appid、 Access_Key

三、整合Jasypt

官方示例:GitHub - ulisesbocchio/jasypt-spring-boot-samples: Sample apps using jasypt-spring-boot

3.1.環(huán)境配置

  • ?SpringBoot 2.0以上
  • ?Jasypt 3.0.5
  • ?jdk1.8

3.2.添加依賴

在項(xiàng)目 pom.xml 添加 Jasypt 相關(guān)依賴。

<!-- https://mvnrepository.com/artifact/com.github.ulisesbocchio/jasypt-spring-boot-starter -->
<dependency>
    <groupId>com.github.ulisesbocchio</groupId>
    <artifactId>jasypt-spring-boot-starter</artifactId>
    <version>3.0.5</version>
</dependency>

3.3.添加Jasypt配置

jasypt:
  encryptor:
    password: 123456
    algorithm: PBEWITHHMACSHA512ANDAES_256
    iv-generator-classname: org.jasypt.iv.RandomIvGenerator
    salt-generator-classname: org.jasypt.salt.RandomSaltGenerator
    string-output-type: base64
    provider-name: SunJCE
    pool-size: 1
    key-obtention-iterations: 1000
    property:
      # 標(biāo)識(shí)為加密屬性的前綴
      prefix: ENC(
      # 標(biāo)識(shí)為加密屬性的后綴
      suffix: )

2.4.編寫加/解密工具類

package com.bexk.util;

import java.util.Base64;
import org.jasypt.encryption.pbe.PooledPBEStringEncryptor;
import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig;

/**
 * @Description: 加解密密算法
 * @Author developer
 * @Date 2024/10/11 9:48 上午
 */
public class JasyptUtil {

    /**
     * PBE 算法
     */
    public static final String PBE_ALGORITHMS_MD5_DES = "PBEWITHMD5ANDDES";
    public static final String PBE_ALGORITHMS_SHA512_AES_256 = "PBEWithHMACSHA512ANDAES_256";

    private JasyptUtil() {
    }

    /**
     * 加密
     *
     * @param encryptedStr 加密字符串
     * @param password     鹽值
     * @return
     */
    public static String encrypt(String encryptedStr, String password) {
        return encrypt(encryptedStr, PBE_ALGORITHMS_MD5_DES, password);
    }

    /**
     * 加密
     *
     * @param encryptedStr 加密字符串
     * @param algorithm    加密算法
     * @param password     鹽值
     * @return
     */
    public static String encrypt(String encryptedStr, String algorithm, String password) {        
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        EnvironmentPBEConfig config = new EnvironmentPBEConfig();

        // 指定加密算法
        config.setAlgorithm(algorithm);
        // 加密鹽值
        config.setPassword(password);
        config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");
        encryptor.setConfig(config);

        // 加密
        return encryptor.encrypt(encryptedStr);
    }

    /**
     * 解密
     *
     * @param decryptStr 解密字符串
     * @param password   鹽值
     * @return
     */
    public static String decrypt(String decryptStr, String password) {
        return decrypt(decryptStr, PBE_ALGORITHMS_MD5_DES, password);
    }

    /**
     * 解密
     *
     * @param decryptStr 解密字符串
     * @param algorithm  指定解密算法
     * @param password   鹽值
     * @return
     */
    public static String decrypt(String decryptStr, String algorithm, String password) {
        StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
        EnvironmentPBEConfig config = new EnvironmentPBEConfig();

        // 指定解密算法:解密算法要與加密算法一一對(duì)應(yīng)
        config.setAlgorithm(algorithm);
        // 加密秘鑰
        config.setPassword(password);
        config.setIvGeneratorClassName("org.jasypt.iv.NoIvGenerator");
        encryptor.setConfig(config);

        // 解密
        return encryptor.decrypt(decryptStr);
    }

}

修改配置文件

如圖,通過編寫加/解密工具類得到對(duì)應(yīng)的加密結(jié)果,然后將配置文件的原始明文密碼替換成上一步對(duì)應(yīng)的結(jié)果,并通過 ENC(加密結(jié)果) 包裹起來。

加密前:

加密后:

2.5.自定義加密屬性前綴和后綴

如果您只想為加密屬性使用不同的前綴/后綴,則可以繼續(xù)使用所有默認(rèn)實(shí)現(xiàn),只需覆蓋 application.yml (或 application.properties)中的以下屬性(property):

jasypt:
  encryptor:
    property:
      prefix: "ENC@["
      suffix: "]"

2.6.防止密碼泄露措施

若使用的是默認(rèn)的加密規(guī)則,會(huì)讓當(dāng)自定義加密鹽值(jasypt.encryptor.password) 泄漏,可能變得不安全。那么如何進(jìn)一步防止密碼泄露呢?

2.61.自定義加密器

自定義加密規(guī)則非常簡(jiǎn)單,只需要提供自定義的加密器配置類,然后通過jasypt.encryptor.bean配置指定加密配置類即可。

@Bean(name = "encryptorBean")
    static 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.NoIvGenerator");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);
        return encryptor;
    }

也將自定義加密器添加到 Spring IoC 容器中。

@Configuration
public class JasyptConfig {
    /**
     * 加解密鹽值
     */
    @Value("${jasypt.encryptor.password}")
    private String password;

    // @Bean("jasyptStringEncryptor")
    @Bean("encryptorBean")
    public StringEncryptor myStringEncryptor() {
        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.NoIvGenerator");
        config.setStringOutputType("base64");
        encryptor.setConfig(config);
        return encryptor;
    }
}

修改配置文件

jasypt:
  encryptor:
    # 指定加解密bean的名稱,默認(rèn)jasyptStringEncryptor
    bean: encryptorBean
    # 鹽值
    password: 123456
    #省略其它

注意事項(xiàng):Jasypt默認(rèn)加解密器bean的Name為 jasyptStringEncryptor,若不想在配置文件中指定自定義加密器名稱,需將自定義加密器bean的Name設(shè)置為jasyptStringEncryptor,否則將不生效。

Springcloud項(xiàng)目最好不要采用自定義,容易出現(xiàn)找不到bean的問題。

2.6.2通過環(huán)境變量指定加密鹽值

方式一:直接作為程序啟動(dòng)時(shí)的命令行參數(shù)

java -jar test.jar --jasypt.encryptor.password=鹽值

方式二:直接作為程序啟動(dòng)時(shí)的應(yīng)用環(huán)境變量

java -Djasypt.encryptor.password=鹽值 -jar test.jar

如果通過Docker部署,請(qǐng)?jiān)贓NTRYPOINT加上對(duì)應(yīng)參數(shù),比如:

ENTRYPOINT ["java","-Djasypt.encryptor.password=test","-jar","test.jar"]

方式三:直接作為系統(tǒng)環(huán)境變量

1. 設(shè)置系統(tǒng)環(huán)境變量 :JASYPT_PWD

   在windows系統(tǒng)設(shè)置:

在eclipse設(shè)置,如圖:

在idea中設(shè)置,需要通過VM options設(shè)置,如圖:

在linux系統(tǒng)設(shè)置

#打開全局配置文件:      
sudo vim /etc/profile
#編輯全局配置文件:      
export JASYPT_PWD=nrmZtkF7T0kjG
#重載profile配置文件:  
source /etc/profile

2. Spring Boot的項(xiàng)目配置文件指定系統(tǒng)環(huán)境變量:

jasypt:
  encryptor:
    password: ${JASYPT_PWD:123456}

總結(jié)

本文介紹了如何在Springboot項(xiàng)目中使用Jasypt對(duì)配置文件中的敏感信息進(jìn)行加密,包括環(huán)境配置、依賴添加、配置設(shè)置、自定義加密器和使用環(huán)境變量管理鹽值,以提升項(xiàng)目的安全性。

到此這篇關(guān)于Springboot采用jasypt加密配置的項(xiàng)目實(shí)踐的文章就介紹到這了,更多相關(guān)Springboot jasypt加密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java虛擬機(jī)調(diào)用Java主類的main()方法

    Java虛擬機(jī)調(diào)用Java主類的main()方法

    這篇文章主要介紹了Java虛擬機(jī)調(diào)用Java主類的main()方法,前一篇文章我們介紹了關(guān)于Java虛擬機(jī)HotSpot
    2021-11-11
  • SpringBoot中4種數(shù)據(jù)水平分片策略

    SpringBoot中4種數(shù)據(jù)水平分片策略

    數(shù)據(jù)水平分片作為一種水平擴(kuò)展策略,通過將數(shù)據(jù)分散到多個(gè)物理節(jié)點(diǎn)上,有效解決了存儲(chǔ)容量和性能瓶頸問題,下面小編就來和大家分享4種數(shù)據(jù)分片策略吧
    2025-06-06
  • Hibernate+JDBC實(shí)現(xiàn)批量插入、更新及刪除的方法詳解

    Hibernate+JDBC實(shí)現(xiàn)批量插入、更新及刪除的方法詳解

    這篇文章主要介紹了Hibernate+JDBC實(shí)現(xiàn)批量插入、更新及刪除的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Hibernate與JDBC針對(duì)數(shù)據(jù)庫(kù)的批量操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-11-11
  • Java基于IO流讀取文件的方法

    Java基于IO流讀取文件的方法

    這篇文章主要介紹了Java基于IO流讀取文件的方法,涉及Java文件流操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • Java設(shè)計(jì)模式之原型模式的示例詳解

    Java設(shè)計(jì)模式之原型模式的示例詳解

    原型模式(Prototype Pattern)指使用原型實(shí)例指定創(chuàng)建對(duì)象的種類,并且通過拷貝這些原型創(chuàng)建新的對(duì)象。本文將通過案例詳細(xì)講解一下原型模式,感興趣的可以了解一下
    2022-02-02
  • JDK的具體安裝步驟(帶圖帶解釋巨詳細(xì))

    JDK的具體安裝步驟(帶圖帶解釋巨詳細(xì))

    Java是一種廣泛使用的編程語言,許多應(yīng)用程序和系統(tǒng)都依賴于它,如果您想進(jìn)行Java編程或運(yùn)行Java應(yīng)用程序,首先需要安裝Java開發(fā)工具包(JDK),這篇文章主要給大家介紹了關(guān)于JDK具體安裝步驟的相關(guān)資料,文中介紹的方法帶圖帶解釋巨詳細(xì),需要的朋友可以參考下
    2024-05-05
  • Mybatis-plus selectByMap條件查詢方式

    Mybatis-plus selectByMap條件查詢方式

    這篇文章主要介紹了Mybatis-plus selectByMap條件查詢方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • JDK14性能管理工具之jstack使用介紹

    JDK14性能管理工具之jstack使用介紹

    jstack工具主要用來打印java堆棧信息,主要是java的class名字,方法名,字節(jié)碼索引,行數(shù)等信息。這篇文章主要介紹了JDK14性能管理工具之jstack使用介紹,需要的朋友可以參考下
    2020-05-05
  • jenkins按模塊進(jìn)行構(gòu)建遇到的問題及解決方案

    jenkins按模塊進(jìn)行構(gòu)建遇到的問題及解決方案

    這篇文章主要介紹了jenkins按模塊進(jìn)行構(gòu)建的問題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • springboot整合日志處理Logback的實(shí)現(xiàn)示例

    springboot整合日志處理Logback的實(shí)現(xiàn)示例

    Logback是由log4j創(chuàng)始人設(shè)計(jì)的又一個(gè)開源日志組件,本文主要介紹了springboot整合日志處理Logback,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01

最新評(píng)論

越西县| 金湖县| 新密市| 中牟县| 新巴尔虎左旗| 桂平市| 绍兴市| 绥江县| 普兰店市| 陈巴尔虎旗| 侯马市| 肥西县| 灌云县| 方城县| 丹凤县| 离岛区| 阿鲁科尔沁旗| 贺州市| 巴中市| 泰州市| 嵊州市| 五寨县| 裕民县| 江华| 卢湾区| 阿巴嘎旗| 花莲市| 探索| 荔波县| 京山县| 长丰县| 托克逊县| 吉安市| 湟源县| 彭山县| 德兴市| 萨嘎县| 萍乡市| 边坝县| 突泉县| 宁陵县|