MD5是一個安全的散列算法,輸入兩個不一樣的明文不會獲得相同的輸出值,根據輸出值,不能獲得原始的明文,即其過程不可逆,經常使用於用戶註冊口令的加密。算法
實例下載數據庫
MD5是一個安全的散列算法,輸入兩個不一樣的明文不會獲得相同的輸出值,根據輸出值,不能獲得原始的明文,即其過程不可逆;因此要解密MD5沒有現成的算法,只能用窮舉法,把可能出現的明文,用MD5算法散列以後,把獲得的散列值和原始的數據造成一個一對一的映射表,經過比在表中比破解密碼的MD5算法散列值,經過匹配從映射表中找出破解密碼所對應的原始明文。安全
對信息系統或者網站系統來講,MD5算法主要用在用戶註冊口令的加密,對於普通強度的口令加密,能夠經過如下三種方式進行破解:網絡
(1)在線查詢密碼。一些在線的MD5值查詢網站提供MD5密碼值的查詢,輸入MD5密碼值後,若是在數據庫中存在,那麼能夠很快獲取其密碼值。dom
(2)使用MD5破解工具。網絡上有許多針對MD5破解的專用軟件,經過設置字典來進行破解。工具
(3)經過社會工程學來獲取或者從新設置用戶的口令。網站
所以簡單的MD5加密是沒有辦法達到絕對的安全的,由於普通的MD5加密有多種暴力破解方式,所以若是想要保證信息系統或者網站的安全,須要對MD5進行改造,加強其安全性,本文就是在MD5加密算法的基礎上進行改進!加密
一、MD5算法應用code
MD5加密算法因爲其具備較好的安全性,加之商業也能夠無償使用該算法,所以該加密算法被普遍使用,md5算法主要運用在數字簽名、文件完整性驗證以及口令加密等方面。 htm
舉個簡單列子,文本內容加密:
/** * simple MD5 * * @param text * @return */ public static String simpleMD5(String text) { try { MessageDigest digest = MessageDigest.getInstance("MD5"); digest.update(text.getBytes()); return encodeHex(digest.digest()); } catch (Exception e) { throw new RuntimeException(e); } }
二、MD5的安全性
MD5以512位分組來處理輸入的信息,且每一分組又被劃分爲16個32位子分組,通過了一系列的處理後,算法的輸出由四個32位分組組成,將這四個32位分組級聯後將生成一個128位散列值。從安全的角度講,MD5的輸出爲128位,若採用純強力攻擊尋找一個消息具備給定Hash值的計算困難性爲2128,用每秒可試驗1000000000個消息的計算機需時1.07×1022年。若採用生日攻擊法,尋找有相同Hash值的兩個消息須要試驗264個消息,用每秒可試驗1000000000個消息的計算機需時585年。
三、基於MD5加密算法改進
上列對文本內容的加密過程過於簡單,可能會被MD5破解工具破解,所以能夠對傳入的內容加點料,以此增長破解難度,其加密過程用算法描述以下:
(1)傳入明文password同時傳入salt
(2)組合內容,再加點特殊字符 salt+"#$@$%"+password
(3)變換後的密碼值爲encrypt_password=(salt+"#$@$%"+password)
解密過程跟加密過程同樣,先對輸入的明文加密,接着從數據庫讀出密文密碼,兩者相等,便可繼續業務操做。
四、關鍵代碼實現(源碼見附件)
/** * * @param salt * @param text * @return */ public static String encryptMD5(String salt, String text) { try { MessageDigest digest = MessageDigest.getInstance("MD5"); String toEncryp = salt + "@$#" + text; digest.update(toEncryp.getBytes()); return encodeHex(digest.digest()); } catch (Exception e) { throw new RuntimeException(e); }