SpringBoot項(xiàng)目配置明文密碼泄露問題的處理方式
項(xiàng)目配置明文密碼泄露問題的處理
在項(xiàng)目開發(fā)過程中,需要配置數(shù)據(jù)庫連接密碼、Redis密碼、網(wǎng)盤上傳的AK/SK等敏感信息,都需要保存在配置文件里,或者配置中心。
這些信息如果泄露,還是會造成一定的困擾,這里介紹2種處理方案:
1、使用系統(tǒng)環(huán)境變量儲存密碼
比如K8S的環(huán)境變量、Windows的環(huán)境變量、Centos的環(huán)境變量等等,
然后在程序里使用 System.getenv()方法讀取。
這種方式的好處:只有運(yùn)維人員知道,連開發(fā)都不知道生產(chǎn)的密碼。
密碼變更也簡單,運(yùn)維直接操作就好了。
缺點(diǎn)就是部署時(shí),容易遺漏,不過可以通過統(tǒng)一的環(huán)境鏡像來處理。
一般推薦這種方式
注:如果變更密碼,還是要考慮重啟一下服務(wù)器上的所有服務(wù),避免緩存了舊密碼,導(dǎo)致服務(wù)故障。
2、密碼還是寫在程序的配置文件里
或者nacos之類的配置中心, 但是不使用明文,而是使用加密后的串。 同時(shí)在啟動命令行里,指定密碼參數(shù)。 下面介紹一下這種加密方式:
2.1、添加依賴,參考:https://github.com/ulisesbocchio/jasypt-spring-boot
<dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.4</version> </dependency>
2.2、對文本進(jìn)行加密,假設(shè)密碼為123456,加密代碼如下(建議部署一個(gè)加密后臺,給開發(fā)用):
// 參考 https://github.com/ulisesbocchio/jasypt-spring-boot PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); SimpleStringPBEConfig config = new SimpleStringPBEConfig(); config.setPassword("123456"); // 默認(rèn)值 config.setAlgorithm("PBEWITHHMACSHA512ANDAES_256"); config.setKeyObtentionIterations("1000"); config.setPoolSize("1"); config.setProviderName("SunJCE"); config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator"); config.setStringOutputType("base64"); encryptor.setConfig(config); System.out.println("beinet 加密后: " + encryptor.encrypt(username));
上面的代碼輸出:beinet 加密后: 8LJb3ICopErpPuEw1S/3rHc2fkk1qPScP0ODDbnmuSBjY6NJqN1oZcAxNDVl06qv
2.3、把加密后的文本,套上 ENC()函數(shù),寫入yml配置里:
pwdTest: ak: ENC(8LJb3ICopErpPuEw1S/3rHc2fkk1qPScP0ODDbnmuSBjY6NJqN1oZcAxNDVl06qv)
2.4、配置一下IDEA的Java啟動命令行參數(shù):
點(diǎn)擊右上角 Edit Configurations… 在右側(cè)Configuration=>Environment=>VM options的右邊添加:
-Djasypt.encryptor.password=123456
2.5、運(yùn)行代碼驗(yàn)證一下:
@Value("${pwdTest.ak}") private String ak; @Override public void run(String... args) throws Exception { System.out.println(ak); }
可以看到,能成功打印出解密后的 beinet
給配置文件中用戶名密碼加密
原配置文件內(nèi)容
詳細(xì)操作步驟
1、在pom.xml文件中加依賴
<!--明文加密--> <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot</artifactId> <version>2.0.0</version> </dependency>
2、重新加載pom文件(因?yàn)榭赡軙霈F(xiàn)新加的依賴maven不生效) 3、找到maven倉庫中的上面的依賴的位置
eg:我的位置是這里,請注意自己的位置(肯定是在org路徑下)
4、打開PowerShell窗口(在jar包目錄中按住shift+鼠標(biāo)右鍵)
5、輸入命令,執(zhí)行jar包加密
java -cp jasypt-1.9.2.jar org.jasypt.intf.cli.JasyptPBEStringEncryptionCLI input=“Zhiradar@135” password=Zhiradar@135 algorithm=PBEWithMD5AndDES
注:input=" ",分號中的內(nèi)容為原配置文件中的需要加密的數(shù)據(jù),該數(shù)據(jù)必須在雙引號內(nèi)
eg: input=“Zhiradar@135”
password= ,沒有引號,并且=號后面的值是你自己起的,叫啥都行(盡量復(fù)雜一點(diǎn),都是為了安全性)
eg1: password=sdkjfhkhs
eg2: password=woshinibaba@163
圖示:
- 綠色框里的為原配置文件用戶名和密碼
- 藍(lán)色框里的為鹽值(鹽值就是你自己起的那個(gè)加密數(shù)據(jù))
- 黃色框里的是執(zhí)行上述命令后生成的新配置文件中的用戶名和密碼
新配置文件內(nèi)容
jasypt.encryptor.password=${JASYPT_ENCRYPTOR_PASSWORD}
這個(gè)是服務(wù)啟動時(shí)候需要給配置文件增加的環(huán)境變量參數(shù)(就是上面自己起的)
JASYPT_ENCRYPTOR_PASSWORD也是自己起的名字
要對應(yīng)啟動jar包或者啟動項(xiàng)目是配置的環(huán)境變量用的
jasypt.encryptor.algorithm=PBEWithMD5AndDES
這個(gè)是加密方式,其實(shí)默認(rèn)的就是這種
6、在啟動類上面加上注解
@EnableEncryptableProperties
表示啟動項(xiàng)目就開啟加密配置
7、啟動項(xiàng)目驗(yàn)證配置正確不正確 1)打成jar包
執(zhí)行jar包形式
java -DJASYPT_ENCRYPTOR_PASSWORD=Zhiradar@135 -jar .\xxl-job-admin-2.0.2-SNAPSHOT.jar
JASYPT_ENCRYPTOR_PASSWORD=Zhiradar@135
JASYPT_ENCRYPTOR_PASSWORD自己在配置文件中配置的
Zhiradar@135 鹽值也是自己起的
2) 在IDEA中啟動
run–>Edit Configuarations
以上為xxl-job框架中的admin模塊用戶名和密碼加密(涉及到啟動項(xiàng)目后會在可視化平臺輸入用戶名和密碼)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java創(chuàng)建線程池的7種實(shí)現(xiàn)方法
在Java中線程池是一種管理線程的機(jī)制,它可以創(chuàng)建一組線程并重復(fù)使用它們,避免了創(chuàng)建和銷毀線程的開銷,這篇文章主要給大家介紹了關(guān)于java創(chuàng)建線程池的7種實(shí)現(xiàn)方法,需要的朋友可以參考下2023-10-10new出來的對象中無法使用@autowired進(jìn)行對象bean注入問題
這篇文章主要介紹了基于new出來的對象中無法使用@autowired進(jìn)行對象bean注入問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02講解Java設(shè)計(jì)模式編程中的建造者模式與原型模式
這篇文章主要介紹了Java設(shè)計(jì)模式編程中的建造者模式與原型模式,設(shè)計(jì)模式有利于團(tuán)隊(duì)開發(fā)過程中的代碼維護(hù),需要的朋友可以參考下2016-02-02Java?中導(dǎo)入excel時(shí)使用?trim()?無法去除空格的問題解決方案
這篇文章主要介紹了Java中導(dǎo)入excel時(shí)使用trim()無法去除空格的解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06java如何實(shí)時(shí)動態(tài)獲取properties文件的內(nèi)容
這篇文章主要介紹了java如何實(shí)時(shí)動態(tài)獲取properties文件的內(nèi)容,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-09-09