Java密码学(二)——消息摘要算法

Java密码学(2)——消息摘要算法

消息摘要算法是为了验证数据的完整性。通过摘要算法可以获得对应的唯一的“消息摘要”或“数字指纹”,但不能通过该“消息摘要”反推出原始值。

 

3大消息摘要算法:

MD算法:MD2、MD4、MD5

SHA算法:SHA-1、SHA-224、SHA-256、SHA-384、SHA-512

MAC算法:HmacMD5、HmacSHA1、HmacSHA256、HmacSHA384、HmacSHA512

 

  • MD5算法

采用commons-codec实现,代码如下

	/**
	 * MD5消息摘要
	 * @param data
	 * @return
	 */
	public static String MD5encode(String data) {
		return DigestUtils.md5Hex(data);
	}

 测试代码

String data = "yeliang";
System.out.println("原文:"+data);

String md5 = MD5encode(data);
System.out.println("MD5消息摘要:"+md5);

 运行结果

原文:yeliang
MD5消息摘要:f9dde79b300661be269b0847511dac0c

 

  • SHA1算法

采用commons-codec实现,代码如下

	/**
	 * SHA1消息摘要
	 * @param data
	 * @return
	 */
	public static String SHA1encode(String data) {
		return DigestUtils.sha1Hex(data);
	}

 测试代码

String data = "yeliang";
System.out.println("原文:"+data);

String sha1 = SHA1encode(data);
System.out.println("SHA1消息摘要:"+sha1);

 运行结果

原文:yeliang
SHA1消息摘要:f4fdc278cca011e1fbb80811e85816b35c735f35

 

  • HmacMD5

实现代码

                /**
	 * 生成HmacMD5算法的密钥
	 * @return
	 */
	public static String HmacMD5KeyGenerate() {
		try {
			KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");
			SecretKey secretKey = keyGenerator.generateKey();
			return Hex.encodeHexString(secretKey.getEncoded());
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * HmacMD5算法计算MAC
	 * @param key
	 * @param data
	 * @return
	 */
	public static String HmacMD5encode(String key, String data) {
		try {
			SecretKey secretKey = new SecretKeySpec(Hex.decodeHex(key.toCharArray()), "HmacMD5");
			Mac mac = Mac.getInstance(secretKey.getAlgorithm());
			mac.init(secretKey);
			byte[] macByte = mac.doFinal(Hex.decodeHex(data.toCharArray()));
			return Hex.encodeHexString(macByte);
		} catch (InvalidKeyException e) {
			e.printStackTrace();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (IllegalStateException e) {
			e.printStackTrace();
		} catch (DecoderException e) {
			e.printStackTrace();
		}
		return null;
	}

测试代码

String hmacMD5Key = HmacMD5KeyGenerate();
System.out.println("HmacMD5密钥:"+hmacMD5Key);	
String hmacMD5 = HmacMD5encode(hmacMD5Key, "404142434445464748494a4b4c4d4f");
System.out.println("HmacMD5生成MAC:"+hmacMD5);

 运行结果

HmacMD5密钥:32639241ecd1613c8274dd236fc0005839c34ca17d41797c71ac55a1986fee2779b79901cec7fde91676228a8ffa6ad845d59d97bfcd8a1ff9cc09cfb41f67f2
HmacMD5生成MAC:aaeb13481292f82fe7e5ec6ee7b7bf3a

 注意:MAC算法是一种有密钥的消息摘要算法,密钥和数据必须是HexString