View Javadoc
1   package gboat2.base.bridge.util.security;
2   
3   import java.io.File;
4   import java.io.IOException;
5   
6   /**
7    * MD5(message-digest algorithm 5,即:信息-摘要算法) 加密的工具类
8    * @author tanxw
9    * @author <a href="mailto:[email protected]">何明旺</a>
10   * @since 1.0
11   */
12  public final class MD5Util extends Encryptor{
13      /** 默认的密码字符串组合,用来将字节转换成 16 进制表示的字符,apache校验下载的文件的正确性用的就是默认的这个组合 */
14      private static char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7',
15              '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
16      
17      /**
18       * 获取文件的 MD5 签名
19       * 
20       * @param file 文件
21       * @return 文件的 MD5 签名
22       * @throws IOException
23       */
24      public static String getFileMD5String(File file) {
25          byte[] bytes = digest(file, MD5);
26          return bufferToHex(bytes);
27      }
28  
29      /**
30       * 对字符串进行 MD5 加密
31       * 
32       * @param str 要加密的字符串
33       * @return 加密后的密文
34       */
35      public static String getMD5String(String str) {
36          byte[] bytes = digest(str, MD5);
37          return bufferToHex(bytes);
38      }
39  
40      private static String bufferToHex(byte[] bytes) {
41          return bufferToHex(bytes, 0, bytes.length);
42      }
43  
44      private static String bufferToHex(byte[] bytes, int m, int n) {
45          StringBuffer stringbuffer = new StringBuffer(2 * n);
46          int k = m + n;
47          for (int l = m; l < k; l++) {
48              appendHexPair(bytes[l], stringbuffer);
49          }
50          return stringbuffer.toString();
51      }
52  
53      private static void appendHexPair(byte bt, StringBuffer stringbuffer) {
54          // 取字节中高 4 位的数字转换为逻辑右移,将符号位一起右移,此处未发现两种符号有何不同
55          char c0 = hexDigits[(bt & 0xf0) >> 4];
56          char c1 = hexDigits[bt & 0xf];// 取字节中低 4 位的数字转换
57          stringbuffer.append(c0);
58          stringbuffer.append(c1);
59      }
60  }