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里面直接點這個.

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,新加的這個環境變量才會加載進來.

設置好環境變量后直接啟動即可,不需要再帶上面那個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");
}
}
