Md5的加密 java實現


  百度百科對MD5的說明是:

  Message Digest Algorithm MD5(中文名為消息摘要算法第 五版)為計算機安全領域廣泛使用的一種散列函數,用以提供消息的完整性保護。
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用於確保信息傳輸完整一致。是計算機廣泛使用的雜湊算法之一(又譯摘要算法哈希算法),主流編程語言普遍已有MD5實現。將數據(如漢字)運算為另一固定長度值,是雜湊算法的基礎原理,MD5的前身有MD2、MD3MD4
  MD5算法具有以下特點:
1、壓縮性:任意長度的數據,算出的MD5值長度都是固定的。
2、容易計算:從原數據計算出MD5值很容易。
3、抗修改性:對原數據進行任何改動,哪怕只修改1個字節,所得到的MD5值都有很大區別。
4、強抗碰撞:已知原數據和其MD5值,想找到一個具有相同MD5值的數據(即偽造數據)是非常困難的。

  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的字符串進行存儲和傳輸,下面是程序代碼:

復制代碼
 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 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM