方式一:容易懂
public class MD5Util { private MD5Util() { } public static String md5(String sourceStr) { Objects.requireNonNull(sourceStr); StringBuilder builder = new StringBuilder(); try { MessageDigest messageDigest = MessageDigest.getInstance("MD5"); messageDigest.update(sourceStr.getBytes()); byte[] bytes = messageDigest.digest(); for (byte aByte : bytes) { builder.append(byteToHex(aByte)); } } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return builder.toString().toUpperCase(); } private static final char[] array = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; private static String byteToHex(byte aByte) { int num = aByte; //将负数转换为正数。采用16进制无符号数表示。 //-128~127 0~255 if (num < 0) { num += 256; } //每个字节8bit,16进制数字占4bit //所以一个字节表示两个16进制数 //将前四个位取出来为一个16进制数 int low = num / 16; //将后四位取出来转换为16进制数 int high = num % 16; return array[low] + "" + array[high]; } }
方式二:xue微难懂
public class MD5Util { public static String MD5(String strs) { /* * 加密需要使用JDK中提供的类 */ StringBuffer sb = new StringBuffer(); try { MessageDigest digest = MessageDigest.getInstance("MD5"); byte[] bs = digest.digest(strs.getBytes()); /* * 加密后的数据是-128 到 127 之间的数字,这个数字也不安全。 取出每个数组的某些二进制位进行某些运算,得到一个新的加密结果 * * 0000 0011 0000 0100 0010 0000 0110 0001 &0000 0000 0000 0000 0000 * 0000 1111 1111 --------------------------------------------- 0000 * 0000 0000 0000 0000 0000 0110 0001 * * 把取出的数据转成十六进制数 */ for (byte b : bs) { //将负数转化为正数,就是+255 int x = b & 255; //将转换后的整数变为16进制无符号数字的字符串形式 String s = Integer.toHexString(x); //如果x<16说明16进制数不够进位,又因为每字节会转换成2位16进制数,所以高位要补0 if (x < 16) { sb.append("0"); } sb.append(s); } } catch (Exception e) { System.out.println("加密失败"); } return sb.toString(); } //测试 public static void main(String[] args) { String s = MD5Util.MD5("qqw11111111111123456"); System.out.println(s); } }