>获取完整摘要算法工具类代码:
[JAVA]数字摘要算法工具类——(Hamc)MD5/SHA1/SHA256/SHA512/PBKDF2
>Java实现MD5
JAVA JDK中的security包自带了MD5的加密算法,经过加密后,会生成一个128位的二进制序列。
首先导入这个包:
import java.security.MessageDigest;
然后编写主要的业务逻辑:
try {
//1.获取算法MD5实例
MessageDigest md = MessageDigest.getInstance("MD5");
//2.MD5加密
byte[] buff = md.digest("message digest".getBytes());// "message digest" 就是密文
//3.将128位的二进制编码转为32位的16进制编码
String md5str = toHex(buff);
//4.打印
System.out.println(md5str);//输出 f96b697d7cb7938d525a2f31aaf161d0
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
其中,128bin -> 32hex的方法如下:
//将128位的二进制序列转为32位的16进制编码
public static String toHex(byte[] bytes) {
String md5str = "";
for (int i = 0; i < bytes.length; i++) {
int temp = bytes[i];
if (temp < 0) temp += 256; // 0x8* 在经过toHexString转化时,会被转为ffffff8*,需要+256保证其正值
if (temp < 16) md5str += "0"; // 0x05 转化会变成 5,缺少一位0
md5str+=Integer.toHexString(temp);
}
return md5str;
}
>MD5的算法
MD5的主要算法思路有三步:
- 补位
- 分组(小端排序)
- 循环
>补位是什么呢?
MD5将密文按512分一个大组,然后每32位分一个小组,共16小组。(也就是64字节一个大组,4个字节一个小组)。
密文总长度为len,每条密文最后要留出64位(8个字节)的长度,用于保存原数据的长度len;因此,最后一个大分组必须有448位(56字节)的补位;
举个例子,假如一个密文长度为127位(字节),由于(127%64=63)!=