前言
MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。
原理
MD5算法的原理可简要的叙述为:MD5码以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
springframework
org.springframework.util.DigestUtils
为我们提供了实现MD5加密的工具类库,这个工具类库专门封装MD5加密的代码,有兴趣可以看一下源码。
自封装工具类
/**
* 密码工具类
* @author chenlirun
* @date 2021/7/8 17:04
*/
public class PasswordUtil {
// 固定随机盐
public static final String SECRET="z3g8r3h4bS8DFG0R";
/**
* md5+salt 加密算法 (推荐)
* @author chenlirun
* @date 2021/7/8 17:09
*/
public static String getMD5Encryption(String password,String salt){
//密码md5+随机盐加密
return DigestUtils.md5DigestAsHex((password+salt).getBytes(StandardCharsets.UTF_8));
}
/**
* md5+salt 加密算法
* @author chenlirun
* @date 2021/7/9 8:56
*/
public static String getMd5Encryption(String password){
return DigestUtils.md5DigestAsHex((password+SECRET).getBytes(StandardCharsets.UTF_8));
}
/**
* 生成随机盐
* @author chenlirun
* @date 2021/7/8 15:56
*/
public static String getSalt(){
String str="zxcvbnmasdfghjklqwertyuiopZXCVBNMASDFGHJKLQWERTYUIOP1234567890,.<>:?";
Random random = new Random();
StringBuffer stringBuffer = new StringBuffer();
//循环16次,共取出16个随机字符
for (int i = 0; i < 16; i++) {
//每次生成一个67以内的随机数
int number = random.nextInt(68);
//生成的随机数作为 str 字符串的下标;从 str 中取出随机字符后追加到 stringBuffer
stringBuffer.append(str.charAt(number));
}
return stringBuffer.toString();
}
}
测试工具类库
@Test
public void md5(){
String password="123456";
//生成随机盐
String salt = PasswordUtil.getSalt();
String md5Encryption = PasswordUtil.getMD5Encryption(password, salt);
System.out.println("md5+随机盐:"+md5Encryption);
String md5Encryption1 = PasswordUtil.getMd5Encryption(password);
System.out.println("MD5+固定盐值:"+md5Encryption1);
}