使用md5變換演算法防窮舉(衝撞)破譯密碼
md5是在web應用程式中最常用的密碼加密演算法。由於md5是不可逆的,因而經過md5計算得到後的密文,不能通過逆向演算法得到原文。
回顧在web應用程式中使用md5加密文字密碼的初衷,就是為了防止資料庫中儲存的密碼不幸洩露後被直接獲得。但攻擊者不但擁有資料量巨大的密碼字典,而且建立了很多md5原文/密文對照資料庫,能快速地找到常用密碼的md5密文,是破譯md5密文的高效途徑。然而,md5密文資料庫所使用的是最常規的md5加密演算法:原文-->md5-->密文。因此,我們可以使用變換的md5演算法,使現成的md5密文資料庫無所作為。
下面演示一些變換演算法的例子
當然,在其它的web開發語言中,也大同小異,完全能得到相同的結果。
變換一:迴圈md5
最容易理解的變換就是對乙個密碼進行多次的md5運算。自定義乙個函式,它接受$data和$times兩個形參,第乙個是要加密的密碼,第二個是重複加密的次數。實現這種變換有兩種演算法——
<?php
//迭代演算法
function
md5_1_1
($data
, $times
= 32
)return
$data;}
//遞迴演算法
function
md5_1_2
($data
, $times
= 32
) else
}?>
變換二:密文分割md5
儘管使用者的密碼是不確定的字串,但是只要經過一次md5運算後,就會得到乙個由32個字元組成的字串,這時可以再針對這個定長字串變換。有點bt的演算法是,把這段密文分割成若干段,對每段都進行一次md5運算,然後把這堆密文連成乙個超長的字串,最後再進行一次md5運算,得到仍然是長度為32位的密文。
<?php
//把密文分割成兩段,每段16個字元
function
md5_2_1
($data
)//把密文分割成32段,每段1個字元
function
md5_2_2
($data));
}//這時$data長度為1024個字元,再進行一次md5運算
return
md5(
$data);}
?>
當然,這種密文分割的具體演算法是數之不盡的,比如可以把原密文分割成16段每段兩字元、8段每段4字元,或者每一段的字元數不相等……
變換三:附加字串干涉
在加密過程的乙個步驟中,附加乙個內容確定的字串(比如說使用者名稱),干涉被加密的資料。不可以用隨機字串,因為這樣會使原演算法無法重現。這種演算法在某些情況下是很具有優勢的,比如說用於大量的使用者密碼加密,可以把使用者名稱作為附加干涉字串,這樣攻擊者就算知道你的演算法,也很難從他們手中的字典中一下子生成海量的對照表,然後大量地破譯使用者密碼,只能有針對性的窮舉為數不多的使用者。
<?php
//附加字串在原資料的尾部
function
md5_3_1
($data, )
//附加字串在原資料的頭部
function
md5_3_2
($data, )
//附加字串在原資料的頭尾
function
md5_3_3
($data, )
?>
變換四:大小寫變換干涉
由於php所提供的md5()函式返回的密文中的英文本母全部都是小寫的,因此我們可以把它們全部轉為大寫,然後再進行一次md5運算。
<?php
function
md5_4
($data
)?>
變換五:字串次序干涉
把md5運算後的密文字串的順序調轉後,再進行一次md5運算。
<?php
function
md5_5
($data
)?>
Linux下MD5演算法使用
出處 我們以乙個字串為例,新建乙個檔案filename.txt,在檔案內寫入hello 然後在linux下可以使用命令md5sum filename.txt計算md5值 b1946ac92492d2347c6235b4d2611184 雖然寫入的是hello這5個字元,但是我們使用命令xxd fil...
C 使用MD5等雜湊演算法
在對密碼等敏感資訊進行網路傳輸和儲存時,往往不直接儲存其原本值,而是在伺服器端資料庫儲存其雜湊值,比較常用的有如md5,sha1等等。而客戶端則需要將用於輸入的明文密碼轉換為md5 或其他雜湊演算法 雜湊值後再傳輸給伺服器。客戶端對md5加密的程式如下 1.首先引用命名空間system.securi...
win10應用 UWP 使用MD5演算法
windows有自帶的演算法來計算md5 原本在wpf是 private string get md5 string str return strb.tostring tolower 進行md5,可是uwp沒有system.security.cryptography.md5cryptoservice...