2 MD5加密 java實現

  百度百科對MD5的說明是:java

  Message Digest Algorithm MD5(中文名爲 消息摘要算法第 五版)爲計算機安全領域普遍使用的一種散列函數,用以提供消息的完整性保護。
MD5即Message-Digest Algorithm 5(信息-摘要算法5),用於確保信息傳輸完整一致。是計算機普遍使用的雜湊算法之一(又譯 摘要算法哈希算法),主流編程語言廣泛已有MD5實現。將數據(如漢字)運算爲另外一固定長度值,是雜湊算法的基礎原理,MD5的前身有MD二、 MD3MD4
  MD5算法具備如下特色:
一、壓縮性:任意長度的數據,算出的MD5值長度都是固定的。
二、容易計算:從原數據計算出MD5值很容易。
三、抗修改性:對原數據進行任何改動,哪怕只修改1個字節,所獲得的MD5值都有很大區別。
四、強抗碰撞:已知原數據和其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的字符串進行存儲和傳輸,下面是程序代碼: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
相關文章
相關標籤/搜索