MD5信息摘要算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼散列函數(shù),可以產(chǎn)生出一個(gè)128位(16字節(jié))的散列值(hash value),用于確保信息傳輸完整一致。MD5由美國密碼學(xué)家羅納德·李維斯特(Ronald Linn Rivest)設(shè)計(jì),于1992年公開,用以取代MD4算法。這套算法的程序在 RFC 1321 標(biāo)準(zhǔn)中被加以規(guī)范。1996年后該算法被證實(shí)存在弱點(diǎn),可以被加以破解,對(duì)于需要高度安全性的數(shù)據(jù),專家一般建議改用其他算法,如SHA-2。2004年,證實(shí)MD5算法無法防止碰撞(collision),因此不適用于安全性認(rèn)證,如SSL公開密鑰認(rèn)證或是數(shù)字簽名等用途。
1992年8月,羅納德·李維斯特向互聯(lián)網(wǎng)工程任務(wù)組(IETF)提交了一份重要文件,描述了這種算法的原理。由于這種算法的公開性和安全性,在90年代被廣泛使用在各種程序語言中,用以確保資料傳遞無誤等。MD5由MD4、MD3、MD2改進(jìn)而來,主要增強(qiáng)算法復(fù)雜度和不可逆性。MD5算法因其普遍、穩(wěn)定、快速的特點(diǎn),仍廣泛應(yīng)用于普通數(shù)據(jù)的加密保護(hù)領(lǐng)域。
MD2Rivest在1989年開發(fā)出MD2算法。在這個(gè)算法中,首先對(duì)信息進(jìn)行數(shù)據(jù)補(bǔ)位,使信息的字節(jié)長度是16的倍數(shù)。然后,以一個(gè)16位的校驗(yàn)和追加到信息末尾,并且根據(jù)這個(gè)新產(chǎn)生的信息計(jì)算出散列值。后來,Rogier和Chauvaud發(fā)現(xiàn)如果忽略了校驗(yàn)和MD2將產(chǎn)生沖突。MD2算法加密后結(jié)果是唯一的(即不同信息加密后的結(jié)果不同) 。
MD4為了加強(qiáng)算法的安全性,Rivest在1990年又開發(fā)出MD4算法。MD4算法同樣需要填補(bǔ)信息以確保信息的比特位長度減去448后能被512整除(信息比特位長度mod 512 = 448)。然后,一個(gè)以64位二進(jìn)制表示的信息的最初長度被添加進(jìn)來。信息被處理成512位damgard/merkle迭代結(jié)構(gòu)的區(qū)塊,而且每個(gè)區(qū)塊要通過三個(gè)不同步驟的處理。Den boer和Bosselaers以及其他人很快的發(fā)現(xiàn)了攻擊MD4版本中第一步和第三步的漏洞。Dobbertin向大家演示了如何利用一部普通的個(gè)人電腦在幾分鐘內(nèi)找到MD4完整版本中的沖突(這個(gè)沖突實(shí)際上是一種漏洞,它將導(dǎo)致對(duì)不同的內(nèi)容進(jìn)行加密卻可能得到相同的加密后結(jié)果)。
MD51991年,Rivest開發(fā)出技術(shù)上更為趨近成熟的MD5算法。它在MD4的基礎(chǔ)上增加了"安全帶"(safety-belts)的概念。雖然MD5比MD4復(fù)雜度大一些,但卻更為安全。這個(gè)算法很明顯的由四個(gè)和MD4設(shè)計(jì)有少許不同的步驟組成。在MD5算法中,信息-摘要的大小和填充的必要條件與MD4完全相同。Den boer和Bosselaers曾發(fā)現(xiàn)MD5算法中的假?zèng)_突(pseudo-collisions),但除此之外就沒有其他被發(fā)現(xiàn)的加密后結(jié)果了。
當(dāng)我們需要保存某些密碼信息以用于身份確認(rèn)時(shí),如果直接將密碼信息以明碼方式保存在數(shù)據(jù)庫中,不使用任何保密措施,系統(tǒng)管理員就很容易能得到原來的密碼信息,這些信息一旦泄露, 密碼也很容易被破譯。為了增加安全性,有必要對(duì)數(shù)據(jù)庫中需要保密的信息進(jìn)行加密,這樣,即使有人得到了整個(gè)數(shù)據(jù)庫,如果沒有解密算法,也不能得到原來的密碼信息。MD5算法可以很好地解決這個(gè)問題,因?yàn)樗梢詫⑷我忾L度的輸入串經(jīng)過計(jì)算得到固定長度的輸出,而且只有在明文相同的情況下,才能等到相同的密文,并且這個(gè)算法是不可逆的,即便得到了加密以后的密文,也不可能通過解密算法反算出明文。這樣就可以把用戶的密碼以MD5值(或類似的其它算法)的方式保存起來,用戶注冊(cè)的時(shí)候,系統(tǒng)是把用戶輸入的密碼計(jì)算成 MD5 值,然后再去和系統(tǒng)中保存的 MD5 值進(jìn)行比較,如果密文相同,就可以認(rèn)定密碼是正確的,否則密碼錯(cuò)誤。通過這樣的步驟,系統(tǒng)在并不知道用戶密碼明碼的情況下就可以確定用戶登錄系統(tǒng)的合法性。這樣不但可以避免用戶的密碼被具有系統(tǒng)管理員權(quán)限的用戶知道,而且還在一定程度上增加了密碼被破解的難度。