国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

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

2024-07-21 02:28:24
字體:
來源:轉載
供稿:網友

md5是在web應用程序中最常用的密碼加密算法。由于md5是不可逆的,因而經過md5計算得到后的密文,不能通過逆向算法得到原文。

回顧在web應用程序中使用md5加密文本密碼的初衷,就是為了防止數據庫中保存的密碼不幸泄露后被直接獲得。但攻擊者不但擁有數據量巨大的密碼字典,而且建立了很多md5原文/密文對照數據庫,能快速地找到常用密碼的md5密文,是破譯md5密文的高效途徑。然而,md5密文數據庫所使用的是最常規的md5加密算法:原文-->md5-->密文。因此,我們可以使用變換的md5算法,使現成的md5密文數據庫無所作為。

下面演示一些變換算法的例子,當然,在其它的語言中,也大同小異,完全能得到相同的結果。

變換一:循環md5

最容易理解的變換就是對一個密碼進行多次的md5運算。自定義一個函數,它接受$data和$times兩個形參,第一個是要加密的密碼,第二個是重復加密的次數。實現這種變換有兩種算法:

//迭代算法function md5_1_1($data, $times = 32){//循環使用md5for ($i = 0; $i < $times; $i++) {$data = md5($data);}return $data;}//遞歸算法function md5_1_2($data, $times = 32){if ($times > 0) {$data = md5($data);$times--;return md5_1_2($data, $times); //實現遞歸} else {return $data;}}?>

變換二:密文分割md5

盡管用戶的密碼是不確定的字符串,但是只要經過一次md5運算后,就會得到一個由32個字符組成的字符串,這時可以再針對這個定長字符串變換。有點bt的算法是,把這段密文分割成若干段,對每段都進行一次md5運算,然后把這堆密文連成一個超長的字符串,最后再進行一次md5運算,得到仍然是長度為32位的密文。

//把密文分割成兩段,每段16個字符function md5_2_1($data){//先把密碼加密成長度為32字符的密文$data = md5($data);//把密碼分割成兩段$left = substr($data, 0, 16);$right = substr($data, 16, 16);//分別加密后再合并$data = md5($left).md5($right);//最后把長字串再加密一次,成為32字符密文return md5($data);}//把密文分割成32段,每段1個字符function md5_2_2($data){$data = md5($data);//循環地截取密文中的每個字符并進行加密、連接for ($i = 0; $i < 32; $i++) {$data .= md5($data{$i});}//這時$data長度為1024個字符,再進行一次md5運算return md5($data);}?>

當然,這種密文分割的具體算法是數之不盡的,比如可以把原密文分割成16段每段兩字符、8段每段4字符,或者每一段的字符數不相等……

變換三:附加字符串干涉

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

//附加字符串在原數據的尾部function md5_3_1($data, $append){return md5($data.$append);}//附加字符串在原數據的頭部function md5_3_2($data, $append){return md5($append.$data);}//附加字符串在原數據的頭尾function md5_3_3($data, $append){return md5($append.$data.$append);}?>

變換四:大小寫變換干涉

由于php所提供的md5()函數返回的密文中的英文字母全部都是小寫的,因此我們可以把它們全部轉為大寫,然后再進行一次md5運算。  

function md5_4($data){//先得到密碼的密文$data = md5($data);//再把密文中的英文母全部轉為大寫$data = strtotime($data);//最后再進行一次md5運算并返回return md5($data);}?>

變換五:字符串次序干涉

把md5運算后的密文字符串的順序調轉后,再進行一次md5運算。  

function md5_5($data){//得到數據的密文$data = md5($data);//再把密文字符串的字符順序調轉$data = strrev($data);//最后再進行一次md5運算并返回return md5($data);}?>

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 苍溪县| 北京市| 景宁| 遂宁市| 奉贤区| 昌图县| 仙居县| 历史| 榆树市| 大化| 龙山县| 宁海县| 新绛县| 子洲县| 丹巴县| 开化县| 镇安县| 崇文区| 呼图壁县| 信宜市| 新余市| 隆德县| 阿巴嘎旗| 门头沟区| 宿松县| 临沧市| 平凉市| 乌兰县| 白水县| 隆昌县| 达拉特旗| 剑河县| 浦城县| 松原市| 澄迈县| 西吉县| 沅陵县| 廉江市| 栾川县| 廉江市| 克什克腾旗|