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

  

  • CRC算法

CRC——Cyclic Redundancy Check,循环冗余校验。根据数据产生简短固定位数的一种散列函数,主要用来校验或检测数据传输后出现的错误。

常用件的CRC算法是CRC32算法,循环冗余校验值是32位的二进制,也就是4字节数据。

 

CRC32算法实现代码

        /**
	 * CRC32算法
	 * @param data
	 * @return
	 */
	public static String CRC32code(String data) {
		CRC32 crc32 = new CRC32();
		try {
			crc32.update(Hex.decodeHex(data.toCharArray()));
			String hex = Long.toHexString(crc32.getValue());
			return hex;
		} catch (DecoderException e) {
			e.printStackTrace();
		}
		return null;
	}

 测试代码

String data = "3132333435363738";
String crc32 = CRC32code(data);
System.out.println("原文:"+data);
System.out.println("CRC-32:"+crc32);

 运行结果

原文:3132333435363738
CRC-32:9ae0daaf

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值