消息摘要算法又稱為散列算法,其核心在於散列函數的單向性。即通過散列函數可獲得對應的散列值,但不可通過該散列值反推其原始信息。這就是消息摘要算法安全性的根本所在。
簡述
MD5算法是典型的消息摘要算法,其前身有MD2、MD3和MD4算法,它由MD4、MD3和MD2算法改進而來。不論是哪一種MD算法,它們都需要獲得一個隨機長度的信息並產生一個123位的信息摘要。如果將這個128位的二進位摘要信息換算成十六進位,可以得到一個32位的字符串,故我們見到的大部分MD5算法的數字指紋都是32為十六進位的字符串。
MD算法家族的發展史:
MD2算法:
1989年,著名的非對稱算法RSA發明人之一----麻省理工學院教授羅納德.李維斯特開發了MD2算法。這個算法首先對信息進行數據補位,使信息的字節長度是16的倍數。再以一個16位的檢驗和做為補充信息追加到原信息的末尾。最後根據這個新產生的信息計算出一個128位的散列值,MD2算法由此誕生。
MD4算法:
1990年,羅納德.李維斯特教授開發出較之MD2算法有著更高安全性的MD4算法。在這個算法中,我們仍需對信息進行數據補位。不同的是,這種補位使其信息的字節長度加上448個字節後成為512的倍數(信息字節長度mod 512 =448)。此外,關於MD4算的處理和MD2算法有很大的差別。但最終仍舊會獲得一個128為的散列值。MD4算法對後續消息摘要算法起到了推動作用,許多比較有名的消息摘要算法都是在MD4算法的基礎上發展而來的,如MD5、SHA-1、RIPE-MD和HAVAL算法等。
MD5算法:
1991年,繼MD4算法後,羅納德.李維斯特教授開發了MD5算法,將MD算法推向成熟。MD5算法經MD2、MD3和MD4算法發展而來,算法複雜程度和安全強度打打提高,但浙西MD算法的最終結果都是產生一個128位的信息摘要。這也是MD系列算法的特點。
實現
MD系統算法的實現通過MessageDigest類來完成的,如需以流的處理方式完成消息摘要,則需使用DigestInputStream和DigestOutputStream。
MD2和MD5算法實現:
package com.code;import java.security.MessageDigest;import javax.xml.bind.annotation.adapters.HexBinaryAdapter;public class MDCoder {// MD2加密 public static String encodeMd2(byte[] data) throws Exception { // 初始化MessageDigest MessageDigest md = MessageDigest.getInstance("MD2"); // 執行摘要信息 byte[] digest = md.digest(data); // 將摘要信息轉換為32位的十六進位字符串 return new String(new HexBinaryAdapter().marshal(digest)); } // MD5加密 public static String encodeMd5(byte[] data) throws Exception { // 初始化MessageDigest MessageDigest md = MessageDigest.getInstance("MD5"); // 執行摘要信息 byte[] digest = md.digest(data); // 將摘要信息轉換為32位的十六進位字符串 return new String(new HexBinaryAdapter().marshal(digest)); }}
MD2和MD5算法實現測試類:
package com.test;import com.code.MDCoder;public class MDCoderTest {public static void main(String[] args) throws Exception { String testString = "www.itency.com"; System.out.println(MDCoder.encodeMd2(testString.getBytes())); System.out.println(MDCoder.encodeMd5(testString.getBytes())); }}
輸出結果:
5EEDD6F7A14ED9891703945FCA8AF2E05F3268E6A23D1119F4AB5319BAEF0E51