SpringBoot實現(xiàn)Md5對數(shù)據(jù)庫數(shù)據(jù)加密的示例
因為開學(xué)等各種原因,導(dǎo)致更新的速度越來越慢,當(dāng)然在此期間也進行了一些其他技術(shù)的學(xué)習(xí),今天給大家?guī)淼木褪俏覀兊耐ㄟ^MD5進行數(shù)據(jù)庫加密。
MD5概述:
MD5消息摘要算法,屬Hash算法一類。MD5算法對輸入任意長度的消息進行運行,產(chǎn)生一個128位的消息摘要(32位的數(shù)字字母混合碼)。
MD5主要特點:
不可逆,相同數(shù)據(jù)的MD5值肯定一樣,不同數(shù)據(jù)的MD5值不一樣
(一個MD5理論上的確是可能對應(yīng)無數(shù)多個原文的,因為MD5是有限多個的而原文可以是無數(shù)多個。比如主流使用的MD5將任意長度的“字節(jié)串映射為一個128bit的大整數(shù)。也就是一共有2^128種可能,大概是3.4*10^38,這個數(shù)字是有限多個的,而但是世界上可以被用來加密的原文則會有無數(shù)的可能性)
MD5的性質(zhì):
- 壓縮性:任意長度的數(shù)據(jù),算出的MD5值長度都是固定的(相當(dāng)于超損壓縮)。
- 容易計算:從原數(shù)據(jù)計算出MD5值很容易。
- 抗修改性:對原數(shù)據(jù)進行任何改動,哪怕只修改1個字節(jié),所得到的MD5值都有很大區(qū)別。
- 弱抗碰撞:已知原數(shù)據(jù)和其MD5值,想找到一個具有相同MD5值的數(shù)據(jù)(即偽造數(shù)據(jù))是非常困難的。
- 強抗碰撞:想找到兩個不同的數(shù)據(jù),使它們具有相同的MD5值,是非常困難的。
雖說MD5有不可逆的特點但是由于某些MD5破解網(wǎng)站,專門用來查詢MD5碼,其通過把常用的密碼先MD5處理,并將數(shù)據(jù)存儲起來,然后跟需要查詢的MD5結(jié)果匹配,這時就有可能通過匹配的MD5得到明文,所以有些簡單的MD5碼是反查到加密前原文的。
為了讓MD5碼更加安全,涌現(xiàn)了很多其他方法,如加鹽。 鹽要足夠長足夠亂 得到的MD5碼就很難查到。
MD5用途:
1.防止被篡改:
- 比如發(fā)送一個電子文檔,發(fā)送前,我先得到MD5的輸出結(jié)果a。然后在對方收到電子文檔后,對方也得到一個MD5的輸出結(jié)果b。如果a與b一樣就代表中途未被篡改。
- 比如我提供文件下載,為了防止不法分子在安裝程序中添加木馬,我可以在網(wǎng)站上公布由安裝文件得到的MD5輸出結(jié)果。
- SVN在檢測文件是否在CheckOut后被修改過,也是用到了MD5.
2.防止直接看到明文:
現(xiàn)在很多網(wǎng)站在數(shù)據(jù)庫存儲用戶的密碼的時候都是存儲用戶密碼的MD5值。這樣就算不法分子得到數(shù)據(jù)庫的用戶密碼的MD5值,也無法知道用戶的密碼。(比如在UNIX系統(tǒng)中用戶的密碼就是以MD5(或其它類似的算法)經(jīng)加密后存儲在文件系統(tǒng)中。當(dāng)用戶登錄的時候,系統(tǒng)把用戶輸入的密碼計算成MD5值,然后再去和保存在文件系統(tǒng)中的MD5值進行比較,進而確定輸入的密碼是否正確。通過這樣的步驟,系統(tǒng)在并不知道用戶密碼的明碼的情況下就可以確定用戶登錄系統(tǒng)的合法性。這不但可以避免用戶的密碼被具有系統(tǒng)管理員權(quán)限的用戶知道,而且還在一定程度上增加了密碼被破解的難度。)
3.防止抵賴(數(shù)字簽名):
這需要一個第三方認證機構(gòu)。例如A寫了一個文件,認證機構(gòu)對此文件用MD5算法產(chǎn)生摘要信息并做好記錄。若以后A說這文件不是他寫的,權(quán)威機構(gòu)只需對此文件重新產(chǎn)生摘要信息,然后跟記錄在冊的摘要信息進行比對,相同的話,就證明是A寫的了。這就是所謂的“數(shù)字簽名”。
- 比如發(fā)送一個電子文檔,發(fā)送前,我先得到MD5的輸出結(jié)果a。然后在對方收到電子文檔后,對方也得到一個MD5的輸出結(jié)果b。如果a與b一樣就代表中途未被篡改。
- 比如我提供文件下載,為了防止不法分子在安裝程序中添加木馬,我可以在網(wǎng)站上公布由安裝文件得到的MD5輸出結(jié)果。
- SVN在檢測文件是否在CheckOut后被修改過,也是用到了MD5.SpringBoot使用:
首先,還是會利用到我們的hutool:Hutool參考文檔
我們發(fā)現(xiàn),hutool工具類里面的SecureUtil可以對我們的MD5進行使用,那么我們就可以更好更簡單的去實現(xiàn)我們的MD5加密了
依賴導(dǎo)入:
<!-- hutool --> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.20</version> </dependency>
然后在我們新建的SpringBoot項目里面進行我們的一個測試
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)); }
最后在我們的控制臺里面輸出,并得到一下結(jié)果
那我們?nèi)绾问褂玫轿覀兊臄?shù)據(jù)庫呢?按照思路,我們應(yīng)該從用戶的注冊就開始進行對我們的密碼進行加密處理,所以我們需要在我們的Service進行編碼處理程序。
我們在控制層獲取到我們用戶的數(shù)據(jù),把它當(dāng)做一個包命名為UserDTO,單獨封裝起來,方便我們隨時對我們的數(shù)據(jù)進行處理和查找。我們在UserDTO里面對密碼進行加密之前要獲取我們的數(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ù)庫 } else { throw new ServerException(Constants.CODE_600, "用戶已存在"); } return one; }
在前端執(zhí)行成功之后,我們數(shù)據(jù)庫里面的數(shù)據(jù)就發(fā)生了變化
那我們在注冊的時候進行了數(shù)據(jù)加密,那我們登錄不解密就寄了,咋們就會登錄不了,這不是亂寫嘛,別急,馬上進行解密實現(xiàn)登錄操作。
沒想到吧,是跟注冊差不多的操作。那有人問你這里注釋寫的是MD5加密,你的解密去哪里了呢?這不是胡扯嘛?。。?/p>
其實我們的SecureUtil不僅可以進行加密,也可以進行解密,所以我們在登錄的時候要獲取我們的用戶密碼,就是直接進行解密操作,供我們的操作使用。所以說Hutool這個工具實在是真的強大,幫我們解決很多復(fù)雜的程序。
下面給大家分享一下AES
AES算法簡介
AES算法全稱Advanced Encryption Standard,又稱Rijndael加密法,是美國聯(lián)邦政府采用的一種區(qū)塊加密標(biāo)準(zhǔn)。這個標(biāo)準(zhǔn)用來替代原先的DES,已經(jīng)被多方分析且廣為全世界所使用。經(jīng)過五年的甄選流程,高級加密標(biāo)準(zhǔn)由美國國家標(biāo)準(zhǔn)與技術(shù)研究院 (NIST)于2001年11月26日發(fā)布于FIPS PUB 197,并在2002年5月26日成為有效的標(biāo)準(zhǔn)。2006年,高級加密標(biāo)準(zhǔn)已然成為對稱密鑰加密中最流行的算法之一。
AES支持三種長度的密鑰:128位,192位,256位。
AES算法原理
1.密鑰
密鑰是AES算法實現(xiàn)加密和解密的根本。對稱加密算法之所以對稱,是因為這類算法對明文的加密和解密需要使用同一個密鑰。
AES支持三種長度的密鑰:128位,192位,256位
平時大家所說的AES128,AES192,AES256,實際上就是指的AES算法對不同長度密鑰的使用。
2.填充
要想了解填充的概念,我們先要了解AES的分組加密特性。什么是分組加密呢?我們來看看下面這張圖:AES算法在對明文加密的時候,并不是把整個明文一股腦加密成一整段密文,而是把明文拆分成一個個獨立的明文塊,每一個明文塊長度128bit。
這些明文塊經(jīng)過AES加密器的復(fù)雜處理,生成一個個獨立的密文塊,這些密文塊拼接在一起,就是最終的AES加密結(jié)果。
假如一段明文長度是192bit,如果按每128bit一個明文塊來拆分的話,第二個明文塊只有64bit,不足128bit。這時候怎么辦呢?就需要對明文塊進行填充(Padding)。
依然是我們的SecureUtil來進行加密解密處理
最后控制臺輸出結(jié)果為:
好了,以上就是我近期學(xué)習(xí)的結(jié)果,可以進行數(shù)據(jù)庫數(shù)據(jù)加密解密。
?小結(jié)
到此這篇關(guān)于SpringBoot實現(xiàn)Md5對數(shù)據(jù)庫數(shù)據(jù)加密的示例的文章就介紹到這了,更多相關(guān)SpringBoot Md5加密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中==運算符與equals方法的區(qū)別及intern方法詳解
這篇文章主要介紹了Java中==運算符與equals方法的區(qū)別及intern方法詳解的相關(guān)資料,需要的朋友可以參考下2017-04-04淺析Java中靜態(tài)代理和動態(tài)代理的應(yīng)用與區(qū)別
代理模式在我們生活中很常見,而Java中常用的兩個的代理模式就是動態(tài)代理與靜態(tài)代理,這篇文章主要為大家介紹了二者的應(yīng)用與區(qū)別,需要的可以參考下2023-08-08Spring mvc是如何實現(xiàn)與數(shù)據(jù)庫的前后端的連接操作的?
今天給大家?guī)淼氖顷P(guān)于Spring mvc的相關(guān)知識,文章圍繞著Spring mvc是如何實現(xiàn)與數(shù)據(jù)庫的前后端的連接操作的展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下2021-06-06SpringCloud使用Feign實現(xiàn)動態(tài)路由操作
這篇文章主要介紹了SpringCloud使用Feign實現(xiàn)動態(tài)路由操作,文章圍繞主題展開詳細的內(nèi)容介紹具有一定的參考價值,需要的小伙伴可以參考一下2022-06-06