百度百科對MD5的說明是:java
MD5的做用是讓大容量信息在用數字簽名軟件簽署私人密鑰前被"壓縮"成一種保密的格式(就是把一個任意長度的字節串變換成必定長的十六進制數字串)。算法
一般採用java提供的API實現的MD5加密程序以下所示:編程
1 import java.security.MessageDigest; 2 import java.security.NoSuchAlgorithmException; 3 4 5 public class Encryption1 { 6 public static final String MD5="MD5"; 7 /** 8 * 採用加密算法加密字符串數據 9 * @param str 須要加密的數據 10 * @param algorithm 採用的加密算法 11 * @return 字節數據 12 */ 13 public static byte[] EncryptionStr(String str, String algorithm) { 14 // 加密以後所得字節數組 15 byte[] bytes = null; 16 try { 17 // 獲取MD5算法實例 獲得一個md5的消息摘要 18 MessageDigest md = MessageDigest.getInstance(algorithm); 19 //添加要進行計算摘要的信息 20 md.update(str.getBytes()); 21 //獲得該摘要 22 bytes = md.digest(); 23 } catch (NoSuchAlgorithmException e) { 24 System.out.println("加密算法: "+ algorithm +" 不存在: "); 25 } 26 return null==bytes?null:bytes; 27 } 28 //測試上述方法 29 public static void main(String[] args) { 30 String test1="test1"; 31 String test2="QWERFVDSCX"; 32 String test3="23423KJHkdfg"; 33 String [] test={test1,test2,test3}; 34 for (String s : test) { 35 byte [] bytes=EncryptionStr(s,MD5); 36 System.out.println("數據:" + s+" 加密以後的結果爲:"+bytes.toString()+" 字節數組長度爲:"+bytes.length); 37 } 38 } 39 }
上述代碼執行結果爲:數組
1 數據:test1 加密以後的結果爲:[B@71881149 字節數組長度爲:16 2 數據:QWERFVDSCX 加密以後的結果爲:[B@1c2709da 字節數組長度爲:16 3 數據:23423KJHkdfg 加密以後的結果爲:[B@46f7d5a6 字節數組長度爲:16
分析:字符串採用MD5加密以後返回的數據類型爲字節數組(byte []),一個字節是8位(bit位),返回的數組長度是16,那麼加密的字符串結果爲16*8=128位,爲固定長度的字節數組,除了MD5代碼以外,上述代碼中algorithm參數改爲SHA-1 、SHA-256等加密算法也是支持的安全
上述加密結果一般轉成長度爲32的字符串進行存儲和傳輸,下面是程序代碼:app
1 import java.security.MessageDigest; 2 import java.security.NoSuchAlgorithmException; 3 4 public class Encryption2 { 5 public static final String MD5="MD5"; 6 7 /** 8 * 採用加密算法加密字符串數據 9 * @param str 須要加密的數據 10 * @param algorithm 採用的加密算法 11 * @return 字節數據 12 */ 13 public static byte[] EncryptionStrBytes(String str, String algorithm) { 14 // 加密以後所得字節數組 15 byte[] bytes = null; 16 try { 17 // 獲取MD5算法實例 獲得一個md5的消息摘要 18 MessageDigest md = MessageDigest.getInstance(algorithm); 19 //添加要進行計算摘要的信息 20 md.update(str.getBytes()); 21 //獲得該摘要 22 bytes = md.digest(); 23 } catch (NoSuchAlgorithmException e) { 24 System.out.println("加密算法: "+ algorithm +" 不存在: "); 25 } 26 return null==bytes?null:bytes; 27 } 28 29 30 31 /** 32 * 把字節數組轉化成字符串返回 33 * @param bytes 34 * @return 35 */ 36 public static String BytesConvertToHexString(byte [] bytes) { 37 StringBuffer sb = new StringBuffer(); 38 for (byte aByte : bytes) { 39 String s=Integer.toHexString(0xff & aByte); 40 if(s.length()==1){ 41 sb.append("0"+s); 42 }else{ 43 sb.append(s); 44 } 45 } 46 return sb.toString(); 47 } 48 49 /** 50 * 採用加密算法加密字符串數據 51 * @param str 須要加密的數據 52 * @param algorithm 採用的加密算法 53 * @return 字節數據 54 */ 55 public static String EncryptionStr(String str, String algorithm) { 56 // 加密以後所得字節數組 57 byte[] bytes = EncryptionStrBytes(str,algorithm); 58 return BytesConvertToHexString(bytes); 59 } 60 //測試上述方法 61 public static void main(String[] args) { 62 String test1="test1"; 63 String test2="QWERFVDSCX"; 64 String test3="23423KJHkdfg"; 65 String [] test={test1,test2,test3}; 66 for (String s : test) { 67 String str=EncryptionStr(s,MD5); 68 System.out.println("數據:" + s+" 加密以後的結果爲:"+str+" 字符串長度爲:"+str.length()); 69 } 70 } 71 }
上述代碼執行結果爲:編程語言
1 數據:test1 加密以後的結果爲:5a105e8b9d40e1329780d62ea2265d8a 字符串長度爲:32 2 數據:QWERFVDSCX 加密以後的結果爲:ce5b403e336fb819b48b08dbfd39fbf3 字符串長度爲:32 3 數據:23423KJHkdfg 加密以後的結果爲:6a91f81e7809f6f79c753a054543d128 字符串長度爲:32
上述代碼雖然實現了基本的數據加密功能,可是有人可能以爲32位字符串仍是太長了,想改爲16位或者其餘長度;或者說java編碼時工程統一使用UTF-8編碼,對字符串編碼格式進行指定等要求,下面是一種實現(功能可擴充點還有不少,好比說字符串數組加密,把加密以後的數據轉成指定編碼格式等)函數
1 import java.io.UnsupportedEncodingException; 2 import java.security.MessageDigest; 3 import java.security.NoSuchAlgorithmException; 4 5 public class Encryption3 { 6 public static final String MD5="MD5"; 7 public static final String UTF8="UTF-8"; 8 9 /** 10 * 採用加密算法加密字符串數據 轉成長度爲32的字符串 11 * @param str 12 * @param algorithm 採用的加密算法 13 * @param charset 指定轉化以後的字符串編碼 14 * @return 15 */ 16 public static String EncryptionStr32(String str, String algorithm,String charset) { 17 // 加密以後所得字節數組 18 byte[] bytes = EncryptionStrBytes(str,algorithm,charset); 19 return BytesConvertToHexString(bytes); 20 } 21 22 /** 23 * 採用加密算法加密字符串數據 轉成長度爲32的字符串 24 * @param str 須要加密的數據 25 * @param algorithm 採用的加密算法 26 * @return 字節數據 27 */ 28 public static String EncryptionStr32(String str, String algorithm) { 29 return EncryptionStr32(str,algorithm,""); 30 } 31 32 33 /** 34 * 採用加密算法加密字符串數據 轉成長度爲16的字符串 35 * @param str 36 * @param algorithm 採用的加密算法 37 * @param charset 指定轉化以後的字符串編碼 38 * @return 39 */ 40 public static String EncryptionStr16(String str, String algorithm,String charset) { 41 return EncryptionStr32(str,algorithm,charset).substring(8,24); 42 } 43 44 /** 45 * 採用加密算法加密字符串數據 轉成長度爲16的字符串 46 * @param str 須要加密的數據 47 * @param algorithm 採用的加密算法 48 * @return 字節數據 49 */ 50 public static String EncryptionStr16(String str, String algorithm) { 51 return EncryptionStr32(str,algorithm,"").substring(8,24); 52 } 53 54 /** 55 * 採用加密算法加密字符串數據 56 * @param str 須要加密的數據 57 * @param algorithm 採用的加密算法 58 * @param charset 指定轉化以後的字符串編碼 59 * @return 字節數據 60 */ 61 public static byte[] EncryptionStrBytes(String str, String algorithm, String charset) { 62 // 加密以後所得字節數組 63 byte[] bytes = null; 64 try { 65 // 獲取MD5算法實例 獲得一個md5的消息摘要 66 MessageDigest md = MessageDigest.getInstance(algorithm); 67 //添加要進行計算摘要的信息 68 if(null==charset||"".equals(charset)) { 69 md.update(str.getBytes()); 70 }else{ 71 md.update(str.getBytes(charset)); 72 } 73 //獲得該摘要 74 bytes = md.digest(); 75 } catch (NoSuchAlgorithmException e) { 76 System.out.println("加密算法: "+ algorithm +" 不存在: "); 77 } catch (UnsupportedEncodingException e) { 78 System.out.println("數據加密指定的編碼格式不支持: " + charset); 79 } 80 return null==bytes?null:bytes; 81 } 82 /** 83 * 把字節數組轉化成字符串返回 84 * @param bytes 85 * @return 86 */ 87 public static String BytesConvertToHexString(byte [] bytes) { 88 StringBuffer sb = new StringBuffer(); 89 for (byte aByte : bytes) { 90 String s=Integer.toHexString(0xff & aByte); 91 if(s.length()==1){ 92 sb.append("0"+s); 93 }else{ 94 sb.append(s); 95 } 96 } 97 return sb.toString(); 98 } 99 100 //測試上述方法 101 public static void main(String[] args) { 102 String test1="test1"; 103 String test2="QWERFVDSCX"; 104 String test3="23423KJHkdfg"; 105 String [] test={test1,test2,test3}; 106 for (String s : test) { 107 String str=EncryptionStr32(s, MD5, UTF8); 108 System.out.println("數據:" + s+" 加密以後的結果爲:"+str+" 字符串長度爲:"+str.length()); 109 str = EncryptionStr16(s, MD5, UTF8); 110 System.out.println("數據:" + s+" 加密以後的結果爲:"+str+" 字符串長度爲:"+str.length()); 111 } 112 } 113 }
程序運行結果:測試
1 數據:test1 加密以後的結果爲:5a105e8b9d40e1329780d62ea2265d8a 字符串長度爲:32 2 數據:test1 加密以後的結果爲:9d40e1329780d62e 字符串長度爲:16 3 數據:QWERFVDSCX 加密以後的結果爲:ce5b403e336fb819b48b08dbfd39fbf3 字符串長度爲:32 4 數據:QWERFVDSCX 加密以後的結果爲:336fb819b48b08db 字符串長度爲:16 5 數據:23423KJHkdfg 加密以後的結果爲:6a91f81e7809f6f79c753a054543d128 字符串長度爲:32 6 數據:23423KJHkdfg 加密以後的結果爲:7809f6f79c753a05 字符串長度爲:16