MD5是常见的摘要算法。
摘要算法:
是指把任意⻓度的输⼊消息数据转化为固定⻓度的输出数据的⼀种密码算法. 摘要算法是 不可逆的, 也就是⽆法解密. 通常⽤来检验数据的完整性的重要技术, 即对数据进⾏哈希计算然后⽐ 较摘要值, 判断是否⼀致. 常⻅的摘要算法有: MD5, SHA系列(SHA1, SHA2等), CRC(CRC8, CRC16, CRC32)
摘要算法存在的客观问题:
虽然经过MD5加密后的密⽂⽆法解密, 相同的密码经过MD5哈希之后的密⽂是相同的。
当存 储⽤⼾密码的数据库泄露后, 攻击者会很容易便能找到相同密码的⽤户, 从⽽降低了破解密码的难度。
MD5加密思路:
盐本质上就是一个随机的字符串。
我们采⽤为⼀个密码拼接⼀个随机字符串(盐)来进⾏MD5加密,然后我们把盐和MD5加密的密文拼接后存储到数据库。
存储:盐值 + MD5(盐值+password)
代码:
import org.springframework.util.DigestUtils;
import java.util.UUID;
public class SecurityUtil {
/**
* 加密
* password 用户注册时输入的密码
* return: 数据库中存储的信息: 盐值 + md5(明文+盐值)
*/
public static String encrypt(String password){
//生成随机盐值
String salt = UUID.randomUUID().toString().replace("-","");
//对 明文+盐值 进行MD5加密 => md5(明文+盐值)
String finalPassword = DigestUtils.md5DigestAsHex((password+salt).getBytes());
//盐值 + MD5(盐值+password)
return salt+finalPassword;
}
}
MD5解密思路:
如果⽤户输⼊的密码和盐值⼀起拼接后的字符串经过MD5加密后, 得到的密⽂与数据库存储的密文相同, 我们就认为密码正确。
图解:
代码:
/**
* 验证密码是否正确
* @param inputPassword 用户登录时输入的密码
* @param sqlPassword 数据库中password字段存储的信息 盐值 + md5(明文+盐值)
* @return
*/
public static boolean verify(String inputPassword, String sqlPassword){
if (!StringUtils.hasLength(inputPassword)){
return false;
}
if (sqlPassword==null || sqlPassword.length() !=64){
return false;
}
//获取盐值
String salt = sqlPassword.substring(0,32);
//根据用户登录输入的密码和盐值, 进行加密 md5(明文+盐值)
String finalPassword = DigestUtils.md5DigestAsHex((inputPassword+salt).getBytes());
return (salt+finalPassword).equals(sqlPassword);
}
以上为我个人的小分享,如有问题,欢迎讨论!!!
都看到这了,不如关注一下,给个免费的赞