一種基於Md5演算法的改進加密方法

科技小能手發表於2017-11-12

一種基於Md5演算法的改進加密方法

陳小兵 antian365.com
摘要 Md5加密演算法是目前網路上用得最為廣泛的一種加密演算法,很多資訊系統以及絕大多數網站都是採用Md5加密,通過使用它來加密一些系統登入時的口令以及其它一些資訊,而入侵者通過各種方法只要獲得使用者名稱以及對應的Md5值,通過暴力破解等方式破解,從而獲取其系統的普通使用者乃至管理員的許可權。本文討論了Md5加密演算法在應用方面遇到的一些問題,並且針對這種問題在基於Md5演算法的基礎上改進了加密方法,從而使用Md5加密口令方面更加安全。
關鍵字 Md5演算法 加密 改進方法

1.前言

Md5的全稱是Message-Digest Algorithm 5(資訊摘要演算法),在90年代初由Mit Laboratory For Computer ScienceRsa Data Security IncRonaldl.rivest開發出來,經md2md3md4發展而來。它的作用是讓大容量資訊在用數字簽名軟體簽署私人金鑰前被“壓縮”成一種保密的格式。由於md5演算法的使用不需要支付任何版權費用的,所以在一般的情況下,md5也不失為一種非常優秀的加密演算法,被大量公司和個人廣泛使用。2004817的美國加州聖巴巴拉的國際密碼學會議(Crypto2004)上,來自中國山東大學的王小云教授做了破譯MD5HAVAL-128 MD4RIPEMD演算法的報告,公佈了MD系列演算法的破解結果,MD5破解工程權威網站([url]http://www.md5crk.com[/url])也因此關閉,從此宣佈MD5加密演算法不再是一種安全的加密演算法。
雖然王小云教授公佈了破解MD5演算法的報告,宣告該演算法不再安全,但是對於公司以及普通使用者來說,從演算法上來破解MD5非常困難,因此MD5仍然算是一種安全的演算法。
MD5是一個安全的雜湊演算法,輸入兩個不同的明文不會得到相同的輸出值,根據輸出值,不能得到原始的明文,即其過程不可逆;所以要解密MD5沒有現成的演算法,只能用窮舉法,把可能出現的明文,用MD5演算法雜湊之後,把得到的雜湊值和原始的資料形成一個一對一的對映表,通過比在表中比破解密碼的MD5演算法雜湊值,通過匹配從對映表中找出破解密碼所對應的原始明文。
對資訊系統或者網站系統來說,MD5演算法主要用在使用者註冊口令的加密,對於普通強度的口令加密,可以通過以下三種方式進行破解:
1)線上查詢密碼。一些線上的MD5值查詢網站提供MD5密碼值的查詢,輸入MD5密碼值後,如果在資料庫中存在,那麼可以很快獲取其密碼值。
2)使用MD5破解工具。網路上有許多針對MD5破解的專用軟體,通過設定字典來進行破解。
3)通過社會工程學來獲取或者重新設定使用者的口令。
因此簡單的MD5加密是沒有辦法達到絕對的安全的,因為普通的MD5加密有多種暴力破解方式,因此如果想要保證資訊系統或者網站的安全,需要對MD5進行改造,增強其安全性,本文就是在MD5加密演算法的基礎上進行改進!

2.Md5演算法應用

2.1Md5加密原理

MD5512位分組來處理輸入的資訊,且每一分組又被劃分為1632位子分組,經過了一系列的處理後,演算法的輸出由四個32位分組組成,將這四個32位分組級聯後將生成一個128位雜湊值。
  在MD5演算法中,首先需要對資訊進行填充,使其位元組長度對512求餘數的結果等於448。因此,資訊的位元組長度(Bits Length)將被擴充套件至N*512+448,即N*64+56個位元組(Bytes),N為一個正整數。填充的方法如下,在資訊的後面填充一個1和無數個0,直到滿足上面的條件時才停止用0對資訊的填充。然後再在這個結果後面附加一個以64位二進位制表示的填充前的資訊長度。經過這兩步的處理,現在的資訊位元組長度=N*512+448+64=(N+1)*512,即長度恰好是512的整數倍數。這樣做的原因是為滿足後面處理中對資訊長度的要求。MD5中有四個32位被稱作連結變數(Chaining Variable)的整數引數,他們分別為:A=0x01234567B=0x89abcdefC=0xfedcba98D=0x76543210 當設定好這四個連結變數後,就開始進入演算法的四輪迴圈運算,迴圈的次數是資訊中512位資訊分組的數目。
  將上面四個連結變數複製到另外四個變數中:AaBbCcDd 主迴圈有四輪(MD4只有三輪),每輪迴圈都很相似。第一輪進行16次操作。每次操作對abcd中的其中三個作一次非線性函式運算,然後將所得結果加上第四個變數(文字中的一個子分組和一個常數)。再將所得結果向右環移一個不定的數,並加上abcd中之一。最後用該結果取代abcd中之一。 以一下是每次操作中用到的四個非線性函式(每輪一個)。
F(X,Y,Z)=(XY)(( X)Z)
G(X,Y,Z)=(XZ)(Y( Z))
H(X,Y,Z)=XYZ
I(X,Y,Z)=Y(X( Z))
其中,⊕是異或,∧是與,∨是或, 是反符號。
  如果XYZ的對應位是獨立和均勻的,那麼結果的每一位也應是獨立和均勻的。F是一個逐位運算的函式。即,如果X,那麼Y,否則Z。函式H是逐位奇偶操作符。所有這些完成之後,將ABCD分別加上abcd。然後用下一分組資料繼續執行演算法,最後的輸出是ABCD的級聯。最後得到的ABCD就是輸出結果,A是低位,D為高位,DCBA組成128位輸出結果。

2.2 MD5的安全性

從安全的角度講,MD5的輸出為128位,若採用純強力攻擊尋找一個訊息具有給定Hash值的計算困難性為2128,用每秒可試驗1000000000個訊息的計算機需時1.07×1022年。若採用生日攻擊法,尋找有相同Hash值的兩個訊息需要試驗264個訊息,用每秒可試驗1000000000個訊息的計算機需時585年。

2.3 Md5加密演算法的應用

MD5加密演算法由於其具有較好的安全性,加之商業也可以免費使用該演算法,因此該加密演算法被廣泛使用,md5演算法主要運用在數字簽名、檔案完整性驗證以及口令加密等方面。

3.改進後的加密方法

3.1目前md5加密方法利用的缺陷

在目前的資訊系統中,對md5加密方法的利用主要通過在指令碼頁面中引用包含md5加密函式程式碼的檔案,以asp指令碼為例,在需要呼叫的頁面中加入<!–#include file=”includes/md5.asp”–>md5.aspmd5加密函式程式碼檔案,然後直接呼叫函式MD5(sMessage)即可,md5加密後的值有16位和32位之分,如果在md5加密函式中使用的是MD5 = LCase(WordToHex(a) & WordToHex(b) & WordToHex(c) & WordToHex(d)),則表示是32位,如果使用的是MD5=LCase(WordToHex(b) & WordToHex(c)),則表示是16位。例如對明文為“123456”的值進行加密,其md5值有兩個,如下所示:
A=123456
password=md5(A)= 49ba59abbe56e057
password=md5(A)= e10adc3949ba59abbe56e057f20f883e
如果將加密的md5值直接儲存在資料庫,當網站存在注入或者其它漏洞時,入侵者極有可能獲取使用者的密碼值,通過md5線上查詢或者暴力破解可以得到密碼。

3.2基於md5演算法的改進加密方法

本文提到的方法是在使用md5加密演算法對明文(口令)加密的基礎上,對密文進行了改變,在密文中擷取一段資料並丟棄,然後使用隨機函式填充被丟棄的資料,且整個過程不改變md5加密後的位數。其加密過程用演算法描述如下:
1)對明文password進行md5加密,獲得密文md5password)。
2)使用擷取函式擷取加密後的密文,從第beginnumber位置開始擷取number位數值,得到密碼A,其中A=left(md5password,beginnumber-1)
3)使用擷取函式擷取加密後的明文的number位數後的值B,其中 B=right(md5password),md5-digit -(beginnumber+number-1))
4)使用隨機函式gen_keynumber)填充被擷取的number的值。
5)變換後的密碼值為encrypt_password =A&get_key(number)&B
變數說明:
password:客戶端提交的原始密碼
encrypt_password:經過處理後的密碼
beginnumber:對原始密碼開始擷取的位置(0<beginnumber<16或者0<beginnumber<32
number:對密碼擷取位數(0<beginnumber<16或者0<beginnumber<32
md5-digitmd516位或者32位值
   解密過程跟加密過程有些類似,先對輸入的明文進行加密,接著從beginnumber處擷取前半部分得到A′,後半部分得到B′,然後從資料庫中讀出密碼中的AB部分,最後如果A=A′並且B=B′,則認為使用者輸入的密碼跟資料庫中的密碼是匹配的。

3.關鍵程式碼與實現

   本文提及改進方法關鍵實現程式碼如下:
<!–#include file=”md5.asp”–>
<%
Function GetRandomizeCode(digit)
 Randomize
 Dim m_strRandArray,m_intRandlen,m_strRandomize,i
 m_strRandArray = Array(0,1,2,3,4,5,6,7,8,9,”A”,”B”,”C”,”D”,”E”,”F”,”G”,”H”,”I”,”J”,”K”,”L”,”M”,”N”,”O”,”P”,”Q”,”R”,”S”,”T”,”U”,”V”,”W”,”X”,”Y”,”Z”)
 m_intRandlen = digit “定義隨機碼的長度
 for i = 1 to m_intRandlen
  m_strRandomize = m_strRandomize & m_strRandArray(Int((21*Rnd)))
 next
 GetRandomizeCode = lcase(m_strRandomize)
End Function 
Function encrypt_password(beginnumber,number,password,md5_digit)
 A=left(md5(password),beginnumber-1)
 B=Right(md5(password),md5_digit-(beginnumber+number-1))
 C=GetRandomizeCode(number)
 D=A&C&B
 encrypt_password=d
End Function
 %>
實現效果如圖1所示,需要加密時直接呼叫encrypt_password函式即可。
實現效果
   從圖1中可以看到第三位至第九位為隨機填充數,隨機填充數為“462hjk”。

4.討論與結束語

有人也曾經提出對md5加密演算法中的函式或者變數進行修改,從而加強在使用原md5演算法的安全,但是這種方法修改了md5原函式或者變數後,無法驗證修改後md5演算法在強度上是否跟原演算法一致。本文提出的方法是在原有md5加密的基礎上,通過對密文擷取一定位數的字串,並使用隨機數進行填充,最後得到的密文雖然是經過md5加密,但是其值已經大不一樣,因此通過md5常規破解方法是永遠也不能破解其原始密碼值,從而保證了資料的安全。雖然目前有很多攻擊方法,諸如SQL注入、跨站攻擊等,可以較容易的獲取資料庫中的值,通過本方法進行加密,在網站或者系統程式碼洩露前,其資料是相對安全的,因此具有一定參考加值。
 
參考文獻
【1】            使用md5校驗和演算法保護檔案(演算法/原理/程式[url]http://www.cnitblog.com/zouzheng/archive/2007/07/27/30767.html[/url]
【2】            Asp生成隨機數函式函式,[url]http://www.diybl.com/course/4_webprogram/asp/aso_js/20071128/88214.html[/url]
【3】            淺談MD5SHA-1被破解和應用改進策略,[url]http://trustsec.blog.51cto.com/305338/65370[/url]
 
 

 本文轉自 simeon2005 51CTO部落格,原文連結:http://blog.51cto.com/simeon/112238


相關文章