MD5加密是一种常用的加密方式,以下分享一个MD5加密工具类,常用于各种隐私信息的加密。
1.什么是MD5加密
MD5 信息摘要演算法(Message-Digest Algorithm),一种被广泛使用的密码杂凑函数,可以产生出一个128位元(16位元组)的散列值(hash value),用于确保信息传输完整一致。输入任意长度的信息,经过处理,输出为128位的信息(数字指纹);
不同的输入得到的不同的结果(唯一性);
2.MD5算法的安全性
普遍认为MD5是很安全,因为暴力破解的时间是一般人无法接受的。实际上如果把用户的密码MD5处理后再存储到数据库,其实是很不安全的。因为用户的密码是比较短的,而且很多用户的密码都使用生日,手机号码,身份证号码,电话号码等等。或者使用常用的一些吉利的数字,或者某个英文单词。如果我把常用的密码先MD5处理,把数据存储起来,然后再跟你的MD5结果匹配,这时我就有可能得到明文。(碰撞)
3.java自带无需依赖
import java.security.MessageDigest;
public class MD5Util {
/**
* 生成32位小写的md5加密
*/
public static String lowMD5_32(String plainText) {
MessageDigest md5;
try {
md5 = MessageDigest.getInstance("MD5");
byte[] md5Bytes = md5.digest(plainText.getBytes());
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < md5Bytes.length; i++) {
int val = ((int) md5Bytes[i]) & 0xff;
if (val < 16) {
hexValue.append("0");
}
hexValue.append(Integer.toHexString(val));
}
plainText = hexValue.toString();
} catch (Exception e) {
throw new RuntimeException(e);
}
return plainText;
}
/**
* 生成16位小写的md5加密
*/
public static String lowMD5_16(String plainText) {
String str = lowMD5_32(plainText);
return str.substring(8, 24);
}
/**
* 生成16位大写的md5加密
*/
public static String upperMD5_16(String plainText) {
String str = lowMD5_16(plainText).toUpperCase();
return str;
}
/**
* 生成32位大写的md5加密
*/
public static String upperMD5_32(String plainText) {
String str = lowMD5_32(plainText).toUpperCase();
return str;
}
public static void main(String[] args) {
String str = "helloworld123321123";//测试用例
System.out.println("MD5小写16位:"+lowMD5_16(str));
System.out.println("MD5小写32位:"+lowMD5_32(str));
System.out.println("MD5大写16位:"+upperMD5_16(str));
System.out.println("MD5大写32位:"+upperMD5_32(str));
}
}
结果如下:
4.引入codec进行MD5加密
引入依赖
<!--MD5加密-->
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
import org.apache.commons.codec.digest.DigestUtils;
public class MD5Utils {
/*
* MD5加密
* @explain:借助Apache工具类DigestUtils实现
* @params msg: 待加密字符串
* @return :16进制加密字符串
* */
public static String encryToMD5(String msg){
return DigestUtils.md5Hex(msg);
}
public static void main(String[] args) {
String data = "hello";
String endata = encryToMD5(data);
System.out.println("MD5加密后:" + endata);
}
}