Md5加密算法

MD5是一個安全的散列算法,輸入兩個不一樣的明文不會獲得相同的輸出值,根據輸出值,不能獲得原始的明文,即其過程不可逆;因此要解密MD5沒有現成的算法,只能用窮舉法,把可能出現的明文,用MD5算法散列以後,把獲得的散列值和原始的數據造成一個一對一的映射表,經過比在表中比破解密碼的MD5算法散列值,經過匹配從映射表中找出破解密碼所對應的原始明文。git

對信息系統或者網站系統來講,MD5算法主要用在用戶註冊口令的加密,對於普通強度的口令加密,能夠經過如下三種方式進行破解:算法

(1)在線查詢密碼。一些在線的MD5值查詢網站提供MD5密碼值的查詢,輸入MD5密碼值後,若是在數據庫中存在,那麼能夠很快獲取其密碼值。數據庫

(2)使用MD5破解工具。網絡上有許多針對MD5破解的專用軟件,經過設置字典來進行破解。安全

(3)經過社會工程學來獲取或者從新設置用戶的口令。網絡

所以簡單的MD5加密是沒有辦法達到絕對的安全的,由於普通的MD5加密有多種暴力破解方式,所以若是想要保證信息系統或者網站的安全,須要對MD5進行改造,加強其安全性,本文就是在MD5加密算法的基礎上進行改進!ide

2.Md5算法應用函數

舉個簡單的例子:字符串加密和文件加密工具

字符串加密網站

複製代碼
方式一:
public string GetMD5String(string pwd)
{
MD5CryptoServiceProvider md5=new MD5CryptoServiceProvide();
byte[] data=System.Text.Encoding.ASCII.GetBytes(pwd);
byte[] md5data=md5.ComputeHash(data);
StringBuilder builder=new StringBUilder();
for(int i=0;i<md5data.Length-1;i++)
{
builder.Append(md5data[i].ToString("X2"));    
}
return builder;
}
方式二:
public string GetMd5(string msg)
{
string cryptStr = "";
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
byte[] bytes = Encoding.UTF8.GetBytes(msg);
byte[] cryptBytes = md5.ComputeHash(bytes);
for (int i = 0; i < cryptBytes.Length; i++)
{
cryptStr += cryptBytes[i].ToString("X2");
}
return cryptStr;
}
複製代碼

文件加密ui

複製代碼
MD5加密文件

string GetFileMd5(string path)
{
string ctyptStr = "";
byte[] cryptBytes;
using (FileStream fs = new FileStream(path,FileMode.Open))
{
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
cryptBytes = md5.ComputeHash(fs);
}
for (int i = 0; i < cryptBytes.Length; i++)
{
ctyptStr += cryptBytes[i].ToString("X2");
}
return ctyptStr;
}
複製代碼

2.1Md5加密原理

MD5以512位分組來處理輸入的信息,且每一分組又被劃分爲16個32位子分組,通過了一系列的處理後,算法的輸出由四個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=0x01234567,B=0x89abcdef,C=0xfedcba98,D=0x76543210。 當設置好這四個連接變量後,就開始進入算法的四輪循環運算,循環的次數是信息中512位信息分組的數目。

將上面四個連接變量複製到另外四個變量中:A到a,B到b,C到c,D到d。 主循環有四輪(MD4只有三輪),每輪循環都很類似。第一輪進行16次操做。每次操做對a、b、c和d中的其中三個做一次非線性函數運算,而後將所得結果加上第四個變量(文本中的一個子分組和一個常數)。

再將所得結果向右環移一個不定的數,並加上a、b、c或d中之一。最後用該結果取代a、b、c或d中之一。 以一下是每次操做中用到的四個非線性函數(每輪一個)。

其中,?是異或,∧是與,∨是或, 是反符號。 

若是X、Y和Z的對應位是獨立和均勻的,那麼結果的每一位也應是獨立和均勻的。F是一個逐位運算的函數。即,若是X,那麼Y,不然Z。函數H是逐位奇偶操做符。全部這些完成以後,將A,B,C,D分別加上a,b,c,d。而後用下一分組數據繼續運行算法,最後的輸出是A,B,C和D的級聯。最後獲得的A,B,C,D就是輸出結果,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腳本爲例,在須要調用的頁面中加入,md5.asp爲md5加密函數代碼文件,而後直接調用函數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在

若是將加密的md5值直接保存在數據庫,當網站存在注入或者其它漏洞時,入侵者極有可能獲取用戶的密碼值,經過md5在線查詢或者暴力破解能夠獲得密碼。 

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

本文提到的方法是在使用md5加密算法對明文(口令)加密的基礎上,對密文進行了改變,在密文中截取一段數據並丟棄,

而後使用隨機函數填充被丟棄的數據,且整個過程不改變md5加密後的位數。其加密過程用算法描述以下:

(1)對明文password進行md5加密,得到密文md5(password)。

(2)使用截取函數截取加密後的密文,從第beginnumber位置開始截取number位數值,獲得密碼A,其中A=left(md5(password),beginnumber-1)。

(3)使用截取函數截取加密後的明文的number位數後的值B,其中 B=right(md5(password),md5-digit -(beginnumber+number-1))。

(4)使用隨機函數gen_key(number)填充被截取的number的值。

(5)變換後的密碼值爲encrypt_password =A&get_key(number)&B

變量說明:

解密過程跟加密過程有些相似,先對輸入的明文進行加密,接着從beginnumber處截取前半部分獲得A′,後半部分獲得B′,

而後從數據庫中讀出密碼中的A和B部分,最後若是A=A′而且B=B′,則認爲用戶輸入的密碼跟數據庫中的密碼是匹配的。 

3.關鍵代碼與實現

本文說起改進方法關鍵實現代碼以下:

4.討論與結束語

有人也曾經提出對md5加密算法中的函數或者變量進行修改,從而增強在使用原md5算法的安全,

可是這種方法修改了md5原函數或者變量後,沒法驗證修改後md5算法在強度上是否跟原算法一致。

本文提出的方法是在原有md5加密的基礎上,經過對密文截取必定位數的字符串,並使用隨機數進行填充,

最後獲得的密文雖然是通過md5加密,可是其值已經大不同,所以經過md5常規破解方法是永遠也不能破解其原始密碼值,

從而保證了數據的安全。雖然目前有不少攻擊方法,諸如SQL注入、跨站攻擊等,能夠較容易的獲取數據庫中的值,

經過本方法進行加密,在網站或者系統代碼泄露前,其數據是相對安全的,所以具備必定參考加值

相關文章
相關標籤/搜索