MD5是一個(gè)安全的散列算法,輸入兩個(gè)不同的明文不會(huì)得到相同的輸出值,根據(jù)輸出值,不能得到原始的明文,即其過程不可逆;所以要解密MD5沒有現(xiàn)成的算法,只能用窮舉法,把可能出現(xiàn)的明文,用MD5算法散列之后,把得到的散列值和原始的數(shù)據(jù)形成一個(gè)一對一的映射表,通過比在表中比破解密碼的MD5算法散列值,通過匹配從映射表中找出破解密碼所對應(yīng)的原始明文。 對信息系統(tǒng)或者網(wǎng)站系統(tǒng)來說,MD5算法主要用在用戶注冊口令的加密,對于普通強(qiáng)度的口令加密,可以通過以下三種方式進(jìn)行破解: (1)在線查詢密碼。一些在線的MD5值查詢網(wǎng)站提供MD5密碼值的查詢,輸入MD5密碼值后,如果在數(shù)據(jù)庫中存在,那么可以很快獲取其密碼值。 (2)使用MD5破解工具。網(wǎng)絡(luò)上有許多針對MD5破解的專用軟件,通過設(shè)置字典來進(jìn)行破解。 (3)通過社會(huì)工程學(xué)來獲取或者重新設(shè)置用戶的口令。 因此簡單的MD5加密是沒有辦法達(dá)到絕對的安全的,因?yàn)槠胀ǖ?/span>MD5加密有多種暴力破解方式,因此如果想要保證信息系統(tǒng)或者網(wǎng)站的安全,需要對MD5進(jìn)行改造,增強(qiáng)其安全性,本文就是在MD5加密算法的基礎(chǔ)上進(jìn)行改進(jìn)! 2.Md5算法應(yīng)用 2.1Md5加密原理 MD5以512位分組來處理輸入的信息,且每一分組又被劃分為16個(gè)32位子分組,經(jīng)過了一系列的處理后,算法的輸出由四個(gè)32位分組組成,將這四個(gè)32位分組級聯(lián)后將生成一個(gè)128位散列值。 在MD5算法中,首先需要對信息進(jìn)行填充,使其字節(jié)長度對512求余數(shù)的結(jié)果等于448。因此,信息的字節(jié)長度(Bits Length)將被擴(kuò)展至N*512+448,即N*64+56個(gè)字節(jié)(Bytes),N為一個(gè)正整數(shù)。填充的方法如下,在信息的后面填充一個(gè)1和無數(shù)個(gè)0,直到滿足上面的條件時(shí)才停止用0對信息的填充。然后再在這個(gè)結(jié)果后面附加一個(gè)以64位二進(jìn)制表示的填充前的信息長度。經(jīng)過這兩步的處理,現(xiàn)在的信息字節(jié)長度=N*512+448+64=(N+1)*512,即長度恰好是512的整數(shù)倍數(shù)。這樣做的原因是為滿足后面處理中對信息長度的要求。MD5中有四個(gè)32位被稱作鏈接變量(Chaining Variable)的整數(shù)參數(shù),他們分別為:A=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210。當(dāng)設(shè)置好這四個(gè)鏈接變量后,就開始進(jìn)入算法的四輪循環(huán)運(yùn)算,循環(huán)的次數(shù)是信息中512位信息分組的數(shù)目。 將上面四個(gè)鏈接變量復(fù)制到另外四個(gè)變量中:A到a,B到b,C到c,D到d。主循環(huán)有四輪(MD4只有三輪),每輪循環(huán)都很相似。第一輪進(jìn)行16次操作。每次操作對a、b、c和d中的其中三個(gè)作一次非線性函數(shù)運(yùn)算,然后將所得結(jié)果加上第四個(gè)變量(文本中的一個(gè)子分組和一個(gè)常數(shù))。 再將所得結(jié)果向右環(huán)移一個(gè)不定的數(shù),并加上a、b、c或d中之一。最后用該結(jié)果取代a、b、c或d中之一。以一下是每次操作中用到的四個(gè)非線性函數(shù)(每輪一個(gè))。
其中,?是異或,∧是與,∨是或,是反符號。 如果X、Y和Z的對應(yīng)位是獨(dú)立和均勻的,那么結(jié)果的每一位也應(yīng)是獨(dú)立和均勻的。F是一個(gè)逐位運(yùn)算的函數(shù)。即,如果X,那么Y,否則Z。函數(shù)H是逐位奇偶操作符。所有這些完成之后,將A,B,C,D分別加上a,b,c,d。然后用下一分組數(shù)據(jù)繼續(xù)運(yùn)行算法,最后的輸出是A,B,C和D的級聯(lián)。最后得到的A,B,C,D就是輸出結(jié)果,A是低位,D為高位,DCBA組成128位輸出結(jié)果。 2.2 MD5的安全性 從安全的角度講,MD5的輸出為128位,若采用純強(qiáng)力攻擊尋找一個(gè)消息具有給定Hash值的計(jì)算困難性為2128,用每秒可試驗(yàn)1000000000個(gè)消息的計(jì)算機(jī)需時(shí)1.07×1022年。若采用生日攻擊法,尋找有相同Hash值的兩個(gè)消息需要試驗(yàn)264個(gè)消息,用每秒可試驗(yàn)1000000000個(gè)消息的計(jì)算機(jī)需時(shí)585年。 2.3 Md5加密算法的應(yīng)用 MD5加密算法由于其具有較好的安全性,加之商業(yè)也可以免費(fèi)使用該算法,因此該加密算法被廣泛使用,md5算法主要運(yùn)用在數(shù)字簽名、文件完整性驗(yàn)證以及口令加密等方面。 3.改進(jìn)后的加密方法 3.1目前md5加密方法利用的缺陷 在目前的信息系統(tǒng)中,對md5加密方法的利用主要通過在腳本頁面中引用包含md5加密函數(shù)代碼的文件,以asp腳本為例,在需要調(diào)用的頁面中加入,md5.asp為md5加密函數(shù)代碼文件,然后直接調(diào)用函數(shù)MD5(sMessage)即可,md5加密后的值有16位和32位之分,如果在md5加密函數(shù)中使用的是MD5 = LCase(WordToHex(a) &WordToHex(b) & WordToHex(c) & WordToHex(d)),則表示是32位,如果使用的是MD5=LCase(WordToHex(b) & WordToHex(c)),則表示是16位。例如對明文為“123456”的值進(jìn)行加密,其md5值有兩個(gè),如下所示: A=123456password=md5(A)= 49ba59abbe56e057 password=md5(A)=10adc3949ba59abbe56e057f20f883e如果將加密的md5值直接保存在數(shù)據(jù)庫,當(dāng)網(wǎng)站存在注入或者其它漏洞時(shí),入侵者極有可能獲取用戶的密碼值,通過md5在如果將加密的md5值直接保存在數(shù)據(jù)庫,當(dāng)網(wǎng)站存在注入或者其它漏洞時(shí),入侵者極有可能獲取用戶的密碼值,通過md5在線查詢或者暴力破解可以得到密碼。 3.2基于md5算法的改進(jìn)加密方法 本文提到的方法是在使用md5加密算法對明文(口令)加密的基礎(chǔ)上,對密文進(jìn)行了改變,在密文中截取一段數(shù)據(jù)并丟棄,然后使用隨機(jī)函數(shù)填充被丟棄的數(shù)據(jù),且整個(gè)過程不改變md5加密后的位數(shù)。其加密過程用算法描述如下: (1)對明文password進(jìn)行md5加密,獲得密文md5(password)。 (2)使用截取函數(shù)截取加密后的密文,從第beginnumber位置開始截取number位數(shù)值,得到密碼A,其中A=left(md5(password),beginnumber-1)。 (3)使用截取函數(shù)截取加密后的明文的number位數(shù)后的值B,其中 B=right(md5(password),md5-digit -(beginnumber+number-1))。 (4)使用隨機(jī)函數(shù)gen_key(number)填充被截取的number的值。 (5)變換后的密碼值為encrypt_password =A&get_key(number)&B 變量說明:
解密過程跟加密過程有些類似,先對輸入的明文進(jìn)行加密,接著從beginnumber處截取前半部分得到A′,后半部分得到B′,然后從數(shù)據(jù)庫中讀出密碼中的A和B部分,最后如果A=A′并且B=B′,則認(rèn)為用戶輸入的密碼跟數(shù)據(jù)庫中的密碼是匹配的。 3.關(guān)鍵代碼與實(shí)現(xiàn) 本文提及改進(jìn)方法關(guān)鍵實(shí)現(xiàn)代碼如下:
實(shí)現(xiàn)效果如圖1所示,需要加密時(shí)直接調(diào)用encrypt_password函數(shù)即可。
4.討論與結(jié)束語 有人也曾經(jīng)提出對md5加密算法中的函數(shù)或者變量進(jìn)行修改,從而加強(qiáng)在使用原md5算法的安全,但是這種方法修改了md5原函數(shù)或者變量后,無法驗(yàn)證修改后md5算法在強(qiáng)度上是否跟原算法一致。本文提出的方法是在原有md5加密的基礎(chǔ)上,通過對密文截取一定位數(shù)的字符串,并使用隨機(jī)數(shù)進(jìn)行填充,最后得到的密文雖然是經(jīng)過md5加密,但是其值已經(jīng)大不一樣,因此通過md5常規(guī)破解方法是永遠(yuǎn)也不能破解其原始密碼值,從而保證了數(shù)據(jù)的安全。雖然目前有很多攻擊方法,諸如SQL注入、跨站攻擊等,可以較容易的獲取數(shù)據(jù)庫中的值,通過本方法進(jìn)行加密,在網(wǎng)站或者系統(tǒng)代碼泄露前,其數(shù)據(jù)是相對安全的,因此具有一定參考加值。 |
|