淺談MD5加密算法(JAVA實現)

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);
        }

複製代碼

相關文章
相關標籤/搜索