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);