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