一、MD5介绍
MD5是MD5消息摘要算法的简称(英语:MD5 Message-Digest Algorithm),是一种广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(即哈希值),用于确保信息传输的完整性。MD5由罗纳德·李维斯特设计,于1992年公开,用以取代MD4算法。这套算法的程序在RFC 1321 中被加以规范。
将数据(如一段文字)运算变为另一固定长度值,是散列算法的基础原理。
MD5已经被证实可以被碰撞破解。对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。
二、加密
/*
* 对字符串MD5加密(小写+数字)
* @param str 传入要加密的字符串
* @return MD5加密后的字符串
*/
public static String getLowerCaseMD5(String str) {
try {
/**
* 生成一个MD5加密计算摘要
*/
MessageDigest md = MessageDigest.getInstance("MD5");
/**
* 计算MD5函数
*/
md.update(str.getBytes());
/**
* digest()最后返回MD5 hash值,返回值为8位字符串 因为md hash值是16位的hex值 实际上就是8位的字符
* BigInteger函数则将8位的字符串16位的hex值 用字符串来表示;得到字符串形式的hash值
*/
return new BigInteger(1, md.digest()).toString(16);
} catch (Exception e) {
logger.error("getLowerCaseMD5 error", e);
}
return null;
}
/**
* 对字符串MD5加密(大写+数字)
* @param str 传入要加密的字符串
* @return MD5加密后的字符串
*/
public static String getCapitalAndNumMD5(String str) {
char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
try {
byte[] byInput = str.getBytes();
/**
* 获得MD5摘要算法的MessageDigest对象
*/
MessageDigest mdInst = MessageDigest.getInstance("MD5");
/**
* 使用指定的字节更新摘要
*/
mdInst.update(byInput);
/**
* 获得密文
*/
byte[] md = mdInst.digest();
/**
* 把密文转成十六进制的字符串形式
*/
int j = md.length;
char strs[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
strs[k++] = hexDigits[byte0 >>> 4 & 0xf];
strs[k++] = hexDigits[byte0 & 0xf];
}
return new String(strs);
} catch (Exception e) {
logger.error("getCapitalAndNumMD5 error", e);
}
return null;
}