content: package com.xiyan.util;
  
  import org.apache.commons.lang.StringUtils;
  
  import java.io.UnsupportedEncodingException;
  import java.security.MessageDigest;
  import java.security.NoSuchAlgorithmException;
  
  /**
   * 生成一个MD5码
   *
   * @author Administrator
   */
  public class MD5Util {
  
      public static String encodePassword(String password) {
          if (StringUtils.isEmpty(password)) {
              return password;
          }
          String pwd = null;
          try {
              pwd = getMD5(password.getBytes("utf-8"));
          } catch (UnsupportedEncodingException e) {
              e.printStackTrace();
          }
          return pwd;
      }
  
      public static String getMD5(byte[] source) {
          String s = null;
          char hexDigits[] = { // 用来将字节转换成 16 进制表示的字符
                  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
          try {
              MessageDigest md = MessageDigest.getInstance("MD5");
              md.update(source);
              byte tmp[] = md.digest(); // MD5 的计算结果是一个 128 位的长整数，
              // 用字节表示就是 16 个字节
              char str[] = new char[16 * 2]; // 每个字节用 16 进制表示的话，使用两个字符，
              // 所以表示成 16 进制需要 32 个字符
              int k = 0; // 表示转换结果中对应的字符位置
              for (int i = 0; i < 16; i++) { // 从第一个字节开始，对 MD5 的每一个字节
                  // 转换成 16 进制字符的转换
                  byte byte0 = tmp[i]; // 取第 i 个字节
                  str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中高 4 位的数字转换,
                  // >>> 为逻辑右移，将符号位一起右移
                  str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换
              }
              s = new String(str); // 换后的结果转换为字符串
  
          } catch (Exception e) {
              e.printStackTrace();
          }
          return s;
      }
  
      public final static String MD5(String inputStr) {
          // 用于加密的字符
          char md5String[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
          try {
              // 使用utf-8字符集将此 String 编码为 byte序列，并将结果存储到一个新的 byte数组中
              byte[] btInput = inputStr.getBytes("utf-8");
  
              // 信息摘要是安全的单向哈希函数，它接收任意大小的数据，并输出固定长度的哈希值。
              MessageDigest mdInst = MessageDigest.getInstance("MD5");
  
              // MessageDigest对象通过使用 update方法处理数据， 使用指定的byte数组更新摘要
              mdInst.update(btInput);
  
              // 摘要更新之后，通过调用digest（）执行哈希计算，获得密文
              byte[] md = mdInst.digest();
  
              // 把密文转换成十六进制的字符串形式
              int j = md.length;
              char str[] = new char[j * 2];
              int k = 0;
              for (int i = 0; i < j; i++) { // i = 0
                  byte byte0 = md[i]; // 95
                  str[k++] = md5String[byte0 >>> 4 & 0xf]; // 5
                  str[k++] = md5String[byte0 & 0xf]; // F
              }
  
              // 返回经过加密后的字符串
              return new String(str);
  
          } catch (Exception e) {
              return null;
          }
      }
  
      public static String encryption(String plain) throws UnsupportedEncodingException {
          String re_md5 = new String();
          try {
              MessageDigest md = MessageDigest.getInstance("MD5");
              md.update(plain.getBytes("utf-8"));
              byte b[] = md.digest();
  
              int i;
  
              StringBuffer buf = new StringBuffer("");
              for (int offset = 0; offset < b.length; offset++) {
                  i = b[offset];
                  if (i < 0)
                      i += 256;
                  if (i < 16)
                      buf.append("0");
                  buf.append(Integer.toHexString(i));
              }
  
              re_md5 = buf.toString();
  
          } catch (NoSuchAlgorithmException e) {
              e.printStackTrace();
          }
          return re_md5;
      }
  }