這次“泄密門(mén)事件”對(duì)用戶(hù)影響最大的恐怕是明文保存密碼的CSDN和天涯社區(qū),如果當(dāng)初他們使用散列算法將密碼進(jìn)行處理,就不會(huì)有這么大的影響,而對(duì)于散列算法,就不得不說(shuō)一下MD5這個(gè)算法。
散列算法(Hash Function)中,最為常用的是MD5(Message-Digest Algorithm 5)算法,MD5是一個(gè)較為古老的算法,一度被廣泛應(yīng)用于安全領(lǐng)域。比如在UNIX系統(tǒng)中用戶(hù)的密碼就是以MD5(或其它類(lèi)似的算法)經(jīng)加密后存儲(chǔ)在文件系統(tǒng)中。當(dāng)用戶(hù)登錄的時(shí)候,系統(tǒng)把用戶(hù)輸入的密碼計(jì)算成MD5值,然后再去和保存在文件系統(tǒng)中的MD5值進(jìn)行比較,進(jìn)而確定輸入的密碼是否正確。
通過(guò)這樣的步驟,系統(tǒng)在并不知道用戶(hù)密碼的明碼的情況下就可以確定用戶(hù)登錄系統(tǒng)的合法性。這不但可以避免用戶(hù)的密碼被具有系統(tǒng)管理員權(quán)限的用戶(hù)知道,而且還在一定程度上增加了密碼被破解的難度。
不過(guò),由于MD5的弱點(diǎn)被不斷發(fā)現(xiàn)以及計(jì)算機(jī)能力不斷的提升,通過(guò)碰撞的方法有可能構(gòu)造兩個(gè)具有相同MD5的信息,使MD5算法在目前的安全環(huán)境下有一點(diǎn)落伍。從實(shí)踐角度,不同信息具有相同MD5的可能性還是非常低的,通常認(rèn)為是不可能的,通過(guò)碰撞的方法也很難碰撞出復(fù)雜信息的MD5數(shù)值。
因此,MD5算法還是被廣泛的用作檢驗(yàn)文件是否變化的散列函數(shù),很多類(lèi)似迅雷、旋風(fēng)這樣的下載工具,都可以通過(guò)MD5來(lái)驗(yàn)證,用戶(hù)下載下來(lái)的文件是否被修改。
在用戶(hù)密碼的處理方面,MD5總的來(lái)看還算是安全的,至少比明文保存密碼要好的多,目前破解MD5主要依靠大型字典的方法,將常用密碼進(jìn)行MD5后建立數(shù)據(jù)庫(kù),然后和MD5數(shù)值進(jìn)行對(duì)比,通過(guò)這樣的方法來(lái)“破解”MD5,因此,通常直接將密碼進(jìn)行MD5處理的話,一些弱密碼很容易可以通過(guò)這種手段“破解”出來(lái)。
不過(guò),如果在散列的過(guò)程中,加入足夠長(zhǎng)的salt(即干擾字符串),并且salt加入一些動(dòng)態(tài)信息,例如username、隨機(jī)碼等,這樣生成的MD5還是很難被破解的,因?yàn)閮H僅從數(shù)據(jù)庫(kù)無(wú)法看到MD5具體的處理過(guò)程,必須同時(shí)看到處理時(shí)的源代碼才可以,這就給破解MD5帶來(lái)相當(dāng)大的難度。
還有一個(gè)方法,既然簡(jiǎn)單密碼的MD5是不安全的,網(wǎng)站的開(kāi)發(fā)者只需要一個(gè)簡(jiǎn)單的技巧就能提高密碼的安全度:在用戶(hù)注冊(cè)的時(shí)候,錄入新密碼后進(jìn)行判斷,強(qiáng)制密碼必須8位以上,并包含字母和數(shù)字,否則不讓注冊(cè),這樣用戶(hù)注冊(cè)后使用的密碼就都是不容易被破解的密碼了。
如果需要更安全的算法,建議不用MD5,而使用SHA-256, SHA(Secure Hash Algorithm,安全散列算法)是美國(guó)國(guó)家安全局(NSA)設(shè)計(jì),美國(guó)國(guó)家標(biāo)準(zhǔn)與技術(shù)研究院(NIST)發(fā)布的一系列密碼散列函數(shù)。目前還沒(méi)有出現(xiàn)針對(duì)SHA-256算法的有效碰撞攻擊方法,該算法也是開(kāi)源算法,在很多地方可以找到,是MD5的一個(gè)不錯(cuò)的后繼者。