Java对字符串进行MD5加密

大憨熊 提交于 2020-03-25 05:02:14

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@大牛笔记

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!