java加密解密研究8、MAC算法家族
一、概述
MAC算法结合了MD5和SHA算法的优势,并加入密钥的支持,是一种更为安全的消息摘要算法。
MAC(Message Authentication Code,消息认证码算法)是含有密钥的散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加入了密钥。日次,我们也常把MAC称为HMAC(keyed-Hash Message Authentication Code)。
MAC算法主要集合了MD和SHA两大系列消息摘要算法。MD系列的算法有HmacMD2、HmacMD4、HmacMD5三种算法;SHA系列的算法有HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384.HmacSHA512五种算法。
经过MAC算法得到的摘要值也可以使用十六进制编码表示,其摘要值长度与参与实现的摘要值长度相同。例如,HmacSHA1算法得到的摘要长度就是SHA1算法得到的摘要长度,都是160位二进制码,换算成十六进制编码为40位。
二、实现和应用
1、Sun的实现和应用
在java6中,MAC系列算法需要通过Mac类提供支持。java6中仅仅提供HmacMD5、HmacSHA1、HmacSHA256、HmacSHA384和HmacSHA512四种算法。
Mac算法是带有密钥的消息摘要算法,所以实现起来要分为两步:
1)、构建密钥
2)、执行消息摘要
[java] view plaincopyprint?
1. package com.tao.test;
2.
3. import java.security.NoSuchAlgorithmException;
4.
5. import javax.crypto.KeyGenerator;
6. import javax.crypto.Mac;
7. import javax.crypto.SecretKey;
8. import javax.crypto.spec.SecretKeySpec;
9. import javax.xml.bind.annotation.adapters.HexBinaryAdapter;
10.
11. /**
12. * MAC算法工具类
13. * 对于HmacMD5、HmacSHA1、HmacSHA256、HmacSHA384、HmacSHA512应用的步骤都是一模一样的。具体看下面的代码
14. */
15. class MACCoder {
16. /**
17. * 产生HmacMD5摘要算法的密钥
18. */
19. public static byte[] initHmacMD5Key() throws NoSuchAlgorithmException {
20. // 初始化HmacMD5摘要算法的密钥产生器
21. KeyGenerator generator = KeyGenerator.getInstance("HmacMD5");
22. // 产生密钥
23. SecretKey secretKey = generator.generateKey();
24. // 获得密钥
25. byte[] key = secretKey.getEncoded();
26. return key;
27. }
28.
29. /**
30. * HmacMd5摘要算法
31. * 对于给定生成的不同密钥,得到的摘要消息会不同,所以在实际应用中,要保存我们的密钥
32. */
33. public static String encodeHmacMD5(byte[] data, byte[] key) throws Exception {
34. // 还原密钥
35. SecretKey secretKey = new SecretKeySpec(key, "HmacMD5");
36. // 实例化Mac
37. Mac mac = Mac.getInstance(secretKey.getAlgorithm());
38. //初始化mac
39. mac.init(secretKey);
40. //执行消息摘要
41. byte[] digest = mac.doFinal(data);
42. return new HexBinaryAdapter().marshal(digest);//转为十六进制的字符串
43. }
44.
45.
46. /**
47. * 产生HmacSHA1摘要算法的密钥www.zzzyk.com
48. */
49. public static byte[] initHmacSHAKey() throws NoSuchAlgorithmException {
50. // 初始化HmacMD5摘要算法的密钥产生器
51. KeyGenerator generator = KeyGenerator.getInstance("HmacSHA1");
52. // 产生密钥
53. SecretKey secretKey = generator.generateKey();
54. // 获得密钥
55. byte[] key = secretKey.getEncoded();
56. return key;
57. }
58.
59. /**
60. * HmacSHA1摘要算法
61. * 对于给定生成的不同密钥,得到的摘要消息会不同,所以在实际应用中,要保存我们的密钥
62. */
63. public static String encodeHmacSHA(byte[] data, byte[] key) throws Exception {
64. // 还原密钥
65. SecretKey secretKey = new SecretKeySpec(key, "HmacSHA1");
66. // 实例化Mac
67. Mac mac = Mac.getInstance(secretKey.getAlgorithm());
68. //初始化mac
69. mac.init(secretKey);
70. //执行消息摘要
71. byte[] digest = mac.doFinal(data);
72. return new HexBinaryAdapter().marshal(digest);//转为十六进制的字符串
73. }
74.
75.
76.
77. /**
78. * 产生HmacSHA256摘要算法的密钥
79. */
80. public static byte[] initHmacSHA256Key() throws NoSuchAlgorithmException {
81. // 初始化HmacMD5摘要算法的密钥产生器
82. KeyGenerator generator = KeyGenerator.getInstance("HmacSHA256");
83. // 产生密钥
84. SecretKey secretKey = generator.generateKey();
85. // 获得密钥
86. byte[] key = secretKey.getEncoded();
87. return key;
88. }
89.
90. /**
91. * HmacSHA1摘要算法
92. * 对于给定生成的不同密钥,得到的摘要消息会不同,所以在实际应用中,要保存我们的密钥
93. */
94. &
补充:综合编程 , 安全编程 ,