使用 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;<br />public class MD5 {<br />public static String getMD5(String source) {<br /> String s = null;<br /> // 用來將位元組轉換成 16 進位表示的字元<br /> char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };<br /> try {<br /> MessageDigest md = MessageDigest.getInstance("MD5");<br /> md.update(source.getBytes());<br /> // MD5 的計算結果是一個 128 位的長整數,<br /> byte tmp[] = md.digest(); </p><p> // 用位元組表示就是 16 個位元組<br /> // 每個位元組用 16 進位表示的話,使用兩個字元,<br /> // 所以表示成 16 進位需要 32 個字元<br /> char str[] = new char[16 * 2];<br /> // 表示轉換結果中對應的字元位置<br /> int k = 0;<br /> // 從第一個位元組開始,對 MD5 的每一個位元組<br /> // 轉換成 16 進位字元的轉換<br /> for (int i = 0; i < 16; i++) {<br /> // 取第 i 個位元組<br /> byte byte0 = tmp;<br /> // 取位元組中高 4 位的數字轉換,>>> 為邏輯右移,將符號位一起右移<br /> str[k++] = hexDigits[byte0 >>> 4 & 0xf];<br /> // 取位元組中低 4 位的數字轉換<br /> str[k++] = hexDigits[byte0 & 0xf];<br /> }<br /> // 換後的結果轉換為字串<br /> s = new String(str);<br /> } catch (Exception e) {<br /> e.printStackTrace();<br /> }<br /> return s;<br />}</p><p> // 方法二<br />public static String getMD5Second(String str) {<br /> StringBuilder sb = new StringBuilder();<br /> try {<br /> MessageDigest md5 = MessageDigest.getInstance("MD5");<br /> md5.update(str.getBytes());<br /> for (byte b : md5.digest()) {<br /> sb.append(String.format("%02x", b));<br /> }<br /> } catch (NoSuchAlgorithmException e) {<br /> e.printStackTrace();<br /> }<br /> return sb.toString();<br />}</p><p>// 計算 "a" 的 MD5 代碼,應該為:0cc175b9c0f1b6a831c399e269772661<br />public static void main(String xu[]) {<br /> System.out.println(MD5.getMD5("a"));<br />}<br />}