編者按:本文作者為北師大的大三學生張俏,女Geek,在CSDN等各大網站的使用者資料被泄露之後,她就MD5加密問題寫下此文,發表了自己的看法,如果有讀者想要跟作者進一步探討,可以在新浪微博@阿豆拉。
MD5為現在應用最廣泛的Hash演算法之一,在1992年由MIT 的Ronald L. Riverst提出,由MD4演化而來。該演算法廣泛應用於互連網網站的使用者資料加密,能夠將使用者密碼加密為128位的長整數。資料庫並不明文儲存使用者密碼,而是在使用者登入時將輸入密碼字串進行MD5加密,與資料庫中所儲存的MD5值匹配,從而降低密碼資料庫被盜取後使用者損失的風險。
但由於Hash碰撞的存在,MD5加密的資料並不安全,可以由產生相同Hash值的字串破解,所以提出了加入隨機數salt的MD5加密方法,一定程度上增大了字典攻擊的難度。
問題提出
前一陣在新浪微博上,有一個人發布了這樣一條微博:“出道互連網安全常識數學題……假設你的網站所有使用者密碼都是md5加密(單向散列,非可逆)的,假設你網站有10萬會員,如果你的使用者庫丟了,會有多少會員密碼被破解?想想看。”當時我的一位朋友認為10萬個密碼全部都會被破解,我卻不這樣認為,因為根據我的先驗知識:
(1) MD5密碼編譯演算法在互連網應用中廣泛被使用,MD5不是簡單的古典密碼編譯演算法,不能通過逆向Decrypt解密,只能通過Hash碰撞破解(Hack);
(2) 我曾經看過對同一個字串進行MD5加密的結果,產生結果是隨機的字串(後來經過尋找資料發現我所看到的不是簡單的MD5加密,而是加鹽後的結果);
(3) MD5用作密碼密碼編譯演算法並不是絕對安全的,因為可能產生Hash碰撞,簡單密碼的MD5加密可以通過彩虹表尋找到;
(4) 我曾見過幾個破解MD5加密的網站(http://www.cmd5.com/),大多數的做法是先免費為使用者暴力破解,積累起足夠的資料庫可以破解簡單密碼後,解密服務便開始收費,所以MD5密碼的破解不應該那麼簡單。
在經過對這個問題激烈的討論過後,沒過多久便發生了CSDN的資料庫泄露事件,600萬條資料庫記錄被任意傳播。緊接著天涯論壇的資料庫也泄露了,2000萬條資料庫記錄被證實幾乎均可以登入。而這兩個網站的資料庫中所儲存的使用者密碼都沒有經過加密,即為明文儲存的。這種事情的發生更加證實了對網站資料庫中所儲存的使用者密碼進行加密的重要性。
現今流行的對使用者密碼密碼編譯演算法中,MD5加密是最為廣泛使用的演算法之一。
背景知識
對於散列函數h(x),必須滿足下列特性[1]:
壓縮:對於給定輸入x,輸出長度y=h(x)很小;
效率:對於給定輸入x,計算y=h(x)很容易;
單向:該散列函數H是一個單向函數,即對於幾乎所有的x,已知H(x)的值y求x是不可行的;
弱無碰撞:已知x,求出x’使得H(x’)==H(x)在計算上是不可行的;
強無碰撞:對於任意x≠x’,H(x’)==H(x)在計算上是不可行的。
MD5的全稱是Message-Digest Algorithm 5,在1991年由MIT 的Ronald L. Riverst提出,由MD4演化而來,最終產生128位(4個32位的16進位數)的資訊摘要演算法。[2] MD5演算法是一個無法復原的字串變換演算法,即看到來源程式和演算法描述,也無法將一個MD5的值變換回原始的字串。
1993年,Den Boer和Bosselaers給出了一個有限的“偽碰撞”結果;
1996年,MD5演算法的設計被發現有缺陷,雖然當時並未被證明該缺陷是致命的,密碼學專家建議使用其它密碼編譯演算法(如SHA-1)。
2004年,MD5演算法被證明不安全,原因是會產生Hash碰撞。[3]
2007年,研究人員發現使用Chosen-prefix Collision方法,可以使包含惡意代碼的程式產生合法的MD5值。
2008年,研究人員發現了產生相同MD5 Hash值的兩個可執行檔。
以上執行個體證明,MD5演算法的安全性並不高,不能應用於對安全性要求很高的SSL加密及數位簽章之中。目前最被推薦的Hash密碼編譯演算法應為SHA-2密碼編譯演算法。
MD5演算法描述
MD5演算法針對不定長的輸入,可以輸出固定128位長度的加密資訊。MD5以512位來分組輸入的資訊,每一分組又被劃分為16個32位子分組,經過演算法流程最終產生四個32位元據聯合成為128位的散列。演算法的具體過程如下[4]:
(1) 資訊進行填充,使其位長對512求餘的結果等於448。將資訊的長度擴充至N*512+448,其中N為一個非負整數,N可以是零。填充的方法為在資訊的後面填充一個1和無數個0,直到滿足條件。
查看本欄目更多精彩內容:http://www.bianceng.cnhttp://www.bianceng.cn/web/Skills/
(2) 在這個結果後面附加一個以64位二進位表示的填充前資訊長度。經過這兩步的處理,現在的資訊的位長=N*512+448+64=(N+1)*512,即長度恰好是512的整數倍。這樣做的原因是為滿足後面處理中對資訊長度的要求。MD5中有四個32位被稱作連結變數(Chaining Variable)的整數參數,他們的初始值分別為:A=0×67452301,B=0xefcdab89,C=0x98badcfe,D=0×10325476。
(3) 進入演算法的四輪主迴圈運算。迴圈的次數是資訊中512位資訊分組的數目。主迴圈有四輪,每輪迴圈都很相似。第一輪進行16次操作。每次操作對a、b、c和d中的其中三個作一次非線性函數運算,然後將所得結果加上第四個變數,文本的一個子分組和一個常數。再將所得結果向左環移一個不定的數,並加上a、b、c或d中之一。最後用該結果取代a、b、c或d中之一。
(4) 經過四輪逐位元運算完成之後,將A、B、C、D分別加上a、b、c、d。然後用下一分組資料繼續運行演算法,最後的輸出是A、B、C和D的級聯。