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

导读:本篇文章讲解 Java使用MD5算法加密, 支持加盐,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

摘要


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

}

结果如下:

在这里插入图片描述


最后

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/97514.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!