1. 程式人生 > >MD5碰撞,與用MD5儲存密碼的安全防範

MD5碰撞,與用MD5儲存密碼的安全防範

 兩個不同的且均可正常執行的exe程式檔案,具有相同的MD5校驗值,這不僅僅是理論上的可能,而是現實,已經有人寫出了這樣的兩個程式了,http://www.mathstat.dal.ca/~selinger/md5collision/這個網址可以下載。
  我所知的MD5應用最普遍的是在兩個方面,一個是檔案簽名(多用於檔案下載等),一個是密碼儲存。
  MD5演算法在儲存密碼方面應用非常廣泛,許多流行的應用系統都用它來儲存密碼資訊。如果你的系統裡也用MD5儲存敏感資料的“指紋”,那麼要考慮變換一下花樣,否則將有重大的安全隱患。不是危言聳聽,現在在一臺普通家用電腦上,幾秒鐘就可以根據MD5結果反向計算出一個原文,已經有這樣的工具下載,這種工具稱作MD5碰撞計算器。也有一些網站能夠提供字典式的MD5反查,印象中好像是10位長度以內的字母數字組合的MD5都可以反查到。


  關於MD5碰撞,據說是山東大學王小云教授的一篇報告震驚國際密碼學界,他找到了一種能夠比較快速的計算MD5碰撞的演算法。(最早我聽到這個報道的時候還以為是忽悠呢,俺中國人被忽悠怕了落下的後遺症:D,後來看到實實在在的例子和程式了才確信) 
  何為MD5碰撞呢?就是說,存在並能夠找到兩個或兩個以上的不同資料(D1,D2…Dn)進行MD5摘要運算後具有相同結果。來看一個比較著名的例子:

(資料1)
d131dd02c5e6eec4693d9a0698aff95c 2fcab58712467eab4004583eb8fb7f89 
55ad340609f4b30283e488832571415a 085125e8f7cdc99fd91dbdf280373c5b 
d8823e3156348f5bae6dacd436c919c6 dd53e2b487da03fd02396306d248cda0 
e99f33420f577ee8ce54b67080a80d1e c69821bcb6a8839396f9652b6ff72a70

(資料2)
d131dd02c5e6eec4693d9a0698aff95c 2fcab50712467eab4004583eb8fb7f89 
55ad340609f4b30283e4888325f1415a 085125e8f7cdc99fd91dbd7280373c5b 
d8823e3156348f5bae6dacd436c919c6 dd53e23487da03fd02396306d248cda0 
e99f33420f577ee8ce54b67080280d1e c69821bcb6a8839396f965ab6ff72a70 

  這兩組256位字串的資料有6個位置的字元不同(紅色標示部分),
但是都具有相同的MD5值:79054025255fb1a26e4bc422aef54eb4. 

  也就是說,如果你的使用者系統以MD5儲存密碼,如果某個帳號的密碼MD5結果是79054025255fb1a26e4bc422aef54eb4,那麼真實的密碼可能是資料1,有可能是資料2,雖然我們常見的系統不會把密碼設的這麼長,但是不排除存在更短的MD5碰撞的可能性。

  說到正題上來。如果我們系統的使用者帳號表的資料被壞人盜竊了(特別是網站常用的MDB資料庫檔案經常有被盜下載的),壞人根據表中的MD5值就能夠計算出一個密碼而登入我們的系統,這無疑是一個安全隱患,如何在不大動干戈的情況下防範這一隱患呢?說說我的看法。


  1、檢測輸入的密碼長度,比如32位以內或20位以內,根據實際情況。超出長度範圍直接判斷為密碼錯誤。

  2、檢測輸入的密碼是否為鍵盤字元,否則可能是偽造的密碼。

  3、變換花樣,防止直接通過字典反查。通常使用者的密碼可能設定的比較短,如果直接儲存該短字串的MD5值,無疑是很容易被算出來的。利於越長資料越不容易被字典查出的道理,我們可以在程式中,以原密碼的基礎上構造一個較長的密碼,比如原密碼加上比較長的自定義字首、字尾、或其他變換演算法,總之呢要得到一個較長的字串(建議至少弄到50字元以上),再MD5結果存入資料庫。驗證密碼的時候也是相同步驟。這樣就大大降低了被字典反查的可能性。怎麼算,就充分發揮你的想像力了。(雅虎網站的密碼就是這麼處理的,好像是加了十幾個字元的串)


  如果做到了以上3點,我們系統的MD5安全性就大大提升了。

 

附幾個MD5相關網址:
http://www.cmd5.com/
http://www.md5.com.cn/
http://www.md5crack.com/
http://www.mathstat.dal.ca/~selinger/md5collision/
---------------------