1. 程式人生 > >Message Digest Algorithm MD5(訊息摘要演算法第五版)簡單瞭解

Message Digest Algorithm MD5(訊息摘要演算法第五版)簡單瞭解

Message Digest Algorithm MD5(訊息摘要演算法第五版)為電腦保安領域廣泛使用的一種雜湊函式,用以提供訊息的完整性保護。
該演算法的檔案號為RFC 1321(R.Rivest,MIT Laboratory for Computer Science and RSA Data Security Inc. April 1992)

在90年代初由MIT Laboratory for Computer Science和RSA Data Security Ic,的Ronald L. Rivest開發出來,經MD2、MD3和MD4發展而來。它的作用是讓大容量資訊在用數字簽名軟體簽署私人金鑰前被”壓縮”成一種保密的格式(就是把一個任意長度的位元組串變換成一定長的大整數)。

  MD5最廣泛被用於各種軟體的密碼認證和鑰匙識別上。通俗的講就是人們講的序列號。

MD2演算法

  Rivest在1989年開發出MD2演算法。在這個演算法中,首先對資訊進行資料補位,使資訊的位元組長度是16的倍數。然後,以一個16位的檢驗和追加到資訊末尾,並且根據這個新產生的資訊計算出雜湊值。後來,Rogier和Chauvaud發現如果忽略了檢驗將和MD2產生衝突。MD2演算法加密後結果是唯一的(即不同資訊加密後的結果不同)。

MD4演算法

  為了加強演算法的安全性,Rivest在1990年又開發出MD4演算法。MD4演算法同樣需要填補資訊以確保資訊的位元位長度加上448後能被512整除(資訊位元位長度mod 512 = 448)。Den boer和Bosselaers以及其他人很快的發現了攻擊MD4版本中第一步和第三步的漏洞。
  儘管MD4演算法在安全上有個這麼大的漏洞,但它對在其後才被開發出來的好幾種資訊保安加密演算法的出現卻有著不可忽視的引導作用。除了MD5以外,其中比較有名的還有sha-1、RIPEMD以及Haval等。

MD5演算法

  一年以後,即1991年,Rivest開發出技術上更為趨近成熟的md5演算法。它在MD4的基礎上增加了”安全-帶子”(safety-belts)的概念。雖然MD5比MD4稍微慢一些,但卻更為安全。這個演算法很明顯的由四個和MD4設計有少許不同的步驟組成。在MD5演算法中,資訊-摘要的大小和填充的必要條件與MD4完全相同。Den boer和Bosselaers曾發現MD5演算法中的假衝突(pseudo-collisions),但除此之外就沒有其他被發現的加密後結果了。
  Van oorschot和Wiener曾經考慮過一個在雜湊中暴力搜尋衝突的函式(brute-force hash function),而且他們猜測一個被設計專門用來搜尋MD5衝突的機器(這臺機器在1994年的製造成本大約是一百萬美元)可以平均每24天就找到一個衝突。但單從1991年到2001年這10年間,竟沒有出現替代MD5演算法的MD6或被叫做其他什麼名字的新演算法這一點,我們就可以看出這個瑕疵並沒有太多的影響MD5的安全性。上面所有這些都不足以成為MD5的在實際應用中的問題。並且,由於MD5演算法的使用不需要支付任何版權費用的,所以在一般的情況下(非絕密應用領域。但即便是應用在絕密領域內,MD5也不失為一種非常優秀的中間技術),MD5怎麼都應該算得上是非常安全的了。
  MD5用的是雜湊函式,在計算機網路中應用較多的不可逆加密演算法有RSA公司發明的MD5演算法和由美國國家技術標準研究所建議的安全雜湊演算法SHA。

演算法的應用

1.對資訊產生摘要

  MD5的典型應用是對一段資訊(Message)產生資訊摘要(Message-Digest),以防止被篡改。比如,在UNIX下有很多軟體在下載的時候都有一個檔名相同,副檔名為.md5的檔案,在這個檔案中通常只有一行文字,大致結構如:
  MD5 (檔案abc.tar.gz) = 0ca175b9c0f726a831d895e244332461

這就是 “檔案abc.tar.gz” 的數字簽名。MD5將整個檔案當作一個大文字資訊,通過其不可逆的字串變換演算法,產生了這個唯一的MD5資訊摘要。
地球上任何人都有自己獨一無二的指紋,這常常成為鑑別罪犯身份最值得信賴的方法;與之類似,MD5就可以為任何檔案(不管其大小、格式、數量)產生一個同樣獨一無二的“數字指紋”,如果任何人對檔案做了任何改動,其MD5值也就是對應的“數字指紋”都會發生變化。
  我們常常在某些軟體下載站點的某軟體資訊中看到其MD5值,它的作用就在於我們可以在下載該軟體後,對下載回來的檔案用專門的軟體(如Windows MD5 Check等)做一次MD5校驗,以確保我們獲得的檔案與該站點提供的檔案為同一檔案。利用MD5演算法來進行檔案校驗的方案被大量應用到軟體下載站、論壇資料庫、系統檔案安全等方面。

2.對位元組串產生指紋

  MD5的典型應用是對一段Message(位元組串)產生fingerprint(指紋),以防止被“篡改”。舉個例子,你將一段話寫在一個叫 myfile.txt檔案中,並對這個myfile.txt產生一個MD5的值並記錄在案,然後你可以傳播這個檔案給別人,別人如果修改了檔案中的任何內容,你對這個檔案重新計算MD5時就會發現(兩個MD5值不相同)。如果再有一個第三方的認證機構,用MD5還可以防止檔案作者的“抵賴”,這就是所謂的數字簽名應用。

3.登入認證

  MD5還廣泛用於作業系統的登陸認證上,如Unix、各類BSD系統登入密碼、數字簽名等諸多方。如在UNIX系統中使用者的密碼是以MD5(或其它類似的演算法)經Hash運算後儲存在檔案系統中。當用戶登入的時候,系統把使用者輸入的密碼進行MD5 Hash運算,然後再去和儲存在檔案系統中的MD5值進行比較,進而確定輸入的密碼是否正確。通過這樣的步驟,系統在並不知道使用者密碼的明碼的情況下就可以確定使用者登入系統的合法性。這可以避免使用者的密碼被具有系統管理員許可權的使用者知道。MD5將任意長度的“位元組串”對映為一個128bit的大整數,並且是通過該128bit反推原始字串是困難的,換句話說就是,即使你看到源程式和演算法描述,也無法將一個MD5的值變換回原始的字串,從數學原理上說,是因為原始的字串有無窮多個,這有點象不存在反函式的數學函式。所以,要遇到了md5密碼的問題,比較好的辦法是:你可以用這個系統中的md5()函式重新設一個密碼,如admin,把生成的一串密碼的Hash值覆蓋原來的Hash值就行了。
  正是因為這個原因,現在被黑客使用最多的一種破譯密碼的方法就是一種被稱為”跑字典”的方法。有兩種方法得到字典,一種是日常蒐集的用做密碼的字串表,另一種是用排列組合方法生成的,先用MD5程式計算出這些字典項的MD5值,然後再用目標的MD5值在這個字典中檢索。我們假設密碼的最大長度為8位位元組(8 Bytes),同時密碼只能是字母和數字,共26+26+10=62個字元,排列組合出的字典的項數則是P(62,1)+P(62,2)….+P(62,8),那也已經是一個很天文的數字了,儲存這個字典就需要TB級的磁碟陣列,而且這種方法還有一個前提,就是能獲得目標賬戶的密碼MD5值的情況下才可以。這種加密技術被廣泛的應用於UNIX系統中,這也是為什麼UNIX系統比一般作業系統更為堅固一個重要原因。