关于MD5的那点事,你都了解清楚了吗?
文章目錄
- 1.什么是MD5?
- 2.MD5真的安全么?
- 3.MD5如何被破解?
- 4.怎么防止MD5被破解?
1.什么是MD5?
??MD5信息摘要算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼散列函數,可以產生出一個128位(16字節)的散列值(hash value)1,用于確保信息傳輸完整一致。MD5由美國密碼學家羅納德·李維斯特(Ronald Linn Rivest)設計,于1992年公開,用以取代MD4算法。這套算法的程序在 RFC 1321 標準中被加以規范。1996年后該算法被證實存在弱點,可以被加以破解,對于需要高度安全性的數據,專家一般建議改用其他算法,如SHA-2。2004年,證實MD5算法無法防止碰撞(collision),因此不適用于安全性認證,如SSL公開密鑰認證或是數字簽名等用途。
2.MD5真的安全么?
??了解MD5的都知道,它是不可能逆的,即我們沒辦法把MD5碼還原對應的原文。道理很簡單,任意長度的數據經過MD5處理后,所包含的信息量已經大大減少。要是可以還原的話,那MD5豈不是成為壓縮算法??所以這里就會給很多人造成誤解,以為不可逆就是不可破解,的確,復雜些的密碼在一些MD5在線破解網站是破解不了的,相對來說是安全的。可是,針對一個有安全隱患的問題來說,相對安全就是不安全。隨著科學技術水平的提升,MD5已經越來越不安全了!!!正如其網站公告所說:2
3.MD5如何被破解?
??有很多種方法可以破解,不過需要明確一點,這里所謂的破解,并非把摘要還原成原文。為什么呢?因為固定128位的摘要是有窮的,而原文數量是無窮的,每一個摘要都可以由若干個原文通過Hash得到。
??對于MD5的破解,實際上都屬于【碰撞】3。比如原文A通過MD5可以生成摘要M,我們并不需要把X還原成A,只需要找到原文B,生成同樣的摘要M即可。
設MD5的哈希函數是H(X),那么: H(A) = M H(B) = M 任意一個B即為破解結果。 B有可能等于A,也可能不等于A。 用一個形象的說法,A和B的MD5結果“殊途同歸”。??MD5碰撞通常用于登陸密碼的破解。應用系統的數據庫中存儲的用戶密碼通常都是原密碼的MD5哈希值,每當用戶登錄時,驗簽過程如下:
??如果我們得到了用戶ABC的密碼哈希值E10ADC3949BA59ABBE56E057F20F883E,并不需要還原出原密碼123456,只需要“碰撞”出另一個原文654321(只是舉例)即可。登錄時,完全可以使用654321作為登陸密碼,欺騙過應用系統的驗簽。
4.怎么防止MD5被破解?
??看完第3點你就知道了,MD5不夠安全,但是如果你對它一往情深,只想用MD5的話,不妨可以試下以下做法:
-
多重加密
??所謂的多重加密,顧名思義,就是把你要加密的原文加密成MD5密文,然后再一次將MD5密文加密成MD5密文,多試幾次,一般3次以后,在線破解網站就匹配不上了,但是,匹配不上就不代表足夠安全喔,只是不容易被輕易破解(因為第二次要破解的原文是一個32位的數字字母的結合,以此類推),增加破解的時間成本而已! -
加鹽加密
??比如Java中的Md5Crypt.apr1Crypt("要加密的密文","自定義鹽值"),可以多重使用,自定掂量! -
使用復雜密碼(包含數字英文小數點等)
??經過反復測試,使用復雜的密碼也能降低被破解的風險,這也是現在很多軟件系統都強制用戶的密碼不能低于16位數,且應包含數字英文小數點等的原因。 -
不要在網站中顯示密碼列,哪怕是加密后回顯的,也不可取!
??這一點很多初級開發者很容易犯錯,在頁面數據表格中綁定密碼列給用戶看,可能只是單純的展示數據,卻忽視了密碼這一點容易被攻破的風險。比如下面這種情況,直接在表單回顯密碼,雖然是不可編輯和加密的狀態,但是同樣可以進行破解,這點你隨便找個有經驗的前端開發者應該都會。
謹記:(沒有最好,只有更好)
??雖然MD5無法解密,但是可以碰撞出來,有庫就行,對于單機來說,暴力枚舉法的時間成本很高,字典法的空間成本很高。但是利用分布式計算和分布式存儲,仍然可以有效破解MD5算法。因此這兩種方法同樣被黑客們廣泛使用。
其實散列和Hash是一個東西(下文稱Hash),只是一個中國名一個英文名。就是把任意長度的輸入(又叫作預映射, pre-image),經過散列算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間一般遠小于輸入的空間,不一樣的輸入可能會散列成相同的輸出,因此不可能從散列值來惟一的肯定輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。 ??
本站針對md5、sha1等全球通用公開的加密算法進行反向查詢,通過窮舉字符組合的方式,創建了明文密文對應查詢數據庫,創建的記錄約90萬億條,占用硬盤超過500TB,查詢成功率95%以上。 ??
MD5碰撞的方法有很多,主要包括暴力枚舉法、字典法、彩虹表法等等。
1.暴力枚舉法:
??暴力枚舉法顧名思義,就是簡單粗暴地枚舉出所有原文,并計算出它們的哈希值,看看哪個哈希值和給定的信息摘要一致。這種方法雖然簡單,但是時間復雜度極高。想象一下,僅僅長度8位的密碼就有多少種排列組合的可能性?只考慮大小寫字母和數字,每一位有62種可能,那么8位密碼的排列組合就是62的8次方,218340105584800,約等于二百萬億!是的,這樣的數據量如果使用普通的單機來破解,恐怕頭發白了也破解不完。不過,我們也可以做一些取巧,優先嘗試生日和有意義的單詞,這樣就可以把窮舉范圍縮小很多。
2.字典法:
??如果說暴力枚舉法是ongoing時間換空間,那么字典法則是用空間換時間。黑客利用一個巨大的字典,存儲盡可能多的原文和對應的哈希值。每次用給定的信息摘要查找字典,即可快速找到碰撞的結果。不過,這樣做雖然每次破解速度很快,但是生成字典需要巨大的空間。仍然以8位密碼舉例,需要多大空間呢?剛才計算過有218340105584800種可能性,每一對映射占192(128+64)bit。那么大約需要4.65PB的存儲空間。沒錯,這樣做的存儲成本實在太大了。當然,我們同樣可以取巧,優先存儲那些常用的密碼及其摘要。那么,有沒有什么方法可以做到時間和空間的均衡呢?有一種方法可以,那就是下面我要介紹的【彩虹表】。
3.彩虹表法:
??彩虹表法可以說是對字典法的優化,它采用了一種有趣的數據結構:【彩虹表】。在學習彩虹表之前,我們先來了解兩個基本函數:H(X)和R(X)。
H(X):生成信息摘要的哈希函數,比如MD5,比如SHA256。
R(X):從信息摘要轉換成另一個字符串的衰減函數(Reduce)。其中R(X)的定義域是H(X)的值域,R(X)的值域是H(X)的定義域。但要注意的是,R(X)并非H(X)的反函數。
??通過交替運算H和R若干次,可以形成一個原文和哈希值的鏈條。假設原文是aaaaaa,哈希值長度32bit,那么哈希鏈表就是下面的樣子:
??這個鏈條有多長呢?假設H(X)和R(X)的交替重復K次,那么鏈條長度就是2K+1。同時,我們只需把鏈表的首段和末端存入哈希表中:
??看到此,估計很多人就會有疑惑這什么跟什么啊,衰減函數和哈希鏈條,到底是干什么用的?別急,我們來演示一次破解過程,你就明白它們的意義了。給定信息摘要:920ECF10,接下來如何得到原文呢?只需進行R(X)運算:R(920ECF10)= kiebgt 查詢哈希表可以找到末端kiebgt對應的首端是aaaaaa,因此摘要920ECF10的原文“極有可能”在aaaaaa到kiebgt的這個鏈條當中。
??接著從aaaaaa開始,重新交替運算R(X)與H(X),看一看摘要值920ECF10是否是其中一次H(X)的結果。從鏈條看來,答案是肯定的,因此920ECF10的原文就是920ECF10的前置節點sgfnyd。
??需要補充的是,如果給定的摘要值經過一次R(X)運算,結果在哈希表中找不到,可以繼續交替H(X)R(X)直到第K次為止。
??簡單來說,哈希鏈表代表了一組映射關系,其中每組包含K對映射,但只需要存儲鏈條首位兩個字符串。假設K=10,那么存儲空間只有全量字典的十分之一,代價則是破解一個摘要的運算次數也提高了十倍。這就是時間和空間的取舍。雖然做了取舍,但是哈希鏈條存在一個致命的缺陷:R(X)函數的可靠性。雖然我們盡量把R(X)設計成結果均勻分布的函數,但是再完美的函數也難免會有碰撞的情況,比如這樣:給定信息摘要:FB107E70,經過多次R(X),H(X)運算,得到結果kiebgt 通過哈希表查找末端kiebgt,可以找出首端aaaaaa,但是,FB107E70并不在aaaaaa到kiebgt的哈希鏈條當中,這就是R(X)的碰撞造成的。
??這個問題看似沒什么影響,既然找不到就重新生成一組首尾映射即可。但是想象一下,當K值較大的時候,哈希鏈很長,一旦兩條不同的哈希鏈在某個節點出現碰撞,后面所有的明文和哈希值全都變成了一模一樣的值。
??這樣造成的后果就是冗余存儲。原本兩條哈希鏈可以存儲 2K個映射,由于重復,真正存儲的映射數量不足2K。
??這個時候,我們設計了彩虹表。彩虹表對哈希鏈進行了改進,把原先的R(X)的函數改進成從R1(X)到Rk(X)一共K個衰減函數。這樣一來雖然也可能發生碰撞,但是碰撞只會發生在同一級運算,如R1和R1碰撞,R3和R3碰撞,大大減小了存儲重復的幾率。
??相信看到這里,又有一部分人吐槽:啊,好復雜,看的頭都暈了,如果想要破解MD5算法,有沒有比彩虹表更厲害的方法呢?還真有。這里就不一一闡述了,感興趣的小伙伴自行去了解哈~
詳情請參考我上一篇文章:
通宵寫6000字,淺談密碼的破解(破解HASH算法加密)
密碼的常見加密方式,你都了解多少? ??
總結
以上是生活随笔為你收集整理的关于MD5的那点事,你都了解清楚了吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: golang-亚马逊s3上传图片文件
- 下一篇: qq游戏中的bug