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

SpringBoot配置文件中敏感信息加密的三種方法

 更新時間:2024年05月19日 14:38:53   作者:大骨熬湯  
當我們將項目部署到服務器上時,一般會在jar包的同級目錄下加上application.yml配置文件,這樣可以在不重新?lián)Q包的情況下修改配置,這種方式存在安全隱患,如果配置文件泄露,就會造成數(shù)據(jù)庫密碼泄露,所以本文給大家介紹了SpringBoot配置文件中敏感信息加密的三種方法

一. 背景

當我們將項目部署到服務器上時,一般會在jar包的同級目錄下加上application.yml配置文件,這樣可以在不重新?lián)Q包的情況下修改配置。

一般會將數(shù)據(jù)庫連接、Redis連接等放到配置文件中。

例如配置數(shù)據(jù)庫連接:

spring:
  servlet:
    multipart:
      max-file-size: 10MB # 文件大小限制
      max-request-size: 100MB # 請求大小限制
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: 123456

這種方式存在安全隱患,如果配置文件泄露,就會造成數(shù)據(jù)庫密碼泄露。

所以需要將配置文件中數(shù)據(jù)庫密碼等敏感數(shù)據(jù)加密,然后在使用的時候解密后再使用。
推薦使用第三種方式。

二. 方法介紹

本文介紹三種方式。

1. 解密方法嵌入到業(yè)務邏輯代碼中

例如我可以在service或者正常的業(yè)務代碼中去加密后再使用。

但是這種和業(yè)務耦合度高,不推薦。

2. 使用jasypt

2.1 第一步:pom引入依賴

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

2.2 第二步:application.yml中增加jasypt配置

配置文件里配置該算法加解密的鹽值。jaspypt算法不需要我們自己實現(xiàn),該第三方庫已經(jīng)實現(xiàn)了。我們僅需要配置這個鹽值即可。

# 如果密文加鹽,需要配置鹽值
jasypt:
  encryptor:
    password: ueiej@8e8r

2.3 第三步:application.yml中密文替代明文。

配置文件里將加密后得到的密文用ENC(密文)方式配置即可。項目啟動的時候,程序會自動去解析配置文件中值為ENC(密文)格式的配置,然后解密后加載程序。

數(shù)據(jù)的加密可以自己實現(xiàn)工具類來加密,或者一些在線網(wǎng)站提供jasypt的加解密,得到加密后的密文后,將密文替換明文即可。

例如:

password: ENC(UBHpSHxjL2F8ZiNTJUciZw==)

到此就全部結(jié)束了。項目啟動的時候程序會自動去解密,并注入到實際的springApplication中。

優(yōu)缺點

優(yōu)點:是引入第三方庫,簡單匹配一下即可,業(yè)務代碼不需要任何改動。

缺點:是把jasypt的鹽放到配置文件中,那實際上你的加密數(shù)據(jù)也跟裸奔一樣了,別人一樣可以用這個jasypt解密得到你的數(shù)據(jù)庫密碼等加密數(shù)據(jù)。

3. 使用自定義加解密算法并自動裝配

3.1 第一步:確定加解密規(guī)則,編寫工具類

我們可以自定義加解密算法來實現(xiàn)數(shù)據(jù)的加解密,這里采用AES算法。工具類的代碼省略。

3.2 第二步:實現(xiàn)EnvironmentPostProcessor

Spring Boot沒有為加密屬性值提供任何內(nèi)置支持。 EnvironmentPostProcessor 接口允許你在應用程序啟動前操作 Environment,可以用來修改Spring Environment 中包含的值。實現(xiàn)接口,并在接口里遍歷所有的配置項,將指定的配置項解密后重新寫入Environment。

示例:

public class DecryptEnvironmentPostProcessor implements EnvironmentPostProcessor {
    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        Properties props = new Properties();  // 臨時存儲需要替換的配置
        // 假設(shè)加密密碼前綴為 "ENC(",后綴為 ")"
        MutablePropertySources propertySources = environment.getPropertySources();
        for (PropertySource<?> propertySource : propertySources) {
            if (propertySource instanceof EnumerablePropertySource) {
                EnumerablePropertySource<?> enumerablePropertySource = (EnumerablePropertySource<?>) propertySource;
                String[] propertyNames = enumerablePropertySource.getPropertyNames();
                // 遍歷所有配置key:value
                for (String propertyName : propertyNames) {
                    String propertyVal = environment.getProperty(propertyName);
                    // 根據(jù)自己寫的規(guī)則來解析那些配置是需要解密的
                    if (propertyVal != null && propertyVal.startsWith("ENC(") && propertyVal.endsWith(")")) {
                        // 解析得到加密的數(shù)據(jù)
                        String encryptedValue = propertyVal.substring(4, propertyVal.length() - 1);
                        // 調(diào)用自定義工具類解密
                        String decryptedValue = AESUtil.decryptEcbMode(encryptedValue);
                        // 保存需要替換的配置
                        props.put(propertyName, decryptedValue);
                    }
                }
            }
        }
        // 添加解密后的屬性到環(huán)境中
        if (!props.isEmpty()) {
            PropertiesPropertySource pps = new PropertiesPropertySource("decryptedProperties", props);
            environment.getPropertySources().addFirst(pps);
        }
    }
}

3.3 自動裝配

resources/META-INF/spring.factories中注冊EnvironmentPostProcessor。

org.springframework.boot.env.EnvironmentPostProcessor=\  
your.package.DecryptEnvironmentPostProcessor

這里把自己實現(xiàn)的.DecryptEnvironmentPostProcesso的全路徑放進去即可。

沒有META-INF/spring.factories文件的,直接建好目錄新增這個文件就行。

3.4 配置文件密文替換明文

使用自定義的工具類將密碼加密,得到密文。用密文替換配置中的密文。

這里我依然使用ENC(密文)的格式去配置,這個規(guī)則可以自己定義,只要修改DecryptEnvironmentPostProcessor的方法中的匹配邏輯即可。

例如:

spring:  
  datasource:  
    password: ENC(你的加密密碼)

注意事項

你可以寫死你的加密的配置項,然后在postProcessEnvironme()方法里找到對應的配置項解密?;蛘吣憧梢詫⒓用艿乃袛?shù)據(jù)都用ENC(加密的數(shù)據(jù))表示,然后在postProcessEnvironme方法里匹配后解密即可。當然這里的編寫規(guī)則你可以自己定義,只要能匹配出來即可。

例如我的配置如下:

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
    username: root
    password: ENC(UBHpSHxjL2F8ZiNTJUciZw==)

其中數(shù)據(jù)庫的密碼就是AES算法解密后的結(jié)果。

總結(jié)

建議用第三種方式,因為這種加密算法可以自定義,并且不需要把加解密的秘鑰放到配置文件里,即便有人拿到配置文件,也無法得到真實的密碼,更加的安全。

而且第三種方式對業(yè)務代碼沒有侵入,也不需要特定引入第三方庫和配置其他東西。

以上就是SpringBoot配置文件中敏感信息加密的三種方法的詳細內(nèi)容,更多關(guān)于SpringBoot敏感信息加密的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java中JUC?的?Exchange?交換器詳情

    Java中JUC?的?Exchange?交換器詳情

    這篇文章主要介紹了Java中JUC?的?Exchange?交換器詳情,文章基于Java的相關(guān)資料展開詳細的內(nèi)容介紹,需要的小伙伴可以參考一下
    2022-05-05
  • jvm虛擬機類加載機制詳解

    jvm虛擬機類加載機制詳解

    本文主要介紹了 jvm虛擬機類加載機制詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • SpringBoot實現(xiàn)多數(shù)據(jù)源連接和切換的完整方案

    SpringBoot實現(xiàn)多數(shù)據(jù)源連接和切換的完整方案

    在 Spring Boot 中實現(xiàn)多數(shù)據(jù)源連接和切換,可以通過以下幾種方案來實現(xiàn),具體取決于項目的需求、數(shù)據(jù)庫的使用模式和管理的復雜性,大家可以根據(jù)需要進行選擇
    2025-11-11
  • 分隔List集合,按指定大小,將集合分成多個的方法

    分隔List集合,按指定大小,將集合分成多個的方法

    下面小編就為大家?guī)硪黄指鬖ist集合,按指定大小,將集合分成多個的方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • SpringBoot?+?Druid?+?MyBatis?Plus整合配置實現(xiàn)

    SpringBoot?+?Druid?+?MyBatis?Plus整合配置實現(xiàn)

    本文主要介紹了SpringBoot?+?Druid?+?MyBatis?Plus整合配置實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-10-10
  • MyBatis中#號與美元符號的區(qū)別

    MyBatis中#號與美元符號的區(qū)別

    #{變量名}可以進行預編譯、類型匹配等操作,#{變量名}會轉(zhuǎn)化為jdbc的類型。很多朋友不清楚在mybatis中#號與美元符號的不同,接下來通過本文給大家介紹兩者的區(qū)別,感興趣的朋友參考下吧
    2017-01-01
  • SpringBoot整合Redis、ApachSolr和SpringSession的示例

    SpringBoot整合Redis、ApachSolr和SpringSession的示例

    本篇文章主要介紹了SpringBoot整合Redis、ApachSolr和SpringSession的示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • springboot項目中redis常見的增刪改查操作大全

    springboot項目中redis常見的增刪改查操作大全

    本文介紹了Spring Boot中使用RedisTemplate進行數(shù)據(jù)操作的常見方法,文章強調(diào)Redis操作本質(zhì)是通過set/get/delete等API實現(xiàn),并結(jié)合業(yè)務場景給出了具體代碼示例和使用建議,感興趣的朋友跟隨小編一起看看吧
    2026-03-03
  • 利用java和sqlserver建立簡易圖書管理系統(tǒng)的完整步驟

    利用java和sqlserver建立簡易圖書管理系統(tǒng)的完整步驟

    圖書館管理系統(tǒng)是圖書館管理工作中不可缺少的部分,它對于圖書館的管理者和使用者都非常重要,下面這篇文章主要給大家介紹了關(guān)于利用java和sqlserver建立簡易圖書管理系統(tǒng)的完整步驟,需要的朋友可以參考下
    2022-06-06
  • 構(gòu)建SpringBoot+MyBatis+Freemarker的項目詳解

    構(gòu)建SpringBoot+MyBatis+Freemarker的項目詳解

    在本篇內(nèi)容里小編給大家整理的是關(guān)于構(gòu)建SpringBoot+MyBatis+Freemarker的項目的具體步驟以及實例代碼,需要的朋友們參考下。
    2019-06-06

最新評論

莎车县| 吴江市| 墨江| 虹口区| 富蕴县| 丰镇市| 和政县| 连南| 嘉义市| 墨竹工卡县| 庐江县| 合水县| 卓尼县| 大连市| 浦东新区| 墨竹工卡县| 徐闻县| 左权县| 屏山县| 怀宁县| 万安县| 蓝山县| 科技| 莱芜市| 昌都县| 西宁市| 呼图壁县| 前郭尔| 大竹县| 丘北县| 中阳县| 桦甸市| 三门峡市| 广东省| 韶关市| 漠河县| 江北区| 潞城市| 南部县| 密山市| 丰顺县|