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

SpringBoot配置文件中密碼屬性加密的實(shí)現(xiàn)

 更新時(shí)間:2022年07月20日 10:32:27   作者:灑脫的智障  
本文主要介紹了SpringBoot配置文件中密碼屬性加密的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

本文主要介紹了SpringBoot配置文件中的明文密碼如何加密保存,讀取以及對(duì)于自定義的加密算法加密的參數(shù)如何保存和讀取。

背景

為了安全的需要,一些重要的信息比如數(shù)據(jù)庫(kù)密碼不能明文保存在配置文件中,需要進(jìn)行加密之后再保存。SpringBoot可以使用jasypt-spring-boot這個(gè)組件來(lái)為配置屬性提供加密的支持。

集成jasypt-spring-boot到項(xiàng)目中

根據(jù)官方README文檔,可以有三種方式集成jasypt-spring-boot到項(xiàng)目中。

對(duì)于SpringBoot項(xiàng)目,直接通過(guò)引入jasypt-spring-boot-starter,然后所有的application.properties, application-*.properties, yaml的配置文件中就可以包含加密的屬性。

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

直接引入jasypt-spring-boot,這時(shí)候需要在啟動(dòng)類上添加一個(gè)@EnableEncryptableProperties,然后在配置文件中可以包含有加密的字段屬性。

@SpringBootApplication
@EnableEncryptableProperties
public class Application {
    ...
}

如果不想要整個(gè)Spring的配置文件都啟用加密的字段屬性,還可以自己指定對(duì)應(yīng)加密的配置文件路徑。也需要引入jasypt-spring-boot,同時(shí)在啟動(dòng)類上添加@EncryptablePropertySource注解,設(shè)置注解的value屬性為需要讀取的加密配置文件路徑。

@SpringBootApplication
@EncryptablePropertySource({"classpath:encrypted.properties"})
public class Application {
    ...
}

配置文件配置加密與讀取

現(xiàn)在知道了如何集成jasypt-spring-boot到項(xiàng)目中,下面就介紹一下如何加密明文的密碼,以及需要如何存儲(chǔ)在配置文件中。

首先,需要添加一個(gè)maven的插件,這個(gè)插件可以幫助我們加密我們需要的明文信息。

<plugin>
	<groupId>com.github.ulisesbocchio</groupId>
	<artifactId>jasypt-maven-plugin</artifactId>
	<version>3.0.4</version>
</plugin>

之后,執(zhí)行如下的mvn命令,可以在控制臺(tái)得到對(duì)于的密文。然后將配置文件中明文替換為加密后的密文。

mvn jasypt:encrypt-value -Djasypt.encryptor.password="TKzhc3fz" -Djasypt.plugin.value="123456"

-Djasypt.encryptor.password參數(shù)指定用于加密密碼,我理解這個(gè)應(yīng)該和秘鑰類似。

-Djasypt.plugin.value參數(shù)指定需要加密的明文參數(shù)。

執(zhí)行命令后,可以在控制臺(tái)看到加密后的密文,密文默認(rèn)是用ENC()格式包圍住的,當(dāng)然這個(gè)格式也可以自定義。

也可以通過(guò)這個(gè)mvn插件解密,執(zhí)行如下命令,可以在控制臺(tái)看到解密之后的明文。

mvn jasypt:decrypt-value -Djasypt.encryptor.password="TKzhc3fz" -Djasypt.plugin.value="ENC(Muhq57xdiHA5jJX9pX7zmNz57w4emX2D/XYIXOMEx0LYcTL7RYyadWe2J7GCi9KJ)"

在SpringBoot配置文件中,添加jasypt.encryptor.password屬性,這個(gè)值和第二步生成密文的值要一樣,不然解密會(huì)失敗。

jasypt:
  encryptor:
    password: TKzhc3fz # 設(shè)置加密的password信息 類似秘鑰?
test:
  password: ENC(Muhq57xdiHA5jJX9pX7zmNz57w4emX2D/XYIXOMEx0LYcTL7RYyadWe2J7GCi9KJ) # 測(cè)試數(shù)據(jù)

這樣在主程序啟動(dòng)的時(shí)候,通過(guò)@Value注解就可以自動(dòng)解密配置文件中的密文信息了,這樣就完成了明文的加密以及后續(xù)的讀取。

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-muDkBMKU-1643293746249)(/Users/yuanzhihao/Desktop/截屏2022-01-27 下午10.14.26.jpg)]

工作原理簡(jiǎn)析

參照官方文檔,大概的工作原理如下:

首先,在Spring容器啟動(dòng)之后,會(huì)遍歷配置文件中的所有的配置,然后發(fā)現(xiàn)所有按照jasypt約定規(guī)則加密的屬性,此處就是使用ENC()包圍的參數(shù),這個(gè)ENC()前綴和后綴是可以自定義的,下面會(huì)講到。

這邊主要是有兩個(gè)接口,分別是EncryptablePropertyDetector、EncryptablePropertyResolver,這兩個(gè)接口根據(jù)名稱可以看出來(lái)一個(gè)是發(fā)現(xiàn)器,一個(gè)是分解器。

先來(lái)看EncryptablePropertyDetector這個(gè)接口,這個(gè)接口提供了兩個(gè)方法,isEncrypted和unwrapEncryptedValue,isEncrypted方法判斷是否是jasypt約定規(guī)則加密的屬性,unwrapEncryptedValue方法會(huì)返回去除掉前綴和后綴的真正加密的值,可以看下該接口默認(rèn)的實(shí)現(xiàn)DefaultPropertyDetector:

/**
 * Default property detector that detects encrypted property values with the format "$prefix$encrypted_value$suffix"
 * Default values are "ENC(" and ")" respectively.
 *
 * @author Ulises Bocchio
 */
public class DefaultPropertyDetector implements EncryptablePropertyDetector {
    // 默認(rèn)的前綴和后綴
    private String prefix = "ENC(";
    private String suffix = ")";

    public DefaultPropertyDetector() {
    }

    public DefaultPropertyDetector(String prefix, String suffix) {
        Assert.notNull(prefix, "Prefix can't be null");
        Assert.notNull(suffix, "Suffix can't be null");
        this.prefix = prefix;
        this.suffix = suffix;
    }

    // 判斷配置屬性是否是按照jasypt約定規(guī)則加密的屬性
    @Override
    public boolean isEncrypted(String property) {
        if (property == null) {
            return false;
        }
        final String trimmedValue = property.trim();
        return (trimmedValue.startsWith(prefix) &&
                trimmedValue.endsWith(suffix));
    }

    // 去掉默認(rèn)的前綴和后綴,返回加密的值
    @Override
    public String unwrapEncryptedValue(String property) {
        return property.substring(
                prefix.length(),
                (property.length() - suffix.length()));
    }
}

EncryptablePropertyResolver這個(gè)接口中只提供了一個(gè)方法resolvePropertyValue,這個(gè)方法會(huì)遍歷配置文件屬性,判斷是否是加密屬性,然后進(jìn)行解密返回明文。在默認(rèn)實(shí)現(xiàn)DefaultPropertyResolver中,依賴EncryptablePropertyDetector以及StringEncryptor,真正解密的方法是寫(xiě)在StringEncryptor,這邊具體如何解密就不詳細(xì)描述了,有興趣可以自行看下。DefaultPropertyResolver類:

/**
 * @author Ulises Bocchio
 */
public class DefaultPropertyResolver implements EncryptablePropertyResolver {

    private final Environment environment;
    // 加密和解密的實(shí)現(xiàn)
    private StringEncryptor encryptor;
    // jasypt默認(rèn)發(fā)現(xiàn)器
    private EncryptablePropertyDetector detector;

    public DefaultPropertyResolver(StringEncryptor encryptor, Environment environment) {
        this(encryptor, new DefaultPropertyDetector(), environment);
    }

    public DefaultPropertyResolver(StringEncryptor encryptor, EncryptablePropertyDetector detector, Environment environment) {
        this.environment = environment;
        Assert.notNull(encryptor, "String encryptor can't be null");
        Assert.notNull(detector, "Encryptable Property detector can't be null");
        this.encryptor = encryptor;
        this.detector = detector;
    }

    @Override
    public String resolvePropertyValue(String value) {
        // 該方法獲取加密的屬性,然后使用StringEncryptor解密并返回
        return Optional.ofNullable(value)
                .map(environment::resolvePlaceholders)
                .filter(detector::isEncrypted) // 過(guò)濾加密屬性
                .map(resolvedValue -> {
                    try {
                        // 去除前綴和后綴獲取真正加密的值
                        String unwrappedProperty = detector.unwrapEncryptedValue(resolvedValue.trim());
                        String resolvedProperty = environment.resolvePlaceholders(unwrappedProperty);
                        // 解密獲得明文
                        return encryptor.decrypt(resolvedProperty);
                    } catch (EncryptionOperationNotPossibleException e) {
                        throw new DecryptionException("Unable to decrypt property: " + value + " resolved to: " + resolvedValue + ". Decryption of Properties failed,  make sure encryption/decryption " +
                                "passwords match", e);
                    }
                })
                .orElse(value);
    }
}

使用自定義的加密算法

如果不想要使用jasypt工具中的加密算法,或者內(nèi)部要求使用某種特定的加密算法,jasypt-spring-boot組件也提供了自定義加解密的實(shí)現(xiàn)方式。上面在工作原理簡(jiǎn)析中提到了兩個(gè)接口EncryptablePropertyDetector、EncryptablePropertyResolver,我們可以通過(guò)自己實(shí)現(xiàn)這兩個(gè)接口的方式,并且指定對(duì)應(yīng)的bean名稱為encryptablePropertyDetector和encryptablePropertyResolver來(lái)覆蓋框架提供的默認(rèn)實(shí)現(xiàn),完成加密算法和前綴后綴的自定義。

這邊我就用base64加密算法舉例,實(shí)現(xiàn)自定義的加密算法:

自己實(shí)現(xiàn)EncryptablePropertyDetector、EncryptablePropertyResolver接口,并且交給Spring管理,設(shè)置bean名稱為encryptablePropertyDetector和encryptablePropertyResolver。

重寫(xiě)接口對(duì)應(yīng)的方法。

@Component("encryptablePropertyDetector")
public class Base64EncryptablePropertyDetector implements EncryptablePropertyDetector {
    private static final String PREFIX = "password:";

    @Override
    public boolean isEncrypted(String property) {
        if (property == null) {
            return false;
        }
        return property.startsWith(PREFIX);
    }

    @Override
    public String unwrapEncryptedValue(String property) {
        return property.substring(PREFIX.length());
    }
}
@Component("encryptablePropertyResolver")
public class Base64EncryptablePropertyResolver implements EncryptablePropertyResolver {
    @Autowired
    private Base64EncryptablePropertyDetector encryptablePropertyDetector;

    @Override
    public String resolvePropertyValue(String value) {
        return Optional.ofNullable(value)
            .filter(encryptablePropertyDetector::isEncrypted)
            .map(resolveValue -> {
                final String unwrapEncryptedValue = encryptablePropertyDetector.unwrapEncryptedValue(resolveValue);
                return new String(Base64.getDecoder().decode(unwrapEncryptedValue),
                    StandardCharsets.UTF_8);
            })
            .orElse(value);
    }
}

配置文件中的加密屬性使用自定義的前綴和后綴。這邊明文先使用base64加密,之后加上“password:”前綴:

jasypt:
  encryptor:
    password: TKzhc3fz # 設(shè)置加密的password信息 類似秘鑰?
test:
  password: password:MTIzNDU2 # 測(cè)試數(shù)據(jù)

啟動(dòng)和讀取。

結(jié)語(yǔ)

參考鏈接:https://github.com/ulisesbocchio/jasypt-spring-boot

代碼地址:https://github.com/yzh19961031/SpringCloudDemo

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

相關(guān)文章

  • IntelliJ IDEA 2020下載與安裝教程圖文詳解

    IntelliJ IDEA 2020下載與安裝教程圖文詳解

    這篇文章主要介紹了IDEA 2020下載與安裝的教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 淺談java線程join方法使用方法

    淺談java線程join方法使用方法

    這篇文章主要介紹了淺談java線程join方法使用方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 關(guān)于Long和Integer相互轉(zhuǎn)換方式

    關(guān)于Long和Integer相互轉(zhuǎn)換方式

    這篇文章主要介紹了關(guān)于Long和Integer相互轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Java Calendar類使用案例詳解

    Java Calendar類使用案例詳解

    這篇文章主要介紹了Java Calendar類使用案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • 教你快速學(xué)會(huì)JPA中所有findBy語(yǔ)法規(guī)則

    教你快速學(xué)會(huì)JPA中所有findBy語(yǔ)法規(guī)則

    這篇文章主要介紹了教你快速學(xué)會(huì)JPA中所有findBy語(yǔ)法規(guī)則,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java解析xml的4種方式的優(yōu)缺點(diǎn)對(duì)比及實(shí)現(xiàn)詳解

    java解析xml的4種方式的優(yōu)缺點(diǎn)對(duì)比及實(shí)現(xiàn)詳解

    這篇文章主要介紹了java解析xml的4種方式的優(yōu)缺點(diǎn)對(duì)比及實(shí)現(xiàn)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 百度Java面試題 前200頁(yè)精選(中)

    百度Java面試題 前200頁(yè)精選(中)

    這篇文章主要為大家分享了Java面試資源中篇,百度“Java面試題”前200頁(yè)都在這里了,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Java分支結(jié)構(gòu)程序設(shè)計(jì)實(shí)例詳解

    Java分支結(jié)構(gòu)程序設(shè)計(jì)實(shí)例詳解

    這篇文章主要介紹了Java分支結(jié)構(gòu)程序設(shè)計(jì)例題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-01-01
  • SpringBoot集成MQTT示例詳解

    SpringBoot集成MQTT示例詳解

    這篇文章主要為大家介紹了SpringBoot集成MQTT示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • java啟動(dòng)線程的3種方式對(duì)比分析

    java啟動(dòng)線程的3種方式對(duì)比分析

    這篇文章主要為大家對(duì)比分析了java啟動(dòng)線程的3種方式,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12

最新評(píng)論

罗江县| 扎兰屯市| 迁西县| 深水埗区| 定安县| 三明市| 岫岩| 凌云县| 长春市| 客服| 调兵山市| 沂源县| 岗巴县| 治多县| 衡阳县| 剑川县| 华宁县| 新乐市| 吕梁市| 乐亭县| 左云县| 香港 | 德化县| 察隅县| 南木林县| 任丘市| 莒南县| 阳原县| 平陆县| 屏山县| 南雄市| 江川县| 罗城| 休宁县| 新野县| 清流县| 梅河口市| 色达县| 始兴县| 湛江市| 洛浦县|