欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-01-16 10:00:52
...

摘要


今天博主也开始更新博客了,为国家做贡献十几天后,第一天上班还下大雨真刺激!今天简单的讲一讲–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: aaa@qq.com
 * @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);
    }

}

结果如下:

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


最后

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

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