MD5是在Web應(yīng)用程序中最常用的密碼加密算法。由于MD5是不可逆的,因而經(jīng)過(guò)MD5計(jì)算得到后的密文,不能通過(guò)逆向算法得到原文。
回顧在Web應(yīng)用程序中使用MD5加密文本密碼的初衷,就是為了防止數(shù)據(jù)庫(kù)中保存的密碼不幸泄露后被直接獲得。但攻擊者不但擁有數(shù)據(jù)量巨大的密碼字典,而且建立了很多MD5原文/密文對(duì)照數(shù)據(jù)庫(kù),能快速地找到常用密碼的MD5密文,是破譯MD5密文的高效途徑。然而,MD5密文數(shù)據(jù)庫(kù)所使用的是最常規(guī)的MD5加密算法:原文-->MD5-->密文。因此,我們可以使用變換的MD5算法,使現(xiàn)成的MD5密文數(shù)據(jù)庫(kù)無(wú)所作為。
下面演示一些變換算法的例子,當(dāng)然,在其它的Web開(kāi)發(fā)語(yǔ)言中,也大同小異,完全能得到相同的結(jié)果。
變換一:循環(huán)MD5
最容易理解的變換就是對(duì)一個(gè)密碼進(jìn)行多次的MD5運(yùn)算。自定義一個(gè)函數(shù),它接受$data和$times兩個(gè)形參,第一個(gè)是要加密的密碼,第二個(gè)是重復(fù)加密的次數(shù)。實(shí)現(xiàn)這種變換有兩種算法:
|
變換二:密文分割MD5
盡管用戶(hù)的密碼是不確定的字符串,但是只要經(jīng)過(guò)一次MD5運(yùn)算后,就會(huì)得到一個(gè)由32個(gè)字符組成的字符串,這時(shí)可以再針對(duì)這個(gè)定長(zhǎng)字符串變換。有點(diǎn)BT的算法是,把這段密文分割成若干段,對(duì)每段都進(jìn)行一次MD5運(yùn)算,然后把這堆密文連成一個(gè)超長(zhǎng)的字符串,最后再進(jìn)行一次MD5運(yùn)算,得到仍然是長(zhǎng)度為32位的密文。
|
當(dāng)然,這種密文分割的具體算法是數(shù)之不盡的,比如可以把原密文分割成16段每段兩字符、8段每段4字符,或者每一段的字符數(shù)不相等……
變換三:附加字符串干涉
在加密過(guò)程的一個(gè)步驟中,附加一個(gè)內(nèi)容確定的字符串(比如說(shuō)用戶(hù)名),干涉被加密的數(shù)據(jù)。不可以用隨機(jī)字串,因?yàn)檫@樣會(huì)使原算法無(wú)法重現(xiàn)。這種算法在某些情況下是很具有優(yōu)勢(shì)的,比如說(shuō)用于大量的用戶(hù)密碼加密,可以把用戶(hù)名作為附加干涉字串,這樣攻擊者就算知道你的算法,也很難從他們手中的字典中一下子生成海量的對(duì)照表,然后大量地破譯用戶(hù)密碼,只能有針對(duì)性的窮舉為數(shù)不多的用戶(hù)。
|
變換四:大小寫(xiě)變換干涉
由于PHP所提供的md5()函數(shù)返回的密文中的英文字母全部都是小寫(xiě)的,因此我們可以把它們?nèi)哭D(zhuǎn)為大寫(xiě),然后再進(jìn)行一次MD5運(yùn)算。
|
變換五:字符串次序干涉
把MD5運(yùn)算后的密文字符串的順序調(diào)轉(zhuǎn)后,再進(jìn)行一次MD5運(yùn)算。
|
變換六、變換七、變換八……
MD5變換算法是數(shù)之不盡的,甚至無(wú)須自己再去創(chuàng)造,就用上面的五個(gè)互相組合就可以搞出很BT的算法。比如說(shuō)先循環(huán)加密后再分割,并在每一段上附加一個(gè)字符串再分別加密,然后變換大小寫(xiě)并顛倒字符串順序后連成一個(gè)長(zhǎng)字符串再進(jìn)行MD5運(yùn)算……
如果真的很不幸,由于某些漏洞,比如說(shuō)SQL Injection或者文件系統(tǒng)中的數(shù)據(jù)庫(kù)被下載而異致用戶(hù)密碼數(shù)據(jù)暴露,那么MD5變換算法就能大大地增加破譯出密碼原文的難度,首先就是使網(wǎng)上很多的MD5原文/密文對(duì)照數(shù)據(jù)庫(kù)(要知道,這是破譯MD5最高效的方法)沒(méi)有用了,然后就是使攻擊者用常規(guī)算法去窮舉一串由變換算法得到的密文而搞得焦頭爛額。當(dāng)然,MD5變換算法特別適合用于非開(kāi)源的Web程序使用,雖說(shuō)用在開(kāi)源的程序中優(yōu)勢(shì)會(huì)被削弱(大家都知道算法),但是也能抑制MD5原文/密文對(duì)照數(shù)據(jù)庫(kù)的作用。要進(jìn)行這些復(fù)雜的變換運(yùn)算,當(dāng)然就要花費(fèi)的更多的系統(tǒng)開(kāi)銷(xiāo)了,然而對(duì)于安全性要求很?chē)?yán)格的系統(tǒng)來(lái)說(shuō),多付出一些來(lái)?yè)Q取高一點(diǎn)的安全性,是完全值得的。