javaMD5加密
MD5介绍
想在的互联网项目,为了安全起见,一般都会经密码经过加密后再存储到数据库中,用户等录的时候,再把用户输入的密码使用相同的方式加密后跟数据库中的数据进行匹配,如果吻合则允许登录。
本篇来讲一下常用的加密方法MD5码加密。
MD5码可以加密任意长度的字节串,得到的结果都是一个128bit长度的大整数。它与Hash算法具有相同的一个特点,就是加密容易解密难,加密解唯一,解密解无数,经过MD5码加密之后的内容是不可逆的。当然,现在也有一些技术可以反向解密MD5码,但那是建立在拥有庞大映射关系的基础上来进行的。解密MD5码的原理是先记录大量的经过MD5码加密的明文、密文记录,每当要破解一个MD5码的时候就到数据库中查找有没有类似的密文,如果有则返回对应的明文,通过这种方式得到所谓的破解码。
对应网站:https://www.cmd5.com/
这种方式的破解是不完全的,因为理论上MD5明文有无数个,而这种方式匹配的一般只是最常用的明文。
java版的MD5加密
现在java的原生JDK中就带有MD5加密的方法。但是MD5加密的是字节串,我们在使用的时候需要用一些办法将字节串转化为字符串。
1.使用JDK自带的转换方式Base64
Base64这个类可以帮助我们把字节数组和字符串进行解码和编码。配合MD5码的使用如下:
public static String encodeByMd5(String string) throws Exception {
// --------------------------- MD5加密算法,不能加密特殊符号 ---------------------------------
MessageDigest md5 = MessageDigest.getInstance("MD5");
Base64.Encoder base64Encoder = Base64.getEncoder();
// 加密字符串
return base64Encoder.encodeToString(md5.digest(string.getBytes("utf-8")));
// --------------------------- 之前的MD5加密算法,不能加密特殊符号 ---------------------------------
}
使用这种方式比较方便,只需要简单的几行代码就能搞定,但是用这种方式进行加密只能匹配对应的64个字符,里面只包含了52个大小写字母、10个数字以及两个符号。如果需要对特殊字符进行加密,可以使用下面的方法。
2加密特殊字符
下面的方法中可以加密方法甚至可以加密中文字符,还是比较强大的,自己可以尝试一下。
public static String getMD5Str(String str) {
MessageDigest messageDigest = null;
try {
messageDigest = MessageDigest.getInstance("MD5");
messageDigest.reset();
messageDigest.update(str.getBytes("UTF-8"));
} catch (NoSuchAlgorithmException e) {
System.out.println("NoSuchAlgorithmException caught!");
System.exit(-1);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
byte[] byteArray = messageDigest.digest();
StringBuffer md5StrBuff = new StringBuffer();
for (int i = 0; i < byteArray.length; i++) {
if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)
md5StrBuff.append("0").append(Integer.toHexString(0xFF & byteArray[i]));
else
md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
}
return md5StrBuff.toString();
}