使用MD5變換算法來防止窮舉破譯密碼(二)

變換三:附加字符串干涉

加密過程的一個步驟中,附加一個內(nèi)容確定的字符串(比如說用戶名),干涉被加密的數(shù)據(jù)。不可以用隨機字串,因為這樣會使原算法無法重現(xiàn)。這種算法在某些情況下是很具有優(yōu)勢的,比如說用于大量的用戶密碼加密,可以把用戶名作為附加干涉字串,這樣攻擊者就算知道你的算法,也很難從他們手中的字典中一下子生成海量的對照表,然后大量地破譯用戶密碼,只能有針對性的窮舉為數(shù)不多的用戶。

//附加字符串在原數(shù)據(jù)的尾部

function md5_3_1($data, $append)

{

return md5($data.$append);

}

//附加字符串在原數(shù)據(jù)的頭部

function md5_3_2($data, $append)

{

return md5($append.$data);

}

//附加字符串在原數(shù)據(jù)的頭尾

function md5_3_3($data, $append)

{

return md5($append.$data.$append);

}

?>

變換四:大小寫變換干涉

由于PHP所提供的md5()函數(shù)返回的密文中的英文字母全部都是小寫的,因此我們可以把它們?nèi)哭D(zhuǎn)為大寫,然后再進行一次MD5運算。

function md5_4($data)

{

//先得到密碼的密文

$data = md5($data);

//再把密文中的英文母全部轉(zhuǎn)為大寫

$data = strtotime($data);

//最后再進行一次MD5運算并返回

return md5($data);

}

?>

變換五:字符串次序干涉

把MD5運算后的密文字符串的順序調(diào)轉(zhuǎn)后,再進行一次MD5運算。

function md5_5($data)

{

//得到數(shù)據(jù)的密文

$data = md5($data);

//再把密文字符串的字符順序調(diào)轉(zhuǎn)

$data = strrev($data);

//最后再進行一次MD5運算并返回

return md5($data);

}

?>

變換六、變換七、變換八……

MD5變換算法是數(shù)之不盡的,甚至無須自己再去創(chuàng)造,就用上面的五個互相組合就可以搞出很BT的算法。比如說先循環(huán)加密后再分割,并在每一段上附加一個字符串再分別加密,然后變換大小寫并顛倒字符串順序后連成一個長字符串再進行MD5運算……

如果真的很不幸,由于某些漏洞,比如說SQL Injection或者文件系統(tǒng)中的數(shù)據(jù)庫被下載而異致用戶密碼數(shù)據(jù)暴露,那么MD5變換算法就能大大地增加破譯出密碼原文的難度,首先就是使網(wǎng)上很多的MD5原文/密文對照數(shù)據(jù)庫(要知道,這是破譯MD5最高效的方法)沒有用了,然后就是使攻擊者用常規(guī)算法去窮舉一串由變換算法得到的密文而搞得焦頭爛額。當然,MD5變換算法特別適合用于非開源的Web程序使用,雖說用在開源的程序中優(yōu)勢會被削弱(大家都知道算法),但是也能抑制MD5原文/密文對照數(shù)據(jù)庫的作用。要進行這些復(fù)雜的變換運算,當然就要花費的更多的系統(tǒng)開銷了,然而對于安全性要求很嚴格的系統(tǒng)來說,多付出一些來換取高一點的安全性,是完全值得的。

知識點:

MD5就是采用單向加密的加密算法,對于MD5而言,有兩個特性是很重要的,第一是任意兩段明文數(shù)據(jù),加密以后的密文不能是相同的;第二是任意一段明文數(shù)據(jù),經(jīng)過加密以后,其結(jié)果必須永遠是不變的。前者的意思是不可能有任意兩段明文加密以后得到相同的密文,后者的意思是如果我們加密特定的數(shù)據(jù),得到的密文一定是相同的。