Java使用MD5加密
MD5(消息摘要算法第五版)摘要算法
MD5(消息摘要算法第五版)摘要算法
MD5信息摘要算法广泛使用的密码散列函数。
MD5可以产生出一个128位的散列值用于唯一表示.
项目中通常使用MD5作为敏感数据的加密算法。
特点:
压缩性,MD5生成的摘要长度固定。
抗修改,源数据哪怕有一个字节发生变化,MD5也会有巨大差异。
不可逆,无法通过MD5反向推算源数据。
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>
编写工具类
public class MD5Utils {
public static String md5Encrypt(String source) {
return DigestUtils.md5Hex(source);
}
public static String md5Encrypt(String source, Integer salt) {
char[] ca = source.toCharArray();
for (int i = 0; i < ca.length; i++) {
ca[i] = (char) (ca[i] + salt);
}
String garble = String.valueOf(ca);
return DigestUtils.md5Hex(garble);
}
}
登录逻辑
/**
* 根据前台输入进行校验
*
* @param username 用户名
* @param password 密码
* @return 校验通过后,包含对应用户数据的user实体类
* @throws BusinessException L001-用户名不存在 L002-密码输入错误
*/
public User checkLogin(String username, String password) {
// 按照用户名查询用户
User user = userDao.selectByUsername(username);
if (user == null) {
//抛出用户不存在异常
throw new BusinessException("L001", "用户名为空");
// 密码输入错误校验
}
String md5 = MD5Utils.md5Encrypt(password, user.getSalt());
if (!md5.equals(user.getPassword())) {
throw new BusinessException("L002", "密码错误");
}
return user;
}
注册时候要存储盐值到数据库
Member member = new Member();
member.setUsername(username);
member.setNickname(nickName);
int salt = new Random().nextInt(1000) + 1000;
String md5Digest = MD5Utils.md5Digest(password, salt);
member.setPassword(md5Digest);
member.setSalt(salt);
member.setCreateTime(new Date());
memberDao.insert(member);