MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套算法的程序在 RFC 1321 中被加以规范。将数据(如一段文字)运算变为另一固定长度值,是散列算法的基础原理。
1996年后被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。2009年,中国科学院的谢涛和冯登国仅用了220.96的碰撞算法复杂度,破解了MD5的碰撞抵抗,该攻击在普通计算机上运行只需要数秒钟。
MD5输入不定长度信息,输出固定长度128bits,一般的128位MD5散列会被表示为32位十六进制数,还有的表示为16位十六进制数,16位就是32位去掉前八位和后八位。
在Java中生成字符串的MD5值:
public class MD5 {
private static Logger logger = LoggerFactory.getLogger(MD5.class);
public static String encrypt(String string) {
String md5 = "";
try {
// 初始化MD5对象
MessageDigest instance = MessageDigest.getInstance("MD5");
// 将字符串变成byte数组
byte[] bs = string.getBytes();
// 得到128位字节数组
byte[] digest = instance.digest(bs);
// 转换成16进制
md5 = bytesToHex(digest);
} catch (NoSuchAlgorithmException e) {
logger.error("MD5.encrypt::NoSuchAlgorithmException:"+e.getMessage());
}
return md5;
}
private static String bytesToHex(byte[] bytes) {
StringBuffer sb = new StringBuffer();
int dig = 0;
for (byte b : bytes) {
dig = b;
if (dig < 0) {
dig += 256;
}
if (dig < 16) {
sb.append("0");
}
sb.append(Integer.toHexString(dig));
}
return sb.toString().toLowerCase();
}
public static void main(String[] args) {
logger.info(MD5.encrypt("sfjkashf"));
}
}
参考链接:聊一聊MD5@大牛笔记
来源:https://www.cnblogs.com/unuai/p/9511855.html