java中MD5和SHA加密

胡鸿远
2023-12-01

   今天因为业务需要,所以就去简单了解了一下java中MD5以及SHA加密算法的一些用法知识,特此整理,方便以后查看。

一.MD5简介

  MD5(英文全称是Message Digest Algorithm,中文名为消息摘要第5版),是计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。它由MD2、MD3、MD4发展而来的一种单向函数算法(也就是HASH算法),也就是说我们不能通过一段字符反向逆推出原来的明文。MD5的作用是让大容量信息在用数字签名软件签署私人密钥前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的十六进制数字串)。除了MD5以外,其中比较有名的还有sha-1RIPEMD以及Haval等。 


二.SHA简介

SHA(英文全称是Secure Hash Algorithm),是美国国家标准技术研究所发布的国家标准FIPS PUB 180,最新的标准已经于2008年更新到FIPS PUB 180-3。其中规定了SHA-1,SHA-224,SHA-256,SHA-384,和SHA-512这几种单向散列算法。SHA-1,SHA-224和SHA-256适用于长度不超过2^64二进制位的消息。SHA-384和SHA-512适用于长度不超过2^128二进制位的消息。
                                                                 --摘自百度百科

三.MD5余SHA之间的区别和联系

因为二者均由MD4导出,SHA-1MD5彼此很相似。相应的,他们的强度和其他特性也是相似,但还有以下几点不同:

1)对强行攻击的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD52^128数量级的操作,而对SHA-1则是2^160数量级的操作。这样,SHA-1对强行攻击有更大的强度。

2)对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。

3)速度:在相同的硬件上,SHA-1的运行速度比MD5


四.java中MD5和SHA算法的代码实现(主要是一个工具类)

import java.security.MessageDigest;

/**
 * 签名加密工具
 *
 */
public class SignUtil {

	private static final String TOKEN = "supperapp"; // 加密token

	/***
	 * MD5加密 生成32位md5码 速度比较快 性能高 安全强度比sha1要低
	 * 
	 * @param 待加密字符串
	 * @return 返回32位md5码
	 */
	public static String md5EncodeSignature(String inStr) throws Exception {
		MessageDigest md5 = null;
		try {
			md5 = MessageDigest.getInstance("MD5");
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}

		byte[] byteArray = inStr.getBytes("UTF-8");
		byte[] md5Bytes = md5.digest(byteArray);
		StringBuffer hexValue = new StringBuffer();
		for (int i = 0; i < md5Bytes.length; i++) {
			int val = ((int) md5Bytes[i]) & 0xff;
			if (val < 16) {
				hexValue.append("0");
			}
			hexValue.append(Integer.toHexString(val));
		}
		return hexValue.toString();
	}

	/***
	 * SHA加密 生成40位SHA码 加密速度比md5慢 性能比md5低 安全强度比md5高
	 * 
	 * @param 待加密字符串
	 * @return 返回40位SHA码
	 */
	public static String shaEncodeSignature(String inStr) throws Exception {
		MessageDigest sha = null;
		try {
			sha = MessageDigest.getInstance("SHA");
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}

		byte[] byteArray = inStr.getBytes("UTF-8");
		byte[] md5Bytes = sha.digest(byteArray);
		StringBuffer hexValue = new StringBuffer();
		for (int i = 0; i < md5Bytes.length; i++) {
			int val = ((int) md5Bytes[i]) & 0xff;
			if (val < 16) {
				hexValue.append("0");
			}
			hexValue.append(Integer.toHexString(val));
		}
		return hexValue.toString();
	}

	/**
	 * 签名加密
	 * 
	 * @param inStr
	 * @param type
	 *            加密方式 1,MD5 2,SHA
	 * @return
	 */
	public static String signature(String inStr, int type) {
		String encodeStr = "";
		int sel = type;
		if (sel == 0) {
			try {
				encodeStr = md5EncodeSignature(TOKEN+":"+ inStr);
			} catch (Exception e) {
				e.printStackTrace();
			}
		} else {
			try {
				encodeStr = shaEncodeSignature(TOKEN+":" + inStr);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return encodeStr;
	}

}

参考:

MD5_百度百科:http://baike.baidu.com/view/7636.htm?fr=aladdin

SHA_百度百科:http://baike.baidu.com/link?url=FmqSdqu1CxQXDnQPxCD3hTdepu0RWV6N5dec5ZNWSC_U4WWle4a1h0E6744FnCRI



 

 类似资料: