SpringBoot使用jasypt實(shí)現(xiàn)數(shù)據(jù)庫(kù)信息脫敏的方法詳解
1.為什么要有這個(gè)需求?
一般當(dāng)我們自己練習(xí)的時(shí)候,username和password直接是爆露出來(lái)的

假如別人路過(guò)你旁邊時(shí)看到了你的數(shù)據(jù)庫(kù)賬號(hào)密碼,他跑到他的電腦打開(kāi)navicat直接就是一頓連接,直接瘋狂刪除你的數(shù)據(jù)庫(kù),那可就廢了,所以像這種重要的敏感信息,一般是加密過(guò)后顯示出來(lái)的,也就是數(shù)據(jù)的脫敏,一般公司你看到的數(shù)據(jù)庫(kù)連接信息是這樣的。

這顯然就是加密過(guò)后的,但是數(shù)據(jù)庫(kù)連接時(shí)如果獲取到的是你加密過(guò)后的密碼,那肯定是錯(cuò)誤的,所以我們需要在數(shù)據(jù)庫(kù)獲取到信息之前,把它給解密,切記解密是在獲取到數(shù)據(jù)之前進(jìn)行的。
2.jasypt是如何保證數(shù)據(jù)安全的?
可能你會(huì)好奇,它既然能解密,那我拿著你的密文去調(diào)用jasypt提供的解密方法(api)去解密不就行了嗎?但是jasypt可不是這么干的!它提供了一個(gè)鹽salt,它加密和解密是如下過(guò)程進(jìn)行的。

可以看出沒(méi)有鹽你就算知道密文也沒(méi)用。也可以說(shuō)鹽就是打開(kāi)你金庫(kù)的鑰匙。此時(shí)你可能會(huì)好奇,那密文肯定是代碼里面生成的啊,那你生成的時(shí)候鹽salt和原密碼肯定也是寫在代碼里了,那不也不安全嗎?其實(shí)這個(gè)密文是我們提前通過(guò)測(cè)試工具類生成好的再放到配置文件中,生成好以后測(cè)試工具類就可以直接刪除了,所以鹽和原密碼不會(huì)暴漏在代碼中,最終只有你知道。
3.SpringBoot項(xiàng)目中如何使用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工具類
主要用于提前進(jìn)行加密和解密的
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);//進(jìn)行加密
return encryptText;
}
/**
* 解密方法,此處沒(méi)什么用,就是用來(lái)自己看看能不能解密
* @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) {
//生成的密文將來(lái)放到你yml文件中,例如數(shù)據(jù)庫(kù)的用戶名密碼等敏感信息
String encryptText = encryptText("biecaile", "root");
System.out.println("加密后:" + encryptText);
String decrypt = decryptText("biecaile", encryptText);
System.out.println("解密后:" + decrypt);
}
}運(yùn)行后的結(jié)果:

稍微了解兩個(gè)加密算法,PBEWithMD5AndDES和PBEWITHHMACSHA512ANDAES_256
這兩個(gè)算法跟jasypt的版本有關(guān),如果我們不配置加密算法,無(wú)論是3.0還是2.0好像加密都是PBEWithMD5AndDES,但是解密,如果2.0.xxx是使用的PBEWithMD5AndDES,3.0使用的是PBEWITHHMACSHA512ANDAES_256,此處不是指我們自己測(cè)試去解密,而是指再配置完yml文件或者程序參數(shù)后自己去解密(下面),所以如果解密算法與加密不一致就會(huì)報(bào)錯(cuò)(一般啟動(dòng)項(xiàng)目就會(huì)報(bào)錯(cuò)),最好指定加密算法,像我是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是我們自定義的,主要用于測(cè)試,ENC()這個(gè)是jasypt自動(dòng)識(shí)別yml屬性值的一個(gè)標(biāo)識(shí),只要加上,當(dāng)前值就會(huì)被解析成明文,里面存放的是我們生成的密文。
3.4編寫讀取yml文件屬性值的配置類TestConfig
這里主要是為了測(cè)試能不能在獲取到屬性之前,密文已經(jīng)被解密了,也就是說(shuō)此處如果正確的話,獲取到的就是我們的明文“root”,實(shí)際工作根本不需要
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隨便編寫一個(gè)TestController去測(cè)試獲取該數(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直接就爆露出來(lái)了,很危險(xiǎn),尤其是放在代碼中,也很容易就發(fā)現(xiàn),一般不會(huì)寫在配置文件中的,我們可以把它放到啟動(dòng)類的程序?qū)崊⒅?/p>


填寫:--jasypt.encryptor.password=你的鹽值salt,然后apply+ok確定就行。

配置完以后把你在配置文件中的password(所謂的salt去掉就行),結(jié)果一樣的。一般只要salt配的不對(duì),程序啟動(dòng)就會(huì)直接報(bào)錯(cuò)。
總結(jié):這樣的話,就算我把代碼給你,你都跑不起來(lái)項(xiàng)目,因?yàn)槟銢](méi)有salt就配不了,然后你只能去問(wèn)我要,我就不給你,那么你就破解不了數(shù)據(jù)庫(kù)的密文,你就別想連上我的數(shù)據(jù)庫(kù)。
以上就是SpringBoot使用jasypt實(shí)現(xiàn)數(shù)據(jù)庫(kù)信息脫敏的方法詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot jasypt數(shù)據(jù)脫敏的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring BeanPostProcessor(后置處理器)的用法
這篇文章主要介紹了Spring BeanPostProcessor(后置處理器)的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
Java使用組件編寫窗口實(shí)現(xiàn)網(wǎng)絡(luò)圖片顯示
這篇文章主要為大家詳細(xì)介紹了Java使用組件編寫窗口實(shí)現(xiàn)網(wǎng)絡(luò)圖片顯示的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
Mybatis Trim標(biāo)簽用法簡(jiǎn)單介紹
這篇文章主要介紹了Mybatis Trim標(biāo)簽用法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-05-05
在springboot中注入FilterRegistrationBean不生效的原因
這篇文章主要介紹了在springboot中注入FilterRegistrationBean不生效的原因及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08

