方式一:容易懂
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);
}
}