下面是MD5的加密逻辑:
1..对传入的待加密的字符串转换成字节
2..创建MD5 的加密工具
3.把加密的对象放入容器
4.用加密工具进行加密,得到加密对象(128的长整数)
5.把字节转成16进制
6.最后再转为字符串
具体代码如下:
package com.unit;
import java.security.MessageDigest;
public class Md5Util {
public static String MD5(String md5Str) {
byte[] btInput = md5Str.getBytes();
// 用来将字节转换成 16 进制表示的字符
char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f'
};
try {
//md是字节类型的数组,而MD5是一串十六进制字符,所以要将2进制转为16进制
MessageDigest mdInst = MessageDigest.getInstance("MD5"); //创建MD5加密工具
mdInst.update(btInput); //把字节类型的要加密的对象放入容器
byte[] md = mdInst.digest(); // /进行加密,得到加密后的对象,MD5 的计算结果是一个 128 位的长整数
int j = md.length;
char str[] = new char[j * 2]; //一个字节8个字符(2进制),用2进制表示的话,4个字符是15相当于f,刚好是16进制,
//所以8个字符是2个16进制,即1个字节2个16进制
int k = 0; //转换结果中对应的字符
for (int i = 0; i < j; i++) // 从第一个字节开始,对 MD5 的每一个字节
// 转换成 16 进制字符的转换
{
byte byte0 = md[i];
// >>> 为逻辑右移,将符号位一起右移
//正数直接移位,负数先取其补码(符号位不变,取反加1)再移位,转16进制
str[k++] = hexDigits[byte0 >>> 4 & 0xf]; //取byte0的前四位 ,转为十进制,再转为16进制
str[k++] = hexDigits[byte0 & 0xf]; //去byte0的后四位,转为十进制,再转为16进制
}
return new String(str); //将转换后的结果转为字符串
} catch (Exception e) {
return null;
}
}
}