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

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值