MD5加密及’解密‘ 驗籤詳解

爲什麼MD5不能解密?
MD5 是不可逆的
也就是沒有對應的算法,能從生產的md5值逆向得到原始數據。
md5作爲數據庫中的主鍵可行嗎?這就涉及到一個問題,md5值是唯一的嗎?答案是,不唯一。
也就是一個原始數據,只對應一個md5值;但是一個md5值,可能對應多個原始數據。
MD5加密原理是散列算法,散列算法也稱哈希算法。
計算機專業學的數據結構就有哈希表這一知識點。
比如10除以3餘數爲一,4除以3餘數也爲一,但餘數爲一的就不知道這個數是哪個了。
所以md5不能解密。

驗證及破解方法
因爲MD5不可逆 所以驗證登錄密碼是否正確這一操作一般都是通過再次加密加密完比對兩次加密的結果,看結果是否一致 來證實是否正確!

Java中常用的Md5+Key的方式對Url簽名防篡改的方法:
最近系統接入支付寶,在demo中看到了如何對get請求的url簽名防止篡改的方法,覺得不錯特此記錄一下。
實現方式是:Md5(url+key) 的方式進行的。
1、key可以是任意的字符串,然後“客戶端”,“服務器端”各自保留一份,千萬不能外泄。
2、請求的URL例如:  name=jack&age=18
3、 URL+Key字符串拼接後的值用MD5加密生成簽名,將簽名發送到服務器端,同時服務器端已同樣的方式計算出簽名,然後比較倆個MD5的值是否相同,來確定URL是否被篡改。
4、別人拿不到key是無法正確計算出簽名的。

下面例子包含 htmlunit 模擬表達提交 訪問http://www.cmd5.com/  獲得解密的結果

package util;
import java.io.IOException;
import java.net.MalformedURLException;
import java.security.MessageDigest;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomNode;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;
public class MD5Util {
     /**
      * 生成md5
      *
      * @param message
      * @return
      */
     public static String getMD5(String message) {
           String md5str = "";
           try {
                // 1 創建一個提供信息摘要算法的對象,初始化爲md5算法對象
                MessageDigest md = MessageDigest.getInstance("MD5");
                // 2 將消息變成byte數組
                byte[] input = message.getBytes();
                // 3 計算後獲得字節數組,這就是那128位了
                byte[] buff = md.digest(input);
                // 4 把數組每一字節(一個字節佔八位)換成16進制連成md5字符串
                md5str = Hex.encodeHexStr(buff);
           } catch (Exception e) {
                e.printStackTrace();
           }
           return md5str;
     }
     public static String VerifyMD5(String Result, String newInput) {
           String md5str = "";
           try {
                // 1 創建一個提供信息摘要算法的對象,初始化爲md5算法對象
                MessageDigest md = MessageDigest.getInstance("MD5");
                // 2 將消息變成byte數組
                byte[] input = newInput.getBytes();
                // 3 計算後獲得字節數組,這就是那128位了
                byte[] buff = md.digest(input);
                // 4 把數組每一字節(一個字節佔八位)換成16進制連成md5字符串
                md5str = Hex.encodeHexStr(buff);
                if (md5str.equals(Result)) {
                     return "驗證密碼通過!";
                } else {
                     return "驗證密碼失敗!";
                }
           } catch (Exception e) {
                e.printStackTrace();
           }
           return "驗證失敗!";
     }
     public static String HtmlUnitVerify(String md5str)
                throws FailingHttpStatusCodeException, MalformedURLException,
                IOException {
           final WebClient webClient = new WebClient();
           webClient.getOptions().setCssEnabled(false);
           webClient.getOptions().setJavaScriptEnabled(false);
           final HtmlPage page = webClient.getPage("http://www.cmd5.com/");
           HtmlTextInput hs = (HtmlTextInput) page
                     .getElementById("ctl00_ContentPlaceHolder1_TextBoxInput");
           hs.setValueAttribute(md5str);
           HtmlElement he = (HtmlElement) page
                     .getElementById("ctl00_ContentPlaceHolder1_Button1");
           HtmlPage pageresult = he.click();
           // System.out.println(pageresult.asText());
           HtmlElement span = (HtmlElement) pageresult
                     .getElementById("ctl00_ContentPlaceHolder1_LabelAnswer");
           DomNode answer = span.getFirstChild();
           // System.out.println(answer.asText());
           webClient.closeAllWindows();
           if (answer.asText().contains("查")) {
                return "破解失敗!";
           } else {
                return answer.asText();
           }
     }
     public static void main(String[] args)
                throws FailingHttpStatusCodeException, MalformedURLException,
                IOException {
           String str = "sunjun123";
           String md5str = "781E5E245D69B566979B86E28D23F2C7";
           System.out.println(getMD5(str));
           String result = HtmlUnitVerify(getMD5(str));
           System.out.println(result);
           // System.out.println(VerifyMD5(md5str,str));
     }
}






發佈了38 篇原創文章 · 獲贊 51 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章