Java使用MD5算法加密, 支持加盐

摘要


今天博主也开始更新博客了,为国家做贡献十几天后,第一天上班还下大雨真刺激!今天简单的讲一讲–Java使用MD5算法加密, 支持加盐。


为什么要使用MD5算法加密并加盐?

盐被称作“Salt值”,这个值是由系统随机生成的,并且只有系统知道。即便两个用户使用了同一个密码,由于系统为它们生成的salt值不同,散列值也是不同的。

MD5算法的原理可简要的叙述为:MD5码以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

扩展资料:

MD5相对MD4所作的改进:

  1. 增加了第四轮。
  2. 每一步均有唯一的加法常数。
  3. 减弱第二轮中函数的对称性。
  4. 第一步加上了上一步的结果,这将引起更快的雪崩效应(就是对明文或者密钥改变 1bit 都会引起密文的巨大不同)。
  5. 改变了第二轮和第三轮中访问消息子分组的次序,使其更不相似。
  6. 近似优化了每一轮中的循环左移位移量以实现更快的雪崩效应,各轮的位移量互不相同。

代码如下

很简单的一个版本大家可以凭借经验,查阅并完善。

package com.cyj.admincenter.utils;

import java.security.MessageDigest;

/**
 * @Description: 使用MD5算法加密, 支持加盐
 * @BelongsProject: Family
 * @BelongsPackage: com.cyj.admincenter.utils
 * @Author: ChenYongJia
 * @CreateTime: 2020-02-11 09:46
 * @Email: [email protected]
 * @Version: 1.0
 */
public class PasswordEncoder {

    // 十六进制数字
    private final static String[] hexDigits = {"0", "1", "2", "3", "4", "5",
            "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};

    private Object salt;
    private String algorithm;

    public PasswordEncoder(Object salt, String algorithm) {
        this.salt = salt;
        this.algorithm = algorithm;
    }

    /**
     * 转换字节数组为16进制字串
     *
     * @param b 字节数组
     * @return 16进制字串
     */
    private static String byteArrayToHexString(byte[] b) {
        StringBuffer resultSb = new StringBuffer();
        for (int i = 0; i < b.length; i++) {
            resultSb.append(byteToHexString(b[i]));
        }
        return resultSb.toString();
    }

    private static String byteToHexString(byte b) {
        int n = b;
        if (n < 0)
            n = 256 + n;
        int d1 = n / 16;
        int d2 = n % 16;
        return hexDigits[d1] + hexDigits[d2];
    }

    public String encode(String rawPass) {
        String result = null;
        try {
            MessageDigest md = MessageDigest.getInstance(algorithm);
            // 加密后的字符串
            result = byteArrayToHexString(md.digest(mergePasswordAndSalt(
                    rawPass).getBytes("utf-8")));
        } catch (Exception ex) {
        }
        return result;
    }

    public boolean isPasswordValid(String encPass, String rawPass) {
        String pass1 = "" + encPass;
        String pass2 = encode(rawPass);

        return pass1.equals(pass2);
    }

    private String mergePasswordAndSalt(String password) {
        if (password == null) {
            password = "";
        }

        if ((salt == null) || "".equals(salt)) {
            return password;
        } else {
            return password + "{" + salt.toString() + "}";
        }
    }

    public static void main(String[] args) {
        // 盐值自己定
        String salt = "helloworld";
        PasswordEncoder encoderMd5 = new PasswordEncoder(salt, "MD5");
        String encode = encoderMd5.encode("test");
        // 带盐值的MD5加密
        System.out.println("带盐值的MD5加密" + encode);
        // 空盐值的MD5加密
        System.out.println("空盐值的MD5加密"
                + new PasswordEncoder(null, "MD5").encode("test"));
        boolean passwordValid = encoderMd5.isPasswordValid(
                "1bd98ed329aebc7b2f89424b5a38926e", "test");
        System.out.println(passwordValid);

        PasswordEncoder encoderSha = new PasswordEncoder(salt, "SHA");
        String pass2 = encoderSha.encode("test");
        System.out.println(pass2);
        boolean passwordValid2 = encoderSha.isPasswordValid(
                "1bd98ed329aebc7b2f89424b5a38926e", "test");
        System.out.println(passwordValid2);
    }

}

结果如下:

在这里插入图片描述


最后

  • 更多参考精彩博文请看这里:《陈永佳的博客》

  • 喜欢博主的小伙伴可以加个关注、点个赞哦,持续更新嘿嘿!

发布了406 篇原创文章 · 获赞 998 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/Mrs_chens/article/details/104258713
今日推荐