使用MD5对字符串加密

  1 package com.iwhalecloud.retail.enterprise.c.utils;
  2 
  3 import java.io.UnsupportedEncodingException;
  4 import java.security.MessageDigest;
  5 import java.security.NoSuchAlgorithmException;
  6 import java.util.regex.Matcher;
  7 import java.util.regex.Pattern;
  8 
  9 public class MD5Util {
 10     //将字节数组转成十六进制字符串
 11     private static String byteArrayToHexString(byte b[]) {
 12         StringBuffer resultSb = new StringBuffer();
 13         for (int i = 0; i < b.length; i++)
 14             resultSb.append(byteToHexString(b[i]));
 15 
 16         return resultSb.toString();
 17     }
 18 
 19     //对单个字节转换成整数进行取商取余数计算
 20     private static String byteToHexString(byte b) {
 21         int n = b;
 22         if (n < 0)
 23             n += 256;
 24         int d1 = n / 16;
 25         int d2 = n % 16;
 26         //根据下标d1,d2去数组hexDigits的数据
 27         return hexDigits[d1] + hexDigits[d2];
 28     }
 29 
 30     public static String MD5Encode(String origin, String charsetname) {
 31         String resultString = null;
 32         try {
 33             resultString = new String(origin);
 34             // 获得MD5摘要算法的 MessageDigest 对象
 35             MessageDigest md = MessageDigest.getInstance("MD5");
 36             if (charsetname == null || "".equals(charsetname))
 37                 //将加密之后的字节数据转换成16进制的字符串
 38                 resultString = byteArrayToHexString(md.digest(resultString
 39                         .getBytes()));
 40             else
 41                 resultString = byteArrayToHexString(md.digest(resultString
 42                         .getBytes(charsetname)));
 43         } catch (Exception exception) {
 44         }
 45         return resultString;
 46     }
 47 
 48     private static final String hexDigits[] = {"0", "1", "2", "3", "4", "5",
 49             "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};
 50     /**
 51      * MD5加密字符串(32位大写)
 52      *
 53      * @param string 需要进行MD5加密的字符串
 54      * @return 加密后的字符串(大写)
 55      */
 56     public static String md5Encrypt32Upper(String string) {
 57         byte[] hash;
 58         try {
 59             //创建一个MD5算法对象,并获得MD5字节数组,16*8=128位
 60             hash = MessageDigest.getInstance("MD5").digest(string.getBytes("UTF-8"));
 61         } catch (NoSuchAlgorithmException e) {
 62             throw new RuntimeException("Huh, MD5 should be supported?", e);
 63         } catch (UnsupportedEncodingException e) {
 64             throw new RuntimeException("Huh, UTF-8 should be supported?", e);
 65         }
 66 
 67         //转换为十六进制字符串
 68         StringBuilder hex = new StringBuilder(hash.length * 2);
 69         for (byte b : hash) {
 70             if ((b & 0xFF) < 0x10) hex.append("0");
 71             hex.append(Integer.toHexString(b & 0xFF));
 72         }
 73         return hex.toString().toUpperCase();
 74     }
 75 
 76     /**
 77      * MD5加密字符串(32位小写)
 78      *
 79      * @param string 需要进行MD5加密的字符串
 80      * @return 加密后的字符串(小写)
 81      */
 82     public static String md5Encrypt32Lower(String string) {
 83         //直接上面的方法转换成小写就可以了
 84         return md5Encrypt32Upper(string).toLowerCase();
 85     }
 86 
 87     /**
 88      * 将二进制字节数组转换为十六进制字符串
 89      *
 90      * @param bytes 二进制字节数组
 91      * @return 十六进制字符串
 92      */
 93     public static String bytesToHex(byte[] bytes) {
 94         StringBuffer hexStr = new StringBuffer();
 95         int num;
 96         for (int i = 0; i < bytes.length; i++) {
 97             num = bytes[i];
 98             if (num < 0) {
 99                 num += 256;
100             }
101             if (num < 16) {
102                 hexStr.append("0");
103             }
104             hexStr.append(Integer.toHexString(num));
105         }
106         return hexStr.toString().toUpperCase();
107     }
108 
109     /**
110      * Unicode中文编码转换成字符串
111      */
112     public static String unicodeToString(String str) {
113         Pattern pattern = Pattern.compile("(\\\\u(\\p{XDigit}{4}))");
114         Matcher matcher = pattern.matcher(str);
115         char ch;
116         while (matcher.find()) {
117             ch = (char) Integer.parseInt(matcher.group(2), 16);
118             str = str.replace(matcher.group(1), ch + "");
119         }
120         return str;
121     }
122 
123     public static void main(String[] args) {
124         System.out.println(md5Encrypt32Lower("123456"));
125         System.out.println(md5Encrypt32Upper("123456"));
126     }
127 }

 

posted @ 2020-04-01 13:59  骑着蜗牛看海呀  阅读(970)  评论(0编辑  收藏  举报