SpringBoot配置檔案敏感資訊加密方案

Ashe|||^_^發表於2024-06-08

在SpringBoot Project中,會將一些敏感資訊配置到application.yml/application.properties配置檔案中(同樣適用於Spring Cloud的各個微服務其實(微服務例項)本質就是一個SpringBoot),例如資料庫的使用者名稱和密碼、Redis的密碼等。為了保證敏感資訊的安全,我們需要將此類資料進行加密配置。

Jasypt方案

官網 http://www.jasypt.org/

以下實踐在JDK21、SpringBoot3.3.0下成功驗證,若你的JDK和SpringBoot版本有所差異,可能需要調整一些細節

pom.xml引入依賴

		<!-- 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>

加密你的敏感資訊

public class TmpUtil {

    public static void main(String[] args) {
        BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
        //加密所需的秘鑰(salt),解密敏感資訊仍舊需要改值
        textEncryptor.setPassword("ashe");
        //要加密的敏感資訊
        String url = textEncryptor.encrypt("jdbc:mysql://${host}/${port}?serverTimezone=Asia/Shanghai");
        String username = textEncryptor.encrypt("username");
        String password = textEncryptor.encrypt("password");
        String driver = textEncryptor.encrypt("com.mysql.cj.jdbc.Driver");
        System.out.println("ENC("+url+")");
        System.out.println("ENC("+username+")");
        System.out.println("ENC("+password+")");
        System.out.println("ENC("+driver+")");
        System.out.println(textEncryptor.decrypt(username));
        System.out.println(textEncryptor.decrypt(password));
    }
}

application.yml填寫加密後的密文

spring:
  datasource:
    url: ENC(xxxx)
    username: ENC(xxxx)
    password: ENC(xxxx)
    driver-class-name: ENC(xxxx)

#jasypt:
#  encryptor:
#    password: ashe # 替換為你自己的金鑰
#    iv-generator-classname: org.jasypt.iv.NoIvGenerator
#    algorithm: PBEWithMD5AndDES

Jasypt庫所使用的預設加密演算法為PBEWithMD5AndDES,其需要解密的內容需要用ENC()包裹(你可以自定義選擇其他加密演算法),如果在配置檔案中直接展示你的秘鑰,那麼密文將很容易被解密出原文,因此一般不建議在配置檔案中展示,而是透過啟動指令碼的方式來告訴Jasypt秘鑰值,用以解密密文。

IDEA中本地啟動設定VM Options

-Djasypt.encryptor.password=ashe -Djasypt.encryptor.iv-generator-classname=org.jasypt.iv.NoIvGenerator -Djasypt.encryptor.algorithm=PBEWithMD5AndDES

SpringBoot配置檔案敏感資訊加密方案

-Djasypt.encryptor.password=ashe -Djasypt.encryptor.iv-generator-classname=org.jasypt.iv.NoIvGenerator -Djasypt.encryptor.algorithm=PBEWithMD5AndDES

Linux中的啟動指令碼

#!/bin/bash

# Start the application with the Jasypt encryptor password (replace with your actual start command)
java -Djasypt.encryptor.password=ashe -Djasypt.encryptor.iv-generator-classname=org.jasypt.iv.NoIvGenerator -Djasypt.encryptor.algorithm=PBEWithMD5AndDES -jar your-application.jar

較低版本的jasypt似乎不需要顯式指定iv-generator-classname和algorithm

Druid方案

相關文章