這裏是修真院後端小課堂,每篇分享文從java
【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴展思考】【更多討論】【參考文獻】程序員
八個方面深度解析後端知識/技能,本篇分享的是:算法
【return的用法是什麼?若在for循環中,還會執行下一次循環嗎?】數據庫
【修真院java小課堂】什麼叫MD5,MD5一般作什麼用處,爲何MD5不可逆,用作密碼加密的時候仍然可能會被解密?後端
你們好,我是IT修真院成都分院第13期的學員,一枚正直純潔善良的java程序員,今天給你們分享一下,修真院官網java任務5,深度思考中的知識點——什麼叫MD5,MD5一般作什麼用處,爲何MD5不可逆,用作密碼加密的時候仍然可能會被解密?安全
(1)背景介紹:服務器
什麼是MD5?函數
MD5消息摘要算法(英語:MD5 Message-Digest Algorithm),一種被普遍使用的密碼散列函數,能夠產生出一個128位(16字節)的散列值(hash value),用於確保信息傳輸完整一致。MD5由美國密碼學家羅納德·李維斯特(Ronald Linn Rivest)設計,於1992年公開,用以取代MD4算法。工具
密碼散列函數(Cryptographic hash function),又譯爲加密散列函數,是散列函數的一種。網站
MD4算法在安全上有大的漏洞,但它對在其後才被開發出來的好幾種信息安全加密算法的出現卻有着不可忽視的引導做用,好比MD5加密算法.
(2)知識剖析:
主要應用:
2.1一致性驗證
MD5的典型應用是對一段信息(Message)產生信息摘要(Message-Digest),以防止被篡改。好比,在Unix下有不少軟件在下載的時候都有一個文件名相同,文件擴展名爲.md5的文件,在這個文件中一般只有一行文本,大體結構如:
MD5 (tanajiya.tar.gz) = 38b8c2c1093dd0fec383a9d9ac940515
MD5將整個文件看成一個大文本信息,經過其不可逆的字符串變換算法,產生了這個惟一的MD5信息摘要。
舉例描述:
咱們經常在某些軟件下載站點的某軟件信息中看到其MD5值,它的做用就在於咱們能夠在下載該軟件後,對下載回來的文件用專門的軟件(如Windows MD5 Check等)作一次MD5校驗,以確保咱們得到的文件與該站點提供的文件爲同一文件。
具體來講文件的MD5值就像是這個文件的「數字指紋」。每一個文件的MD5值是不一樣的,若是任何人對文件作了任何改動,其MD5值也就是對應的「數字指紋」就會發生變化。好比下載服務器針對一個文件預先提供一個MD5值,用戶下載完該文件後,用我這個算法從新計算下載文件的MD5值,經過比較這兩個值是否相同,就能判斷下載的文件是否出錯,或者說下載的文件是否被篡改了。
利用MD5算法來進行文件校驗的方案被大量應用到軟件下載站、論壇數據庫、系統文件安全等方面。
2.2數字簽名
MD5的典型應用是對一段Message(字節串)產生fingerprint(指紋),以防止被「篡改」。舉個例子,你將一段話寫在一個叫 readme.txt文件中,並對這個readme.txt產生一個MD5的值並記錄在案,而後你能夠傳播這個文件給別人,別人若是修改了文件中的任何內容,你對這個文件從新計算MD5時就會發現(兩個MD5值不相同)。若是再有一個第三方的認證機構,用MD5還能夠防止文件做者的「抵賴」,這就是所謂的數字簽名應用。
2.3安全訪問認證
MD5還普遍用於操做系統的登錄認證上,如Unix、各種BSD系統登陸密碼、數字簽名等諸多方面。如在Unix系統中用戶的密碼是以MD5(或其它相似的算法)經Hash運算後存儲在文件系統中。當用戶登陸的時候,系統把用戶輸入的密碼進行MD5 Hash運算,而後再去和保存在文件系統中的MD5值進行比較,進而肯定輸入的密碼是否正確。經過這樣的步驟,系統在並不知道用戶密碼的明碼的狀況下就能夠肯定用戶登陸系統的合法性。這能夠避免用戶的密碼被具備系統管理員權限的用戶知道。
2.4算法原理
對MD5算法簡要的敘述能夠爲:MD5以512位分組來處理輸入的信息,且每一分組又被劃分爲16個32位子分組,通過了一系列的處理後,算法的輸出由四個32位分組組成,將這四個32位分組級聯後將生成一個128位散列值
(3)常見問題:
(4)解決方案:
(5)編碼實戰:
@Test
public void MD5Test(){
String password = "!ytd1129097428";
String md1 = MD5Util.MD5(password);
String md2 = MD5Util.generate(password);
System.out.println("加密前:"+password);
System.out.println("普通MD5加密後:"+md1);
System.out.println("加鹽MD5加密後:"+md2);
System.out.println("比較原文和加鹽MD5加密以後是否一致:"+MD5Util.verify(password,md2));
}
輸出結果:
加密前:!ytd1129097428
普通MD5加密後:add4ff4fb01ace59713390dc5876d5d0
加鹽MD5加密後:96b911880466d91d3244f37bd56c4531967c28d65181f191
比較原文和加鹽MD5加密以後是否一致:true
(6)拓展思考:
關於撞庫破解:
這是機率極低的破解方法,原理就是:
1.創建一個大型的數據庫,把平常的各個語句,經過MD5加密成爲密文,不斷的積累大量的句子,放在一個龐大的數據庫裏.
2.好比一我的拿到了別人的密文,想去查詢真實的密碼,就須要那這個密文去到提供這個數據庫的公司網站去查詢.
在線MD5解密: http://www.cmd5.com/
(7)參考文獻:
https://www.zhihu.com/questio...
https://blog.csdn.net/dingsai...
https://baike.baidu.com/item/MD5
(8)更多討論:
Q1:1.MD5碼不是128位的嗎?爲什麼得出來的亂碼有的是32位的?
A1:128位是指二進制位。二進制太長,因此通常都改寫成16進制,每一位16進制數能夠代替4位二進制數,因此128位二進制數寫成16進制就變成了128/4=32位。
Q2:2.MD5特色是什麼?
A2:1.長度固定:
無論多長的字符串,加密後長度都是同樣長
做用:方便平時信息的統計和管理
2.易計算:
字符串和文件加密的過程是容易的.
做用: 開發者很容易理解和作出加密工具
3.細微性:
一個文件,無論多大,小到幾k,大到幾G,你只要改變裏面某個字符,那麼都會致使MD5值改變.
做用:不少軟件和應用在網站提供下載資源,其中包含了對文件的MD5碼,用戶下載後只須要用工具測一下下載好的文件,經過對比就知道該文件是否有過更改變更.
4.不可逆性:
你明明知道密文和加密方式,你卻沒法反向計算出原密碼.
做用:基於這個特色,不少安全的加密方式都是用到.大大提升了數據的安全性
Q3:3.什麼是MD5加鹽?
A3:好比個人銀行密碼是」12345」
1.獲得的MD5是:827ccb0eea8a706c4c34a16891f84e7b
2.一我的截取到這個密文,那麼經過撞庫確定容易撞出12345.
3.咱們要作的就是加鹽,銀行密碼仍是」12345」,而後我把銀行密碼加上我特定的字符串才計算MD5 因此密碼仍是那個密碼,可是變成求」12345密碼加密987」的MD5值,而後再獲得MD5,那麼這個MD5起碼能夠確認那個數據庫不會有.
(9)鳴謝:
感謝觀看。
(10)結束語:
今天的分享就到這裏啦,歡迎你們點贊、轉發、留言、拍磚