国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
使用MD5變換算法防窮舉(沖撞)破譯密碼
MD5是在Web應(yīng)用程序中最常用的密碼加密算法。由于MD5是不可逆的,因而經(jīng)過MD5計(jì)算得到后的密文,不能通過逆向算法得到原文。

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

  下面演示一些變換算法的例子
當(dāng)然,在其它的Web開發(fā)語言中,也大同小異,完全能得到相同的結(jié)果。

變換一:循環(huán)MD5

  最容易理解的變換就是對一個密碼進(jìn)行多次的MD5運(yùn)算。自定義一個函數(shù),它接受$data和$times兩個形參,第一個是要加密的密碼,第二個是重復(fù)加密的次數(shù)。實(shí)現(xiàn)這種變換有兩種算法——

<?php
//迭代算法
function md5_1_1($data, $times = 32)
{
//循環(huán)使用MD5
for ($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); //實(shí)現(xiàn)遞歸
} else {
return $data;
}
}
?>

變換二:密文分割MD5

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

<?php
//把密文分割成兩段,每段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);
//循環(huán)地截取密文中的每個字符并進(jìn)行加密、連接
for ($i = 0; $i < 32; $i++) {
$data .= md5($data{$i});
}
//這時(shí)$data長度為1024個字符,再進(jìn)行一次MD5運(yùn)算
return md5($data);
}
?>

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

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

<?php
//附加字符串在原數(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)為大寫,然后再進(jìn)行一次MD5運(yùn)算。

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

變換五:字符串次序干涉
  把MD5運(yùn)算后的密文字符串的順序調(diào)轉(zhuǎn)后,再進(jìn)行一次MD5運(yùn)算。

<?php
function md5_5($data)
{
//得到數(shù)據(jù)的密文
$data = md5($data);
//再把密文字符串的字符順序調(diào)轉(zhuǎn)
$data = strrev($data);
//最后再進(jìn)行一次MD5運(yùn)算并返回
return md5($data);
}
?>

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

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

  如果真的很不幸,由于某些漏洞,比如說SQL Injection或者文件系統(tǒng)中的數(shù)據(jù)庫被下載而異致用戶密碼數(shù)據(jù)暴露,那么MD5變換算法就能大大地增加破譯出密碼原文的難度,首先就是使網(wǎng)上很多的MD5原文/密文對照數(shù)據(jù)庫(要知道,這是破譯MD5最高效的方法)沒有用了,然后就是使攻擊者用常規(guī)算法去窮舉一串由變換算法得到的密文而搞得焦頭爛額。當(dāng)然,MD5變換算法特別適合用于非開源的Web程序使用,雖說用在開源的程序中優(yōu)勢會被削弱(大家都知道算法),但是也能抑制MD5原文/密文對照數(shù)據(jù)庫的作用。要進(jìn)行這些復(fù)雜的變換運(yùn)算,當(dāng)然就要花費(fèi)的更多的系統(tǒng)開銷了,然而對于安全性要求很嚴(yán)格的系統(tǒng)來說,多付出一些來換取高一點(diǎn)的安全性,是完全值得的。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
《灰灰的密碼學(xué)筆記》給新手的福利
用MD5保存密碼的安全防范
哈希算法在密碼加密存儲中的應(yīng)用
淺談HASH算法與CSDN密碼泄漏事件
hash算法MD5
介紹一下MD5加密算法
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服