李 強,陳登峰
(1西安建筑科技大學信息與控制工程學院 陜西 西安 710055)
(2西安建筑科技大學建筑設備科學與工程學院 陜西 西安 710055)
隨著信息技術的不斷發展,大數據時代已經到來,大數據的應用在給我們生活帶來許多便利的同時,也帶來了信息泄露、信息安全等問題。目前仍有部分網站用戶名密碼通過明文密碼存儲,這樣增加了網站的風險性,密碼極易被破解,導致用戶信息泄露。因此,研究了單向散列函數(Hash函數)[1-2],巴格達理工大學的研究人員通過新改進方法解決了安全文檔的驗證,有效進行了MD5 Hash函數的擴展[3]。羅江華[4]提出了一種基于MD5和Base64的混合加密算法,解決了查詢MD5散列值字典獲取用戶明文密碼問題,提高了用戶的密碼安全。因此,本文研究了MD5加密算法,通過對系統登錄密碼進行加密后來提高網站安全性,但由于一些常用密碼通過MD5值可以搜索到明文密碼,存在一定的弊端,因此,本文在MD5算法的基礎上通過增加密鑰空間的方法來進行改進,提高密碼儲存安全性。
目前,主要加密方式有單向和雙向加密兩種。它們的區別是是否需要解密,是否雙向需要解密,單向不需要解密,例如MD5加密。一般比較常用的加密方式主要有DES加密[5]、RSA加密[6]、MD5加密,其中MD5加密算法應用較為廣泛。
MD5(Message—Digest algorithm 5)信息—摘要算法是128位且通過隨機長度的信息生成。
MD5算法具有以下特點:(1)壓縮性:即任意長度的數據經過MD5算法進行計算,結果長度一樣;(2)容易計算:給定一個原始數據,都可以計算出MD5值;(3)抗修改性:修改原始數據,MD5值也發生改變;(4)強抗碰撞:對于固定的原始數據和其MD5值,很難找到一個相同MD5數據。
MD5算法主流程圖見圖1。

圖1 MD5主流程圖
首先對變量進行初始化,為后面應用做好準備,其次輸入需要處理的信息,對信息進行填充,之后進行分組處理數據,最終輸出MD5值。其中填充信息具體做法見流程圖2。

圖2 填充信息
其中,填充信息滿足關系式L=m*512-64,其中L為消息長度,m為倍數。
流程圖1中分組處理數據具體做法見圖3。

圖3 分組處理信息
對填充好的數據進行分組,分成512位的塊,對4個鏈接變量A、B、C、D進行初始化,其中A=0X01234567;B=0X89abcdef;C=0Xfedcba98;D=0X76543210。初始化完成后,對消息中的多個512位塊循環運行。
將4個鏈接變量a、b、c、d 組合成128位寄存器(abcd)用于保存中間結果和最終結果。
將當前512位塊分解為16個子塊,每個子塊為32位;主循環有4輪循環,每一輪處理一個塊中的16個子塊。16個子塊分別為M[0],M[1],…,M[15],或表示為M[i],其中i為1~15。
4輪迭代操作具體詳細步驟如下:
4次線性操作中用到的線性函數具體為F、G、H、I,其中:
F(x,y,z) =(x&y)|((~x)&z);
G(x,y,z) =(x&z)|(y&(~z));
H(x,y,z) =x^y^z;
I(x,y,z) =y^(x|(~z));
其中,&代表與操作,|代表或操作,~代表非操作,^代表異或操作。
4種操作為:
FF(a,b,c,d,Mi,s,ti)表示 a=b+((a+(F(b,c,d)+Mi+ti)<<
GG(a,b,c,d,Mi,s,ti)表示 a=b+((a+(G(b,c,d)+Mi+ti)<<
HH(a,b,c,d,Mi,s,ti)表示 a=b+((a+(H(b,c,d)+Mi+ti)<<
II(a,b,c,d,Mi,s,ti)表示 a=b+((a+(I(b,c,d)+Mi+ti)<<
每一輪輸出的中間和最終結果復制到寄存器abcd中,每一輪有16個寄存器。進行4輪操作,每輪16次操作。
上述操作完成后,將A、B、C、D分別加上a、b、c、d,用于下一分組數據繼續運行算法,直至輸出128位的A、B、C、D的級聯,其中低字節始于A,高字節終于D的結果,算法結束。
根據3.1節MD5算法基本原理通過Java語言來進行實現,實驗結果見表1。

表1 MD5實驗結果
在實際應用中,經過MD5存儲的密碼,通過前臺處理后,直接存入后臺數據庫中。然而經常會有忘記密碼的情況,有一部分人的處理方法是,如果是常用的簡單密碼通過在數據庫中找到其存儲的MD5值,通過網絡搜索就可以找到其對應的明文密碼,這樣便可以解決忘記密碼的問題。然而這種解決辦法也暴露了MD5算法的缺陷,因此在研究過程中就應該考慮這個問題,并加以解決。本文對MD5算法進行了改進,具體做法如下:
Step1:輸入密碼,通過前臺MD5算法進行轉換,將轉換結果存入到后臺Oracle數據庫中進行管理,其結果為32位16進制數。
Step2:將存入的32位16進制數的5至19位進行提取,為下一步做好準備。
Step3:隨機生成字符串,該字符串位數為15位,用于下一步替換。
Step4:將提取出的5至19位進行替換,完成后存入后臺數據庫表中。
通過Java代碼根據以上步驟對改進MD5算法進行實現,實現結果見表2。

表2 改進后結果
為了保證實驗結果的有效性,該測試數據包含數字、字母、下劃線,分析表1和表2實驗結果可以得出MD5加密算法的密鑰空間為2的128次方,改進后的MD5秘鑰空間為2的158次方,破解難度明顯增大。在系統密碼登錄過程中,因為密碼存儲結果經過兩次變換,遇到常用的簡單密碼通過在數據庫中找到其存儲的MD5值問題得以解決。
本文研究了MD5加密算法的基本原理并通過Java語言進行實現,在實際應用過程中針對部分常用明文密碼對應的MD5值可以搜索到的問題,本文對其進行了改進,通過增加密鑰空間來提高密碼安全性,并應用在系統密碼存儲中,實驗結果表明,該方法有效。