SpringBoot中的配置文件信息加密


0.背景

在SpringBoot項目中,有的配置文件信息比較敏感,比如數據庫的密碼信息等,直接以明文的形式寫在配置文件中或許並不安全.


1.步驟

1.1 pom文件

依賴中加入

        <!-- 配置加密 -->
        <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>3.0.4</version>
        </dependency>

插件中加入

注意此處的 configuration節點,默認是項目的properties文件,你沒移動位置可以去掉這個節點,這里我配置文件自定義了新路徑.

            <plugin>
                <groupId>com.github.ulisesbocchio</groupId>
                <artifactId>jasypt-maven-plugin</artifactId>
                <version>3.0.4</version>
                <configuration>
                    <path>file:./config/application.yml</path>
                </configuration>
            </plugin>

1.2 配置文件修改

將要加密的信息用DEC()包裹,即DEC(待加密信息),例如:

# 原來的加密信息
yang.password=admin123
# 修改為
yang.password=DEC(admin123)

1.3 mvn命令加密文件

password=后為密碼,注意沒有""包裹,你寫了"的話,那么你的密碼也包括",下方示例為設置密碼為yang37

mvn jasypt:encrypt -Djasypt.encryptor.password=yang37

執行該條mvn命令后,配置文件中的對應部分的信息會自動更改為:

yang.password=ENC(加密的結果)

好,到此這一小節目的達到了,你可以不用看這節剩下的內容.

1.3.1 擴展1: 變回去明文

如果你想要變回去原文,執行下面這個命令:

mvn jasypt:decrypt -Djasypt.encryptor.password=yang37

這時配置信息會打印在控制台,不會再次把配置文件給你改回去,你可以手動復制過去(打印的是配置文件全文).

1.3.2 擴展2: 咋感覺作者ENC、DEC寫反了?

不要曲解作者的設計意圖.

encrypt:加密

decrypt:解密

我認為設計者的意圖是,ENC-密文,DEC-明文,代碼寫多了老下意識的認為DEC()這個是解密方法...還難受里面不是密文串,其實改成{}、[]之類的我比較好接受.

1.3.3 擴展3: mvn在哪執行

idea里面直接點這個.

image-20211113035628083

1.3.4 手動計算密文

如果你閑的慌,不想用maven插件...你可以去掉那個pom的那個plugin,然后直接手動寫代碼計算加密值,參考代碼.

   		BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
        textEncryptor.setPassword("密碼");
        String res = textEncryptor.encrypt("待加密值");

上面的res就是你加密的結果,還需要你手動替換配置文件里面的對應的配置信息.

yang.password=ENC(加密的結果)

1.4 項目啟動

解密總要密文串吧?你剛才是手動執行命令輸入的密碼,項目中的密碼從哪來?

方案多種,反正目的就是為了讓程序知道你的密碼是啥,下面列舉兩種.

1.4.1 直接啟動

java -jar xx.jar --jasypt.encryptor.password=你的密碼

1.4.2 利用環境變量

配置文件中編寫下面的信息:

# 配置加密
jasypt:
  encryptor:
    password: 你的密碼

你肯定會疑惑,密碼寫這里我還加密干嘛...所以,我們要把密碼換個地方存儲.

這里我利用環境變量,取的名字叫BOOT_PWD,這個可以自定義,不是規定值.

所以我把上面的配置改成這樣:

${環境變量名:默認值}

# 配置加密
jasypt:
  encryptor:
    password: ${BOOT_PWD:get valueEnv error!}
1.4.2.1 Linux中

編輯當前用戶的環境變量

vim ~/.bash_profile

末尾追加環境變量值

這個BOOT_PWD可以自己定義,不是規定值.

export BOOT_PWD=yang37

保存后刷新配置

source ~/.bash_profile

可以用echo命令看看生效沒

echo $BOOT_PWD

設置好環境變量后直接啟動即可,不需要再帶上面那個jasypt.encryptor.password參數.

1.4.2.2 win中

新建的時候變量值直接寫密碼就行,沒有特殊格式.

編輯好了記得重啟你的IDE,新加的這個環境變量才會加載進來.

image-20211113040432207

設置好環境變量后直接啟動即可,不需要再帶上面那個jasypt.encryptor.password參數.

1.5 驗證

如果你放心解密有沒有成功,可以在啟動類打印下信息,我的demo代碼.

package cn.yang37.demo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.env.ConfigurableEnvironment;


@SpringBootApplication
public class DemoApplication {

    private static final Logger log = LoggerFactory.getLogger(DemoApplication.class);

    public static void main(String[] args) {
        ConfigurableEnvironment environment = SpringApplication.run(DemoApplication.class, args).getEnvironment();

        // 獲取環境變量中的 BOOT_PWD
        String boot_pwd = environment.getProperty("BOOT_PWD");
        // 上面run方法執行完成,項目啟動,配置文件中有個配置值vxPush.admin.appToken也加載進去了,注意啟動完已經給你解密好了.
        String appToken = environment.getProperty("vxPush.admin.appToken");

        log.info("配置文件密碼: {}", boot_pwd);
        log.info("配置文件解密測試 - appToken: {}", appToken);

        log.info("\nvx-pusher run success ...\n");
    }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM