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