MD5工具类(含16位、32位、加盐、无盐、大小写)


什么是MD5

MD5(Message-Digest Algorithm 5),即消息摘要算法第五版,是一种被广泛使用的密码散列函数。散列算法的基础原理是:将数据(如一段文字)运算演变为另一段固定长度(16/32)的值。

是否属于加密算法

说法不一:

     1.不属于:没有解密算法,密文(散列值)不可逆向得到原文;
     2.属于:明文经MD5处理后看不到原文,视为加密状态,类似BASE64算法只能算编码算法。

MD5用途

1.防止被篡改:
如发送电子文档、接口数据传输、文件下载等,为了第三方在中途对数据进行篡改。

2.防止直接看到明文:
数据库存储用户的密码的时候都是存储用户密码的MD5值。这样就算得到数据库的用户密码的MD5值,也无法知道用户的密码。

3.防止抵赖(数字签名):
这需要一个第三方认证机构。例如A写了一个文件,认证机构对此文件用MD5算法产生摘要信息并做好记录。若以后A说这文件不是他写的,权威机构只需对此文件重新产生摘要信息,然后跟记录在册的摘要信息进行比对,相同的话,就证明是A写的了。这就是所谓的“数字签名”。

MD5安全性

比较完全,但是也有部分密码是可以暴力破解(撞库),因为很多用户的密码都使用生日、纪念日、吉利的数字、英文单词等。所以网站密码的策略应该强制要求用户使用字母+数字+特殊字符+大小写混搭的组合的方式提高密码的安全度。

MD5工具类

废话不多唠,直接上代码,含注释:

package com.common.utils.md5;
 
import java.io.FileInputStream;
import java.math.BigInteger;
import java.security.MessageDigest;
 
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.poi.util.IOUtils;
 
/**
* @ClassName: MD5Util
* @Description:MD5加密/验证工具类
* @author weny.yang
* @date May 11, 2021
*/
public class MD5Util {
    
    /**
     * @Title: md5Lower
     * @Description:不加盐值32位小写
     * @author weny.yang
     * @date May 11, 2021
     */
    public static String md5Lower(String plainText) {
        String md5 = null;
        if (null != plainText && !"".equals(plainText)) {
            try {
                MessageDigest md = MessageDigest.getInstance("MD5");
                md.update(plainText.getBytes("UTF-8"));
                md5 =  new BigInteger(1, md.digest()).toString(16);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return md5;
    }
    
    /**
     * @Title: md5Lower
     * @Description:加盐值32位小写
     * @author weny.yang
     * @date May 11, 2021
     */
    public static String md5Lower(String plainText, String saltValue) {
        String md5 = null;
        if (null != plainText && !"".equals(plainText) && null != saltValue && !"".equals(saltValue)) {
            try {
                MessageDigest md = MessageDigest.getInstance("MD5");
                md.update(plainText.getBytes("UTF-8"));
                md.update(saltValue.getBytes("UTF-8"));
                md5 = new BigInteger(1, md.digest()).toString(16);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return md5;
    }
    
    /**
     * @Title: md5_16Lower
     * @Description:不加盐值16位小写
     * @author weny.yang
     * @date May 11, 2021
     */
    public static String md5_16Lower(String plainText) {
        String md5 = md5Lower(plainText);
        return null==md5?md5:md5.substring(8, 24);
    }
    
    /**
     * @Title: md5_16Lower
     * @Description:加盐值16位小写
     * @author weny.yang
     * @date May 11, 2021
     */
    public static String md5_16Lower(String plainText, String saltValue) {
        String md5 = md5Lower(plainText, saltValue);
        return null==md5?md5:md5.substring(8, 24);
    }
    
    /**
     * @Title: md5_16Upper
     * @Description:不加盐值16位大写
     * @author weny.yang
     * @date May 11, 2021
     */
    public static String md5_16Upper(String plainText) {
        String md5 = md5_16Lower(plainText);
        return null==md5?md5:md5.toUpperCase();
    }
 
    /**
     * @Title: md5_16Upper
     * @Description:加盐值16位大写
     * @author weny.yang
     * @date May 11, 2021
     */
    public static String md5_16Upper(String plainText, String saltValue) {
        String md5 = md5_16Lower(plainText, saltValue);
        return null==md5?md5:md5.toUpperCase();
    }
 
    /**
     * @Title: md5Upper
     * @Description:不加盐值32位大写
     * @author weny.yang
     * @date May 11, 2021
     */
    public static String md5Upper(String plainText) {
        String md5 = md5Lower(plainText);
        return null==md5?md5:md5.toUpperCase();
    }
    
    /**
     * @Title: md5Upper
     * @Description:加盐值32位大写
     * @author weny.yang
     * @date May 11, 2021
     */
    public static String md5Upper(String plainText, String saltValue) {
        String md5 = md5Lower(plainText, saltValue);
        return null==md5?md5:md5.toUpperCase();
    }
    
    
 
    public static void main(String[] args) {
        String plainText = "123456";//明文
        String saltValue = "8";//盐值
 
        System.out.println(md5_16Lower(plainText));
        System.out.println(md5_16Upper(plainText));
        System.out.println(md5Lower(plainText));
        System.out.println(md5Upper(plainText));
        System.out.println("====================");
        System.out.println(md5_16Lower(plainText, saltValue));
        System.out.println(md5_16Upper(plainText, saltValue));
        System.out.println(md5Lower(plainText, saltValue));
        System.out.println(md5Upper(plainText, saltValue));
    }
}

转载:https://blog.csdn.net/duoyu779553/article/details/116720451

TRANSLATE with x English
Arabic Hebrew Polish
Bulgarian Hindi Portuguese
Catalan Hmong Daw Romanian
Chinese Simplified Hungarian Russian
Chinese Traditional Indonesian Slovak
Czech Italian Slovenian
Danish Japanese Spanish
Dutch Klingon Swedish
English Korean Thai
Estonian Latvian Turkish
Finnish Lithuanian Ukrainian
French Malay Urdu
German Maltese Vietnamese
Greek Norwegian Welsh
Haitian Creole Persian  
Bing Webmaster Portal Back