何謂MD5?MD5全稱為Message-Digest Algorithm 5,即信息-摘要算法 5。即通過一系列運(yùn)算,將一段信息(Message)換算成對應(yīng)的且全世界唯一(有沖 突,稍后會說)的信息摘要(Message-Digest)。
簡單的來說,MD5值就相當(dāng)于人的指紋,你可以這樣想象它:把人丟到電腦里面計算,出來的結(jié)果是那人的指紋。
但是需要注意的一點是,MD5過程是不可逆的。同樣的道理,拿個人你可以看到他指紋,但是拿到指紋你看不到他本人。
如上圖,我們常常在某些軟件下載站點的某軟件信息中看到其MD5值,它的作用就在于我們可以在下載該軟件后,對下載回來的文件用專門的軟件(如Windows MD5 Check等)做一次MD5校驗,以確保我們獲得的文件與該站點提供的文件為同一文件。利用MD5算法來進(jìn)行文件校驗的方案被大量應(yīng)用到軟件下載站、論壇數(shù)據(jù)庫、系統(tǒng)文件安全等方面。
MD5的典型應(yīng)用是對一段Message(字節(jié)串)產(chǎn)生fingerprint(指紋),以防止被“篡改”。舉個例子,你將一段話寫在一個叫 readme.txt文件中,并對這個readme.txt產(chǎn)生一個MD5的值并記錄在案,然后你可以傳播這個文件給別人,別人如果修改了文件中的任何內(nèi)容,你對這個文件重新計算MD5時就會發(fā)現(xiàn)(兩個MD5值不相同)。如果再有一個第三方的認(rèn)證機(jī)構(gòu),用MD5還可以防止文件作者的“抵賴”,這就是所謂的數(shù)字簽名應(yīng)用。
MD5還廣泛用于操作系統(tǒng)的登陸認(rèn)證上,如Unix、各類BSD系統(tǒng)登錄密碼、數(shù)字簽名等諸多方。如在UNIX系統(tǒng)中用戶的密碼是以MD5(或其它類似的算法)經(jīng)Hash運(yùn)算后存儲在文件系統(tǒng)中。當(dāng)用戶登錄的時候,系統(tǒng)把用戶輸入的密碼進(jìn)行MD5 Hash運(yùn)算,然后再去和保存在文件系統(tǒng)中的MD5值進(jìn)行比較,進(jìn)而確定輸入的密碼是否正確。通過這樣的步驟,系統(tǒng)在并不知道用戶密碼的明碼的情況下就可以確定用戶登錄系統(tǒng)的合法性。這可以避免用戶的密碼被具有系統(tǒng)管理員權(quán)限的用戶知道。我們設(shè)計的微型管理系統(tǒng)亦可以如此。
有報道稱MD5已被山東大學(xué)王小云教授,具體怎么個破解法有識之士可以去研究研究。而且現(xiàn)在網(wǎng)上有很多提供破解MD5的網(wǎng)站,其基本原理都是一樣:將字符串組合一一求出MD5值,存入記錄,待用戶查詢檢索。較好的網(wǎng)站有http://www.cmd5.com/,可以上去玩玩。但是我就有個想法了,如果MD5嵌套,如MD5(MD5(“tester”)),那這樣得出的MD5值破解起來不是異常麻煩?
簡單的來說,MD5就是將輸入的信息以512位分組,且每一分組被劃分為16個32位子分組,經(jīng)過了一系列的處理后,算法的輸出由四個32位分組組成,將這四個32位分組級聯(lián)后將生成一個128位散列值。 即算法分為了兩部分,兩部分如下:
在MD5算法中,首先需要對信息進(jìn)行填充,使其位長對512求余的結(jié)果等于448。因此,信息的位長(Bits Length)將被擴(kuò)展至N*512+448,即N*64+56個字節(jié)(Bytes),N為一個正整數(shù)。填充的方法如下,在信息的后面填充一個1和無數(shù)個0,直到滿足上面的條件時才停止用0對信息的填充。然后,在在這個結(jié)果后面附加一個以64位二進(jìn)制表示的填充前信息長度。經(jīng)過這兩步的處理,現(xiàn)在的信息的位長等于N * 512 + 448 + 64 = ( N + 1 ) * 512,即長度恰好是512的整數(shù)倍。
這樣做的原因是為滿足后面處理中對信息長度的要求。
對數(shù)據(jù)進(jìn)行循環(huán)處理,主循環(huán)次數(shù)為512位分組信息的數(shù)目。主循環(huán)有四輪,每輪循環(huán)都很相似。每一輪均進(jìn)行16次操作。具體運(yùn)算步驟如下:
1、設(shè)置鏈接變量(Chaining Variable),分別為:A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210。
2、將上面四個鏈接變量復(fù)制到另外四個變量中:A到a,B到b,C到c,D到d。
3、以上四個變量進(jìn)行4大輪(64步)的非線性函數(shù)運(yùn)算。 (具體循環(huán)變換函數(shù)參加附錄)
4、將A、B、C、D分別加上a、b、c、d。然后用下一分組數(shù)據(jù)繼續(xù)運(yùn)行算法,最后的輸出是A、B、C和D的級聯(lián)。
P.S.: 需要實現(xiàn)的請留郵箱,插代碼功能不大好使……作者水平有限,如有錯誤、不當(dāng)之處,望指正批評……