MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。
这波解释是不是很正经严肃,好像看懂了,但是如果有人问MD5是什么,MD5就是...就是小编也不知道,通俗一点MD5是一种算法,用于数据的安全方面对数据进行加密和解密,虽然MD5被认为不安全,而且渐渐被AES所取代,但是对于一般的情况下使用时可以的,例如某个管理后台的账号密码加密,普通的HTTP请求签名,数据库存储的一些重要数据加密,在这小编就说一下MD5在Java上的使用。
在JDK内部集成多种算法,包括MD5和AES等,那MD5在Java上的使用就非常简单了,默认的加密是小写的,如下
知道你们这些懒人肯定要可以复制的源码,小编会在最后附上整个工具类的源码的,默认的加密就是生成小写,但是如果想要使用大写也非常简单,就是使用,自定义一个数组,代码如下
下面附上整个工具类的源码,小编哪里有写的不好或者有错误,希望大家能留言指出
import org.apache.commons.codec.binary.Hex;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;
/**
* @date 2019/9/16 10:30
*/
public class MD5Utils {
/**
* 字符串MD5(小写+字母)
*
* @param str 要进行MD5的字符串
*/
public static StringgetStrMD5(String str) {
// 获取MD5实例
MessageDigest md5 =null;
try {
md5 = MessageDigest.getInstance("MD5");
}catch (NoSuchAlgorithmException e) {
e.printStackTrace();
System.out.println(e.toString());
return "获取MD5实例异常";
}
// 将加密字符串转换为字符数组
char[] charArray = str.toCharArray();
byte[] byteArray =new byte[charArray.length];
// 开始加密
for (int i =0; i < charArray.length; i++)
byteArray[i] = (byte) charArray[i];
byte[] digest = md5.digest(byteArray);
StringBuilder sb =new StringBuilder();
for (int i =0; i < digest.length; i++) {
int var = digest[i] &0xff;
if (var <16)
sb.append("0");
sb.append(Integer.toHexString(var));
}
return sb.toString();
}
/**
* 字符串MD5(大写+字母)
*
* @param password 要进行MD5的字符串
*/
public static StringgetStrrMD5(String password) {
char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
try {
byte strTemp[] = password.getBytes("UTF-8");
MessageDigest mdTemp = MessageDigest.getInstance("MD5");
mdTemp.update(strTemp);
byte md[] = mdTemp.digest();
int j = md.length;
char str[] =new char[j *2];
int k =0;
for (int i =0; i < j; i++) {
byte byte0 = md[i];
str[k++] = hexDigits[byte0 >>>4 &15];
str[k++] = hexDigits[byte0 &15];
}
return new String(str);
}catch (Exception e) {
return null;
}
}
/**
* 加盐MD5
*/
public static StringgetSaltMD5(String password) {
// 生成一个16位的随机数
Random random =new Random();
StringBuilder sBuilder =new StringBuilder(16);
sBuilder.append(random.nextInt(99999999)).append(random.nextInt(99999999));
int len = sBuilder.length();
if (len <16) {
for (int i =0; i <16 - len; i++) {
sBuilder.append("0");
}
}
// 生成最终的加密盐
String Salt = sBuilder.toString();
password =md5Hex(password + Salt);
char[] cs =new char[48];
for (int i =0; i <48; i +=3) {
cs[i] = password.charAt(i /3 *2);
char c = Salt.charAt(i /3);
cs[i +1] = c;
cs[i +2] = password.charAt(i /3 *2 +1);
}
return String.valueOf(cs);
}
/**
* 验证加盐后是否和原文一致
* @param password md5原文
* @param md5str 加盐md5后的md5串
*/
public static boolean getSaltverifyMD5(String password, String md5str) {
char[] cs1 =new char[32];
char[] cs2 =new char[16];
for (int i =0; i <48; i +=3) {
cs1[i /3 *2] = md5str.charAt(i);
cs1[i /3 *2 +1] = md5str.charAt(i +2);
cs2[i /3] = md5str.charAt(i +1);
}
String Salt =new String(cs2);
return md5Hex(password + Salt).equals(String.valueOf(cs1));
}
/**
* 单次加密,双次解密
*/
public static StringgetconvertMD5(String inStr) {
char[] charArray = inStr.toCharArray();
for (int i =0; i < charArray.length; i++) {
charArray[i] = (char) (charArray[i] ^'t');
}
String str = String.valueOf(charArray);
return str;
}
/**
* 使用Apache的Hex类实现Hex(16进制字符串和)和字节数组的互转
*/
@SuppressWarnings("unused")
private static Stringmd5Hex(String str) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] digest = md.digest(str.getBytes());
return new String(new Hex().encode(digest));
}catch (Exception e) {
e.printStackTrace();
System.out.println(e.toString());
return "";
}
}
public static void main(String[] args) {
System.out.println(getSaltMD5("admin"));
System.out.println(getSaltverifyMD5("admin","092956b6b61a40a011f3076c650194991954f3584fa92220"));
System.out.println(getconvertMD5("admin"));
System.out.println(getconvertMD5(getconvertMD5("admin")));
}
}
补充说明:
MD5加密算法为现在应用最广泛的哈希算法之一,该算法广泛应用于互联网网站的用户文件加密,能够将用户密码加密为128位的长整数。数据库并不明文存储用户密码,而是在用户登录时将输入密码字符串进行MD5加密,与数据库中所存储的MD5值匹配,从而降低密码数据库被盗取后用户损失的风险。
MD5加密算法以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。