SpringBoot實(shí)現(xiàn)Md5對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)加密的示例
因?yàn)殚_學(xué)等各種原因,導(dǎo)致更新的速度越來(lái)越慢,當(dāng)然在此期間也進(jìn)行了一些其他技術(shù)的學(xué)習(xí),今天給大家?guī)?lái)的就是我們的通過(guò)MD5進(jìn)行數(shù)據(jù)庫(kù)加密。
MD5概述:
MD5消息摘要算法,屬Hash算法一類。MD5算法對(duì)輸入任意長(zhǎng)度的消息進(jìn)行運(yùn)行,產(chǎn)生一個(gè)128位的消息摘要(32位的數(shù)字字母混合碼)。
MD5主要特點(diǎn):
不可逆,相同數(shù)據(jù)的MD5值肯定一樣,不同數(shù)據(jù)的MD5值不一樣
(一個(gè)MD5理論上的確是可能對(duì)應(yīng)無(wú)數(shù)多個(gè)原文的,因?yàn)镸D5是有限多個(gè)的而原文可以是無(wú)數(shù)多個(gè)。比如主流使用的MD5將任意長(zhǎng)度的“字節(jié)串映射為一個(gè)128bit的大整數(shù)。也就是一共有2^128種可能,大概是3.4*10^38,這個(gè)數(shù)字是有限多個(gè)的,而但是世界上可以被用來(lái)加密的原文則會(huì)有無(wú)數(shù)的可能性)
MD5的性質(zhì):
- 壓縮性:任意長(zhǎng)度的數(shù)據(jù),算出的MD5值長(zhǎng)度都是固定的(相當(dāng)于超損壓縮)。
- 容易計(jì)算:從原數(shù)據(jù)計(jì)算出MD5值很容易。
- 抗修改性:對(duì)原數(shù)據(jù)進(jìn)行任何改動(dòng),哪怕只修改1個(gè)字節(jié),所得到的MD5值都有很大區(qū)別。
- 弱抗碰撞:已知原數(shù)據(jù)和其MD5值,想找到一個(gè)具有相同MD5值的數(shù)據(jù)(即偽造數(shù)據(jù))是非常困難的。
- 強(qiáng)抗碰撞:想找到兩個(gè)不同的數(shù)據(jù),使它們具有相同的MD5值,是非常困難的。
雖說(shuō)MD5有不可逆的特點(diǎn)但是由于某些MD5破解網(wǎng)站,專門用來(lái)查詢MD5碼,其通過(guò)把常用的密碼先MD5處理,并將數(shù)據(jù)存儲(chǔ)起來(lái),然后跟需要查詢的MD5結(jié)果匹配,這時(shí)就有可能通過(guò)匹配的MD5得到明文,所以有些簡(jiǎn)單的MD5碼是反查到加密前原文的。
為了讓MD5碼更加安全,涌現(xiàn)了很多其他方法,如加鹽。 鹽要足夠長(zhǎng)足夠亂 得到的MD5碼就很難查到。
MD5用途:
1.防止被篡改:
- 比如發(fā)送一個(gè)電子文檔,發(fā)送前,我先得到MD5的輸出結(jié)果a。然后在對(duì)方收到電子文檔后,對(duì)方也得到一個(gè)MD5的輸出結(jié)果b。如果a與b一樣就代表中途未被篡改。
- 比如我提供文件下載,為了防止不法分子在安裝程序中添加木馬,我可以在網(wǎng)站上公布由安裝文件得到的MD5輸出結(jié)果。
- SVN在檢測(cè)文件是否在CheckOut后被修改過(guò),也是用到了MD5.
2.防止直接看到明文:
現(xiàn)在很多網(wǎng)站在數(shù)據(jù)庫(kù)存儲(chǔ)用戶的密碼的時(shí)候都是存儲(chǔ)用戶密碼的MD5值。這樣就算不法分子得到數(shù)據(jù)庫(kù)的用戶密碼的MD5值,也無(wú)法知道用戶的密碼。(比如在UNIX系統(tǒng)中用戶的密碼就是以MD5(或其它類似的算法)經(jīng)加密后存儲(chǔ)在文件系統(tǒng)中。當(dāng)用戶登錄的時(shí)候,系統(tǒng)把用戶輸入的密碼計(jì)算成MD5值,然后再去和保存在文件系統(tǒng)中的MD5值進(jìn)行比較,進(jìn)而確定輸入的密碼是否正確。通過(guò)這樣的步驟,系統(tǒng)在并不知道用戶密碼的明碼的情況下就可以確定用戶登錄系統(tǒng)的合法性。這不但可以避免用戶的密碼被具有系統(tǒng)管理員權(quán)限的用戶知道,而且還在一定程度上增加了密碼被破解的難度。)
3.防止抵賴(數(shù)字簽名):
這需要一個(gè)第三方認(rèn)證機(jī)構(gòu)。例如A寫了一個(gè)文件,認(rèn)證機(jī)構(gòu)對(duì)此文件用MD5算法產(chǎn)生摘要信息并做好記錄。若以后A說(shuō)這文件不是他寫的,權(quán)威機(jī)構(gòu)只需對(duì)此文件重新產(chǎn)生摘要信息,然后跟記錄在冊(cè)的摘要信息進(jìn)行比對(duì),相同的話,就證明是A寫的了。這就是所謂的“數(shù)字簽名”。
- 比如發(fā)送一個(gè)電子文檔,發(fā)送前,我先得到MD5的輸出結(jié)果a。然后在對(duì)方收到電子文檔后,對(duì)方也得到一個(gè)MD5的輸出結(jié)果b。如果a與b一樣就代表中途未被篡改。
- 比如我提供文件下載,為了防止不法分子在安裝程序中添加木馬,我可以在網(wǎng)站上公布由安裝文件得到的MD5輸出結(jié)果。
- SVN在檢測(cè)文件是否在CheckOut后被修改過(guò),也是用到了MD5.SpringBoot使用:

首先,還是會(huì)利用到我們的hutool:Hutool參考文檔

我們發(fā)現(xiàn),hutool工具類里面的SecureUtil可以對(duì)我們的MD5進(jìn)行使用,那么我們就可以更好更簡(jiǎn)單的去實(shí)現(xiàn)我們的MD5加密了
依賴導(dǎo)入:

<!-- hutool -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.20</version>
</dependency>然后在我們新建的SpringBoot項(xiàng)目里面進(jìn)行我們的一個(gè)測(cè)試
private static final String PASSWORD = "123456";
@Test
public void testMd5() {
String res1 = SecureUtil.md5(PASSWORD);
String res2 = SecureUtil.md5(PASSWORD);
System.out.println(res1);
System.out.println(res2);
System.out.println(res1.equals(res2));
}最后在我們的控制臺(tái)里面輸出,并得到一下結(jié)果

那我們?nèi)绾问褂玫轿覀兊臄?shù)據(jù)庫(kù)呢?按照思路,我們應(yīng)該從用戶的注冊(cè)就開始進(jìn)行對(duì)我們的密碼進(jìn)行加密處理,所以我們需要在我們的Service進(jìn)行編碼處理程序。

我們?cè)诳刂茖荧@取到我們用戶的數(shù)據(jù),把它當(dāng)做一個(gè)包命名為UserDTO,單獨(dú)封裝起來(lái),方便我們隨時(shí)對(duì)我們的數(shù)據(jù)進(jìn)行處理和查找。我們?cè)赨serDTO里面對(duì)密碼進(jìn)行加密之前要獲取我們的數(shù)據(jù),也就是我們的密碼。
@Override
public User register(UserDTO userDTO) {
// 用戶密碼 md5加密
userDTO.setPassword(SecureUtil.md5(userDTO.getPassword()));
userDTO.setNickname(userDTO.getUsername());
userDTO.setSex("男");
userDTO.setAvatarUrl("https://cube.elemecdn.com/0/88/03b0d39583f48206768a7534e55bcpng.png");
User one = getUserInfo(userDTO);
if (one == null) {
one = new User();
BeanUtil.copyProperties(userDTO, one, true);
save(one);//存到數(shù)據(jù)庫(kù)
} else {
throw new ServerException(Constants.CODE_600, "用戶已存在");
}
return one;
}在前端執(zhí)行成功之后,我們數(shù)據(jù)庫(kù)里面的數(shù)據(jù)就發(fā)生了變化

那我們?cè)谧?cè)的時(shí)候進(jìn)行了數(shù)據(jù)加密,那我們登錄不解密就寄了,咋們就會(huì)登錄不了,這不是亂寫嘛,別急,馬上進(jìn)行解密實(shí)現(xiàn)登錄操作。

沒(méi)想到吧,是跟注冊(cè)差不多的操作。那有人問(wèn)你這里注釋寫的是MD5加密,你的解密去哪里了呢?這不是胡扯嘛?。?!

其實(shí)我們的SecureUtil不僅可以進(jìn)行加密,也可以進(jìn)行解密,所以我們?cè)诘卿浀臅r(shí)候要獲取我們的用戶密碼,就是直接進(jìn)行解密操作,供我們的操作使用。所以說(shuō)Hutool這個(gè)工具實(shí)在是真的強(qiáng)大,幫我們解決很多復(fù)雜的程序。
下面給大家分享一下AES
AES算法簡(jiǎn)介
AES算法全稱Advanced Encryption Standard,又稱Rijndael加密法,是美國(guó)聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)。這個(gè)標(biāo)準(zhǔn)用來(lái)替代原先的DES,已經(jīng)被多方分析且廣為全世界所使用。經(jīng)過(guò)五年的甄選流程,高級(jí)加密標(biāo)準(zhǔn)由美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究院 (NIST)于2001年11月26日發(fā)布于FIPS PUB 197,并在2002年5月26日成為有效的標(biāo)準(zhǔn)。2006年,高級(jí)加密標(biāo)準(zhǔn)已然成為對(duì)稱密鑰加密中最流行的算法之一。
AES支持三種長(zhǎng)度的密鑰:128位,192位,256位。
AES算法原理
1.密鑰
密鑰是AES算法實(shí)現(xiàn)加密和解密的根本。對(duì)稱加密算法之所以對(duì)稱,是因?yàn)檫@類算法對(duì)明文的加密和解密需要使用同一個(gè)密鑰。
AES支持三種長(zhǎng)度的密鑰:128位,192位,256位
平時(shí)大家所說(shuō)的AES128,AES192,AES256,實(shí)際上就是指的AES算法對(duì)不同長(zhǎng)度密鑰的使用。
2.填充
要想了解填充的概念,我們先要了解AES的分組加密特性。什么是分組加密呢?我們來(lái)看看下面這張圖:AES算法在對(duì)明文加密的時(shí)候,并不是把整個(gè)明文一股腦加密成一整段密文,而是把明文拆分成一個(gè)個(gè)獨(dú)立的明文塊,每一個(gè)明文塊長(zhǎng)度128bit。
這些明文塊經(jīng)過(guò)AES加密器的復(fù)雜處理,生成一個(gè)個(gè)獨(dú)立的密文塊,這些密文塊拼接在一起,就是最終的AES加密結(jié)果。
假如一段明文長(zhǎng)度是192bit,如果按每128bit一個(gè)明文塊來(lái)拆分的話,第二個(gè)明文塊只有64bit,不足128bit。這時(shí)候怎么辦呢?就需要對(duì)明文塊進(jìn)行填充(Padding)。
依然是我們的SecureUtil來(lái)進(jìn)行加密解密處理

最后控制臺(tái)輸出結(jié)果為:

好了,以上就是我近期學(xué)習(xí)的結(jié)果,可以進(jìn)行數(shù)據(jù)庫(kù)數(shù)據(jù)加密解密。
?小結(jié)
到此這篇關(guān)于SpringBoot實(shí)現(xiàn)Md5對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)加密的示例的文章就介紹到這了,更多相關(guān)SpringBoot Md5加密內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何解決Spring in action @valid驗(yàn)證不生效的問(wèn)題
這篇文章主要介紹了如何解決Spring in action @valid驗(yàn)證不生效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
JAVA OutputStreamWriter流的實(shí)現(xiàn)
OutputStreamWriter是從字符流到字節(jié)流的橋接,它使用的字符集可以通過(guò)名稱指定,也可以明確指定,或者可以接受平臺(tái)的默認(rèn)字符集,本文詳細(xì)的介紹了JAVA OutputStreamWriter流的使用,感興趣的可以了解一下2021-06-06
詳解Elastic Search搜索引擎在SpringBoot中的實(shí)踐
本篇文章主要介紹了Elastic Search搜索引擎在SpringBoot中的實(shí)踐,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
JAVA通過(guò)HttpClient發(fā)送HTTP請(qǐng)求的方法示例
本篇文章主要介紹了JAVA通過(guò)HttpClient發(fā)送HTTP請(qǐng)求的方法示例,詳細(xì)的介紹了HttpClient使用,具有一定的參考價(jià)值,有興趣的可以了解一下2017-09-09
Spring中使用AOP進(jìn)行事務(wù)管理實(shí)例
這篇文章主要介紹了Spring中使用AOP進(jìn)行事務(wù)管理實(shí)例,當(dāng)在Spring項(xiàng)目中涉及數(shù)據(jù)庫(kù)操作時(shí),事務(wù)管理是非常重要的,它可以確保數(shù)據(jù)庫(kù)操作的一致性和完整性,Spring提供了強(qiáng)大的事務(wù)管理功能,可以通過(guò)聲明式或編程式兩種方式進(jìn)行配置,需要的朋友可以參考下2023-09-09
Java實(shí)現(xiàn)PDF導(dǎo)出功能的示例代碼
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)PDF導(dǎo)出功能的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解下2023-09-09
從零開始讓你的Spring?Boot項(xiàng)目跑在Linux服務(wù)器
這篇文章主要給大家介紹了如何從零開始讓你的Spring?Boot項(xiàng)目跑在Linux服務(wù)器的相關(guān)資料,由于springboot是內(nèi)嵌了tomcat,所以可以直接將項(xiàng)目打包上傳至服務(wù)器上,需要的朋友可以參考下2021-11-11

