SpringBoot使用jasypt實現(xiàn)數(shù)據(jù)庫信息脫敏的方法詳解
1.為什么要有這個需求?
一般當(dāng)我們自己練習(xí)的時候,username和password直接是爆露出來的
假如別人路過你旁邊時看到了你的數(shù)據(jù)庫賬號密碼,他跑到他的電腦打開navicat直接就是一頓連接,直接瘋狂刪除你的數(shù)據(jù)庫,那可就廢了,所以像這種重要的敏感信息,一般是加密過后顯示出來的,也就是數(shù)據(jù)的脫敏,一般公司你看到的數(shù)據(jù)庫連接信息是這樣的。
這顯然就是加密過后的,但是數(shù)據(jù)庫連接時如果獲取到的是你加密過后的密碼,那肯定是錯誤的,所以我們需要在數(shù)據(jù)庫獲取到信息之前,把它給解密,切記解密是在獲取到數(shù)據(jù)之前進行的。
2.jasypt是如何保證數(shù)據(jù)安全的?
可能你會好奇,它既然能解密,那我拿著你的密文去調(diào)用jasypt提供的解密方法(api)去解密不就行了嗎?但是jasypt可不是這么干的!它提供了一個鹽salt,它加密和解密是如下過程進行的。
可以看出沒有鹽你就算知道密文也沒用。也可以說鹽就是打開你金庫的鑰匙。此時你可能會好奇,那密文肯定是代碼里面生成的啊,那你生成的時候鹽salt和原密碼肯定也是寫在代碼里了,那不也不安全嗎?其實這個密文是我們提前通過測試工具類生成好的再放到配置文件中,生成好以后測試工具類就可以直接刪除了,所以鹽和原密碼不會暴漏在代碼中,最終只有你知道。
3.SpringBoot項目中如何使用jasypt
3.1引入依賴
<!--jasypt--> <dependency> <groupId>com.github.ulisesbocchio</groupId> <artifactId>jasypt-spring-boot-starter</artifactId> <version>3.0.3</version> </dependency>
3.2創(chuàng)建jasypt工具類
主要用于提前進行加密和解密的
package com.fzy.utils; import org.jasypt.encryption.pbe.PooledPBEStringEncryptor; import org.jasypt.encryption.pbe.config.SimpleStringPBEConfig; public class JasyptPasswordUtil { private static final String PBEWITHMD5ANDDES = "PBEWithMD5AndDES"; private static final String PBEWITHHMACSHA512ANDAES_256 = "PBEWITHHMACSHA512ANDAES_256"; /** * 加密 * @param salt 你設(shè)置加密用的鹽 * @return 加密類PooledPBEStringEncryptor所需要的配置類 */ public static SimpleStringPBEConfig getJasyptConfig(String salt){ //加解密配置 SimpleStringPBEConfig config = new SimpleStringPBEConfig(); config.setPassword(salt);//配置鹽!??!極其重要 config.setAlgorithm(PBEWITHHMACSHA512ANDAES_256);//加密算法 //下面的配置不用關(guān)心 config.setKeyObtentionIterations("1000"); config.setPoolSize("1"); config.setProviderName("SunJCE"); config.setSaltGeneratorClassName("org.jasypt.salt.RandomSaltGenerator"); config.setIvGeneratorClassName("org.jasypt.iv.RandomIvGenerator"); config.setStringOutputType("base64"); return config; } /** * 加密方法 * @param salt 輸入鹽 * @param text 輸入需要加密的文本 * @return 密文 */ public static String encryptText(String salt, String text){ PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();//加密類 SimpleStringPBEConfig config = getJasyptConfig(salt);//獲取并設(shè)置加密配置類 encryptor.setConfig(config); String encryptText = encryptor.encrypt(text);//進行加密 return encryptText; } /** * 解密方法,此處沒什么用,就是用來自己看看能不能解密 * @param salt 輸入鹽 * @param text 輸入需要加密的文本 * @return 明文 */ public static String decryptText(String salt, String text){ PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); SimpleStringPBEConfig config = getJasyptConfig(salt); encryptor.setConfig(config); String decryptText = encryptor.decrypt(text); return decryptText; } public static void main(String[] args) { //生成的密文將來放到你yml文件中,例如數(shù)據(jù)庫的用戶名密碼等敏感信息 String encryptText = encryptText("biecaile", "root"); System.out.println("加密后:" + encryptText); String decrypt = decryptText("biecaile", encryptText); System.out.println("解密后:" + decrypt); } }
運行后的結(jié)果:
稍微了解兩個加密算法,PBEWithMD5AndDES和PBEWITHHMACSHA512ANDAES_256
這兩個算法跟jasypt的版本有關(guān),如果我們不配置加密算法,無論是3.0還是2.0好像加密都是PBEWithMD5AndDES,但是解密,如果2.0.xxx是使用的PBEWithMD5AndDES,3.0使用的是PBEWITHHMACSHA512ANDAES_256,此處不是指我們自己測試去解密,而是指再配置完yml文件或者程序參數(shù)后自己去解密(下面),所以如果解密算法與加密不一致就會報錯(一般啟動項目就會報錯),最好指定加密算法,像我是3.0版指定加密算法為PBEWITHHMACSHA512ANDAES_256
那在yml文件中就不用再配置解密算法了。配一下當(dāng)然最好。
3.3配置yml文件
jasypt: encryptor: password: biecaile #解密鹽值 algorithm: PBEWITHHMACSHA512ANDAES_256 #解密算法 test: password: ENC(MsGb7KJD6ZxdEH5O42MM+lDVH6mvtP46IlwVqbXq/CHQR75x2+WG7YyOf3Ootndd)
其中的test:password是我們自定義的,主要用于測試,ENC()這個是jasypt自動識別yml屬性值的一個標(biāo)識,只要加上,當(dāng)前值就會被解析成明文,里面存放的是我們生成的密文。
3.4編寫讀取yml文件屬性值的配置類TestConfig
這里主要是為了測試能不能在獲取到屬性之前,密文已經(jīng)被解密了,也就是說此處如果正確的話,獲取到的就是我們的明文“root”,實際工作根本不需要
package com.fzy.config; import lombok.Data; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; @Configuration @Data public class TestConfig { @Value("${test.password}") private String password; }
3.5隨便編寫一個TestController去測試獲取該數(shù)據(jù)
@Controller @RequestMapping("/test") public class TestController { @Autowired private TestConfig testConfig; @RequestMapping("/getText") @ResponseBody public String getText(){ return testConfig.getPassword(); } }
結(jié)果發(fā)現(xiàn)獲取到的是明文,已經(jīng)成功了
4.能在配置文件中配鹽值salt嗎?
肯定是不行的,這樣salt直接就爆露出來了,很危險,尤其是放在代碼中,也很容易就發(fā)現(xiàn),一般不會寫在配置文件中的,我們可以把它放到啟動類的程序?qū)崊⒅?/p>
填寫:--jasypt.encryptor.password=你的鹽值salt,然后apply+ok確定就行。
配置完以后把你在配置文件中的password(所謂的salt去掉就行),結(jié)果一樣的。一般只要salt配的不對,程序啟動就會直接報錯。
總結(jié):這樣的話,就算我把代碼給你,你都跑不起來項目,因為你沒有salt就配不了,然后你只能去問我要,我就不給你,那么你就破解不了數(shù)據(jù)庫的密文,你就別想連上我的數(shù)據(jù)庫。
以上就是SpringBoot使用jasypt實現(xiàn)數(shù)據(jù)庫信息脫敏的方法詳解的詳細內(nèi)容,更多關(guān)于SpringBoot jasypt數(shù)據(jù)脫敏的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring BeanPostProcessor(后置處理器)的用法
這篇文章主要介紹了Spring BeanPostProcessor(后置處理器)的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10Java使用組件編寫窗口實現(xiàn)網(wǎng)絡(luò)圖片顯示
這篇文章主要為大家詳細介紹了Java使用組件編寫窗口實現(xiàn)網(wǎng)絡(luò)圖片顯示的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-02-02在springboot中注入FilterRegistrationBean不生效的原因
這篇文章主要介紹了在springboot中注入FilterRegistrationBean不生效的原因及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-08-08