使用 Java 產生 MD5 編碼 MD5即Message-Digest Algorithm 5(資訊-摘要演算法5),是一種用於產生數位簽章的單項散列演算法,在1991年由MIT Laboratory for Computer Science(IT電腦科學實驗室)和RSA Data Security Inc(RSA資料安全公司)的Ronald L. Rivest教授開發出來,經由MD2、MD3和MD4發展而來。MD5演算法的使用不需要支付任何著作權費用。它的作用是讓大容量資訊在用數位簽章軟體簽私人密匙前被"壓縮"成一種保密的格式(將一個任意長度的“位元組串”通過一個無法復原的字串變換演算法變換成一個128bit的大整數,換句話說就是,即使你看到來源程式和演算法描述,也無法將一個MD5的值變換回原始的字串,從數學原理上說,是因為原始的字串有無窮多個,這有點象不存在反函數的數學函數。)
在 Java 中,java.security.MessageDigest 中已經定義了 MD5 的計算,所以我們只需要簡單地調用即可得到 MD5 的128 位整數。然後將此 128 位計 16 個位元組轉換成 16 進位表示即可。
代碼如下:
import java.security.MessageDigest; public class MD5 { public static String getMD5(String source) { String s = null; // 用來將位元組轉換成 16 進位表示的字元 char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; try { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(source.getBytes()); // MD5 的計算結果是一個 128 位的長整數, byte tmp[] = md.digest(); // 用位元組表示就是 16 個位元組 // 每個位元組用 16 進位表示的話,使用兩個字元, // 所以表示成 16 進位需要 32 個字元 char str[] = new char[16 * 2]; // 表示轉換結果中對應的字元位置 int k = 0; // 從第一個位元組開始,對 MD5 的每一個位元組 // 轉換成 16 進位字元的轉換 for (int i = 0; i < 16; i++) { // 取第 i 個位元組 byte byte0 = tmp; // 取位元組中高 4 位的數字轉換,>>> 為邏輯右移,將符號位一起右移 str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取位元組中低 4 位的數字轉換 str[k++] = hexDigits[byte0 & 0xf]; } // 換後的結果轉換為字串 s = new String(str); } catch (Exception e) { e.printStackTrace(); } return s; } // 方法二 public static String getMD5Second(String str) { StringBuilder sb = new StringBuilder(); try { MessageDigest md5 = MessageDigest.getInstance("MD5"); md5.update(str.getBytes()); for (byte b : md5.digest()) { sb.append(String.format("%02x", b)); } } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return sb.toString(); } // 計算 "a" 的 MD5 代碼,應該為:0cc175b9c0f1b6a831c399e269772661 public static void main(String xu[]) { System.out.println(MD5.getMD5("a")); } }