一、简述

mac(Message Authentication Code。消息认证码算法)是含有密钥散列函数算法。兼容了MD和SHA算法的特性,并在此基础上加上了密钥。因此MAC算法也常常被称作HMAC算法。关于hmac算法的详情能够參看RFC 2104(http://www.ietf.org/rfc/rfc2104.txt)。这里包括了HmacMD5算法的C语言实现。

这里须要说明的是经过mac算法得到的摘要值也能够使用十六进制编码表示。其摘要值得长度与实现算法的摘要值长度同样。比如 HmacSHA算法得到的摘要长度就是SHA1算法得到的摘要长度,都是160位二进制数,换算成十六进制的编码为40位。

二、模型分析

甲乙两方进行数据交换能够採取例如以下流程完毕

1、甲方向乙方发布摘要算法(就是指定要使用的摘要算法名)

2、甲乙两方依照约定构造密钥,两方拥有同样的密钥(通常是一方构造密钥后通知另外一方,此过程不须要通过程序实现,就是两方约定个字符串,可是这个字符串可不是随便设定的,也是通过相关算法获取的)

3、甲方使用密钥对消息做摘要处理,然后将消息和生成的摘要消息一同发送给乙方

4、乙方收到消息后,使用甲方已经发布的摘要算法+约定好的密钥 对收到的消息进行摘要处理。然后比对自己的摘要消息和甲方发过来的摘要消息。

甄别消息是否是甲方发送过来的

三、MAC系列算法支持表

算法 摘要长度 备注
HmacMD5 128 BouncyCastle实现
HmacSHA1 160 BouncyCastle实现
HmacSHA256 256 BouncyCastle实现
HmacSHA384 384 BouncyCastle实现
HmacSHA512 512 JAVA6实现
HmacMD2 128 BouncyCastle实现
HmacMD4 128 BouncyCastle实现
HmacSHA224 224 BouncyCastle实现
  1. package com.main;
  2. import java.security.Security;
  3. import javax.crypto.KeyGenerator;
  4. import javax.crypto.Mac;
  5. import javax.crypto.SecretKey;
  6. import javax.crypto.spec.SecretKeySpec;
  7. import org.bouncycastle.jce.provider.BouncyCastleProvider;
  8. import org.bouncycastle.util.encoders.Hex;
  9. /**
  10. * MAC消息摘要组件
  11. * @author kongqz
  12. * */
  13. public class HAMC {
  14. ///////////////////////////HmacMD5///////////////////////////////
  15. /**
  16. * 初始化HmacMD5的密钥
  17. * @return byte[] 密钥
  18. *
  19. * */
  20. public static byte[] initHmacMD5Key() throws Exception{
  21. //增加BouncyCastleProvider的支持
  22. Security.addProvider(new BouncyCastleProvider());
  23. //初始化KeyGenerator
  24. KeyGenerator keyGenerator=KeyGenerator.getInstance("HmacMD5");
  25. //产生密钥
  26. SecretKey secretKey=keyGenerator.generateKey();
  27. //获取密钥
  28. return secretKey.getEncoded();
  29. }
  30. /**
  31. * HmacMD5消息摘要
  32. * @param data 待做摘要处理的数据
  33. * @param key 密钥
  34. * @return byte[] 消息摘要
  35. * */
  36. public static byte[] encodeHmacMD5(byte[] data,byte[] key) throws Exception{
  37. //增加BouncyCastleProvider的支持
  38. Security.addProvider(new BouncyCastleProvider());
  39. //还原密钥,由于密钥是以byte形式为消息传递算法所拥有
  40. SecretKey secretKey=new SecretKeySpec(key,"HmacMD5");
  41. //实例化Mac
  42. Mac mac=Mac.getInstance(secretKey.getAlgorithm());
  43. //初始化Mac
  44. mac.init(secretKey);
  45. //运行消息摘要处理
  46. return mac.doFinal(data);
  47. }
  48. /**
  49. * HmacMD2Hex消息摘要
  50. * @param data 待做消息摘要处理的数据
  51. * @param String 密钥
  52. * @return byte[] 消息摘要
  53. * */
  54. public static String encodeHmacMD5Hex(byte[] data,byte[] key) throws Exception{
  55. //运行消息摘要处理
  56. byte[] b=encodeHmacMD5(data,key);
  57. //做十六进制转换
  58. return new String(Hex.encode(b));
  59. }
  60.  
  61. ///////////////////////////////HmacSHA1//////////////////////////////////
  62. /**
  63. * 初始化HmacSHA1的密钥
  64. * @return byte[] 密钥
  65. *
  66. * */
  67. public static byte[] initHmacSHAKey() throws Exception{
  68. //初始化KeyGenerator
  69. KeyGenerator keyGenerator=KeyGenerator.getInstance("HmacSHA1");
  70. //产生密钥
  71. SecretKey secretKey=keyGenerator.generateKey();
  72. //获取密钥
  73. return secretKey.getEncoded();
  74. }
  75. /**
  76. * HmacSHA1消息摘要
  77. * @param data 待做摘要处理的数据
  78. * @param key 密钥
  79. * @return byte[] 消息摘要
  80. * */
  81. public static byte[] encodeHmacSHA(byte[] data,byte[] key) throws Exception{
  82. //还原密钥,由于密钥是以byte形式为消息传递算法所拥有
  83. SecretKey secretKey=new SecretKeySpec(key,"HmacSHA1");
  84. //实例化Mac
  85. Mac mac=Mac.getInstance(secretKey.getAlgorithm());
  86. //初始化Mac
  87. mac.init(secretKey);
  88. //运行消息摘要处理
  89. return mac.doFinal(data);
  90. }
  91.  
  92. ///////////////////////////////HmacSHA256//////////////////////////////////
  93. /**
  94. * 初始化HmacSHA256的密钥
  95. * @return byte[] 密钥
  96. *
  97. * */
  98. public static byte[] initHmacSHA256Key() throws Exception{
  99. Security.addProvider(new BouncyCastleProvider());
  100. //初始化KeyGenerator
  101. KeyGenerator keyGenerator=KeyGenerator.getInstance("HmacSHA256");
  102. //产生密钥
  103. SecretKey secretKey=keyGenerator.generateKey();
  104. //获取密钥
  105. return secretKey.getEncoded();
  106. }
  107. /**
  108. * HmacSHA256消息摘要
  109. * @param data 待做摘要处理的数据
  110. * @param key 密钥
  111. * @return byte[] 消息摘要
  112. * */
  113. public static byte[] encodeHmacSHA256(byte[] data,byte[] key) throws Exception{
  114. //增加BouncyCastleProvider的支持
  115. Security.addProvider(new BouncyCastleProvider());
  116. //还原密钥,由于密钥是以byte形式为消息传递算法所拥有
  117. SecretKey secretKey=new SecretKeySpec(key,"HmacSHA256");
  118. //实例化Mac
  119. Mac mac=Mac.getInstance(secretKey.getAlgorithm());
  120. //初始化Mac
  121. mac.init(secretKey);
  122. //运行消息摘要处理
  123. return mac.doFinal(data);
  124. }
  125.  
  126. ///////////////////////////////HmacSHA384//////////////////////////////////
  127. /**
  128. * 初始化HmacSHA384的密钥
  129. * @return byte[] 密钥
  130. *
  131. * */
  132. public static byte[] initHmacSHA384Key() throws Exception{
  133. Security.addProvider(new BouncyCastleProvider());
  134. //初始化KeyGenerator
  135. KeyGenerator keyGenerator=KeyGenerator.getInstance("HmacSHA384");
  136. //产生密钥
  137. SecretKey secretKey=keyGenerator.generateKey();
  138. //获取密钥
  139. return secretKey.getEncoded();
  140. }
  141. /**
  142. * HmacSHA384消息摘要
  143. * @param data 待做摘要处理的数据
  144. * @param key 密钥
  145. * @return byte[] 消息摘要
  146. * */
  147. public static byte[] encodeHmacSHA384(byte[] data,byte[] key) throws Exception{
  148. Security.addProvider(new BouncyCastleProvider());
  149. //还原密钥,由于密钥是以byte形式为消息传递算法所拥有
  150. SecretKey secretKey=new SecretKeySpec(key,"HmacSHA384");
  151. //实例化Mac
  152. Mac mac=Mac.getInstance(secretKey.getAlgorithm());
  153. //初始化Mac
  154. mac.init(secretKey);
  155. //运行消息摘要处理
  156. return mac.doFinal(data);
  157. }
  158.  
  159. ///////////////////////////////HmacSHA512//////////////////////////////////
  160. /**
  161. * 初始化HmacSHA512的密钥
  162. * @return byte[] 密钥
  163. *
  164. * */
  165. public static byte[] initHmacSHA512Key() throws Exception{
  166. //初始化KeyGenerator
  167. KeyGenerator keyGenerator=KeyGenerator.getInstance("HmacSHA512");
  168. //产生密钥
  169. SecretKey secretKey=keyGenerator.generateKey();
  170. //获取密钥
  171. return secretKey.getEncoded();
  172. }
  173. /**
  174. * HmacSHA512消息摘要
  175. * @param data 待做摘要处理的数据
  176. * @param key 密钥
  177. * @return byte[] 消息摘要
  178. * */
  179. public static byte[] encodeHmacSHA512(byte[] data,byte[] key) throws Exception{
  180. //还原密钥。由于密钥是以byte形式为消息传递算法所拥有
  181. SecretKey secretKey=new SecretKeySpec(key,"HmacSHA512");
  182. //实例化Mac
  183. Mac mac=Mac.getInstance(secretKey.getAlgorithm());
  184. //初始化Mac
  185. mac.init(secretKey);
  186. //运行消息摘要处理
  187. return mac.doFinal(data);
  188. }
  189. ///////////////////////////////HmacMD2-BouncyCastle才支持的实现//////////////////////////////////
  190. /**
  191. * 初始化HmacMD2的密钥
  192. * @return byte[] 密钥
  193. * */
  194. public static byte[] initHmacMD2Key() throws Exception{
  195.  
  196. //增加BouncyCastleProvider的支持
  197. Security.addProvider(new BouncyCastleProvider());
  198. //初始化KeyGenerator
  199. KeyGenerator keyGenerator=KeyGenerator.getInstance("HmacMD2");
  200. //产生密钥
  201. SecretKey secretKey=keyGenerator.generateKey();
  202. //获取密钥
  203. return secretKey.getEncoded();
  204. }
  205. /**
  206. * HmacMD2消息摘要
  207. * @param data 待做摘要处理的数据
  208. * @param key 密钥
  209. * @return byte[] 消息摘要
  210. * */
  211. public static byte[] encodeHmacMD2(byte[] data,byte[] key) throws Exception{
  212. //增加BouncyCastleProvider的支持
  213. Security.addProvider(new BouncyCastleProvider());
  214. //还原密钥,由于密钥是以byte形式为消息传递算法所拥有
  215. SecretKey secretKey=new SecretKeySpec(key,"HmacMD2");
  216. //实例化Mac
  217. Mac mac=Mac.getInstance(secretKey.getAlgorithm());
  218. //初始化Mac
  219. mac.init(secretKey);
  220. //运行消息摘要处理
  221. return mac.doFinal(data);
  222. }
  223. /**
  224. * HmacMD2Hex消息摘要
  225. * @param data 待做消息摘要处理的数据
  226. * @param String 密钥
  227. * @return byte[] 消息摘要
  228. * */
  229. public static String encodeHmacMD2Hex(byte[] data,byte[] key) throws Exception{
  230. //运行消息摘要处理
  231. byte[] b=encodeHmacMD2(data,key);
  232. //做十六进制转换
  233. return new String(Hex.encode(b));
  234. }
  235.  
  236. ///////////////////////////////HmacMD4-BouncyCastle才支持的实现//////////////////////////////////
  237. /**
  238. * 初始化HmacMD2的密钥
  239. * @return byte[] 密钥
  240. * */
  241. public static byte[] initHmacMD4Key() throws Exception{
  242.  
  243. //增加BouncyCastleProvider的支持
  244. Security.addProvider(new BouncyCastleProvider());
  245. //初始化KeyGenerator
  246. KeyGenerator keyGenerator=KeyGenerator.getInstance("HmacMD4");
  247. //产生密钥
  248. SecretKey secretKey=keyGenerator.generateKey();
  249. //获取密钥
  250. return secretKey.getEncoded();
  251. }
  252. /**
  253. * HmacMD4消息摘要
  254. * @param data 待做摘要处理的数据
  255. * @param key 密钥
  256. * @return byte[] 消息摘要
  257. * */
  258. public static byte[] encodeHmacMD4(byte[] data,byte[] key) throws Exception{
  259. //增加BouncyCastleProvider的支持
  260. Security.addProvider(new BouncyCastleProvider());
  261. //还原密钥,由于密钥是以byte形式为消息传递算法所拥有
  262. SecretKey secretKey=new SecretKeySpec(key,"HmacMD4");
  263. //实例化Mac
  264. Mac mac=Mac.getInstance(secretKey.getAlgorithm());
  265. //初始化Mac
  266. mac.init(secretKey);
  267. //运行消息摘要处理
  268. return mac.doFinal(data);
  269. }
  270. /**
  271. * HmacMD4Hex消息摘要
  272. * @param data 待做消息摘要处理的数据
  273. * @param String 密钥
  274. * @return byte[] 消息摘要
  275. * */
  276. public static String encodeHmacMD4Hex(byte[] data,byte[] key) throws Exception{
  277. //运行消息摘要处理
  278. byte[] b=encodeHmacMD4(data,key);
  279. //做十六进制转换
  280. return new String(Hex.encode(b));
  281. }
  282. ///////////////////////////////HmacSHA224-BouncyCastle才支持的实现//////////////////////////////////
  283. /**
  284. * 初始化HmacSHA224的密钥
  285. * @return byte[] 密钥
  286. * */
  287. public static byte[] initHmacSHA224Key() throws Exception{
  288.  
  289. //增加BouncyCastleProvider的支持
  290. Security.addProvider(new BouncyCastleProvider());
  291. //初始化KeyGenerator
  292. KeyGenerator keyGenerator=KeyGenerator.getInstance("HmacSHA224");
  293. //产生密钥
  294. SecretKey secretKey=keyGenerator.generateKey();
  295. //获取密钥
  296. return secretKey.getEncoded();
  297. }
  298. /**
  299. * HmacSHA224消息摘要
  300. * @param data 待做摘要处理的数据
  301. * @param key 密钥
  302. * @return byte[] 消息摘要
  303. * */
  304. public static byte[] encodeHmacSHA224(byte[] data,byte[] key) throws Exception{
  305. //增加BouncyCastleProvider的支持
  306. Security.addProvider(new BouncyCastleProvider());
  307. //还原密钥,由于密钥是以byte形式为消息传递算法所拥有
  308. SecretKey secretKey=new SecretKeySpec(key,"HmacSHA224");
  309. //实例化Mac
  310. Mac mac=Mac.getInstance(secretKey.getAlgorithm());
  311. //初始化Mac
  312. mac.init(secretKey);
  313. //运行消息摘要处理
  314. return mac.doFinal(data);
  315. }
  316. /**
  317. * HmacSHA224Hex消息摘要
  318. * @param data 待做消息摘要处理的数据
  319. * @param String 密钥
  320. * @return byte[] 消息摘要
  321. * */
  322. public static String encodeHmacSHA224Hex(byte[] data,byte[] key) throws Exception{
  323. //运行消息摘要处理
  324. byte[] b=encodeHmacSHA224(data,key);
  325. //做十六进制转换
  326. return new String(Hex.encode(b));
  327. }
  328. /**
  329. * 进行相关的摘要算法的处理展示
  330. * @throws Exception
  331. * **/
  332. public static void main(String[] args) throws Exception {
  333. String str="123000000000090989999999999999999999999999999999999999999999999999999999999999999999111" +
  334. "23000000000090989999999999999999999999999999999999999999999999999999999999999999999" +
  335. "23000000000090989999999999999999999999999999999999999999999999999999999999999999999" +
  336. "23000000000090989999999999999999999999999999999999999999999999999999999999999999999" +
  337. "23000000000090989999999999999999999999999999999999999999999999999999999999999999999" +
  338. "23000000000090989999999999999999999999999999999999999999999999999999999999999999999" +
  339. "23000000000090989999999999999999999999999999999999999999999999999999999999999999999" +
  340. "23000000000090989999999999999999999999999999999999999999999999999999999999999999999" +
  341. "23000000000090989999999999999999999999999999999999999999999999999999999999999999999" +
  342. "23000000000090989999999999999999999999999999999999999999999999999999999999999999999" +
  343. "23000000000090989999999999999999999999999999999999999999999999999999999999999999999" +
  344. "23000000000090989999999999999999999999999999999999999999999999999999999999999999999" +
  345. "23000000000090989999999999999999999999999999999999999999999999999999999999999999999" +
  346. "23000000000090989999999999999999999999999999999999999999999999999999999999999999999" +
  347. "23000000000090989999999999999999999999999999999999999999999999999999999999999999999" +
  348. "23000000000090989999999999999999999999999999999999999999999999999999999999999999999" +
  349. "230000000000909899999999999999999999999999999999999999999999999999999999999999999991";
  350. //初始化密钥
  351. byte[] key1=HAMC.initHmacMD5Key();
  352. //获取摘要信息
  353. byte[] data1=HAMC.encodeHmacMD5(str.getBytes(), key1);
  354. String datahex1=new String(Hex.encode(data1));
  355.  
  356. System.out.println("原文:"+str);
  357. System.out.println();
  358.  
  359. System.out.println("Bouncycastle HmacMD5的密钥内容和长度:"+key1.toString()+"--"+key1.length);
  360. System.out.println("Bouncycastle HmacMD5算法摘要:"+data1.toString());
  361. System.out.println("Bouncycastle HmacMD5算法摘要HEX:"+datahex1.toString());
  362. System.out.println();
  363.  
  364. //初始化密钥
  365. byte[] key2=HAMC.initHmacSHA256Key();
  366. //获取摘要信息
  367. byte[] data2=HAMC.encodeHmacSHA256(str.getBytes(), key2);
  368. String datahex2=new String(Hex.encode(data2));
  369. System.out.println("Bouncycastle HmacSHA256的密钥:"+key2.toString());
  370. System.out.println("Bouncycastle HmacSHA256算法摘要:"+data2.toString());
  371. System.out.println("Bouncycastle HmacSHA256算法摘要HEX:"+datahex2);
  372. System.out.println();
  373.  
  374. //初始化密钥
  375. byte[] key3=HAMC.initHmacSHAKey();
  376. //获取摘要信息
  377. byte[] data3=HAMC.encodeHmacSHA(str.getBytes(), key3);
  378. String datahex3=new String(Hex.encode(data3));
  379. System.out.println("Bouncycastle HmacSHA1的密钥:"+key3.toString());
  380. System.out.println("Bouncycastle HmacSHA1算法摘要:"+data3.toString());
  381. System.out.println("Bouncycastle HmacSHA1算法摘要HEX:"+datahex3);
  382. System.out.println();
  383.  
  384. //初始化密钥
  385. byte[] key4=HAMC.initHmacSHA384Key();
  386.  
  387. //获取摘要信息
  388. byte[] data4=HAMC.encodeHmacSHA384(str.getBytes(), key4);
  389. String datahex4=new String(Hex.encode(data4));
  390. System.out.println("Bouncycastle HmacSHA384的密钥:"+key4.toString());
  391. System.out.println("Bouncycastle HmacSHA384算法摘要:"+data4.toString());
  392. System.out.println("Bouncycastle HmacSHA384算法摘要HEX:"+datahex4);
  393. System.out.println();
  394.  
  395. //初始化密钥
  396. byte[] key5=HAMC.initHmacSHA512Key();
  397. //获取摘要信息
  398. byte[] data5=HAMC.encodeHmacSHA512(str.getBytes(), key5);
  399. System.out.println("HmacSHA512的密钥:"+key5.toString());
  400. System.out.println("HmacSHA512算法摘要:"+data5.toString());
  401. System.out.println();
  402.  
  403. System.out.println("================下面的算法支持是bouncycastle支持的算法,sun java6不支持=======================");
  404. //初始化密钥
  405. byte[] key6=HAMC.initHmacMD2Key();
  406. //获取摘要信息
  407. byte[] data6=HAMC.encodeHmacMD2(str.getBytes(), key6);
  408. String datahex6=HAMC.encodeHmacMD2Hex(str.getBytes(), key6);
  409. System.out.println("Bouncycastle HmacMD2的密钥:"+key6.toString());
  410. System.out.println("Bouncycastle HmacMD2算法摘要:"+data6.toString());
  411. System.out.println("Bouncycastle HmacMD2Hex算法摘要:"+datahex6.toString());
  412. System.out.println();
  413.  
  414. //初始化密钥
  415. byte[] key7=HAMC.initHmacMD4Key();
  416. //获取摘要信息
  417. byte[] data7=HAMC.encodeHmacMD4(str.getBytes(), key7);
  418. String datahex7=HAMC.encodeHmacMD4Hex(str.getBytes(), key7);
  419. System.out.println("Bouncycastle HmacMD4的密钥:"+key7.toString());
  420. System.out.println("Bouncycastle HmacMD4算法摘要:"+data7.toString());
  421. System.out.println("Bouncycastle HmacMD4Hex算法摘要:"+datahex7.toString());
  422. System.out.println();
  423.  
  424. //初始化密钥
  425. byte[] key8=HAMC.initHmacSHA224Key();
  426. //获取摘要信息
  427. byte[] data8=HAMC.encodeHmacSHA224(str.getBytes(), key8);
  428. String datahex8=HAMC.encodeHmacSHA224Hex(str.getBytes(), key8);
  429. System.out.println("Bouncycastle HmacSHA224的密钥:"+key8.toString());
  430. System.out.println("Bouncycastle HmacSHA224算法摘要:"+data8.toString());
  431. System.out.println("Bouncycastle HmacSHA224算法摘要:"+datahex8.toString());
  432. System.out.println();
  433. }
  434. }

运行结果是

  1. 原文:123000000000090989999999999999999999999999999999999999999999999999999999999999999999111230000000000909899999999999999999999999999999999999999999999999999999999999999999992300000000009098999999999999999999999999999999999999999999999999999999999999999999923000000000090989999999999999999999999999999999999999999999999999999999999999999999230000000000909899999999999999999999999999999999999999999999999999999999999999999992300000000009098999999999999999999999999999999999999999999999999999999999999999999923000000000090989999999999999999999999999999999999999999999999999999999999999999999230000000000909899999999999999999999999999999999999999999999999999999999999999999992300000000009098999999999999999999999999999999999999999999999999999999999999999999923000000000090989999999999999999999999999999999999999999999999999999999999999999999230000000000909899999999999999999999999999999999999999999999999999999999999999999992300000000009098999999999999999999999999999999999999999999999999999999999999999999923000000000090989999999999999999999999999999999999999999999999999999999999999999999230000000000909899999999999999999999999999999999999999999999999999999999999999999992300000000009098999999999999999999999999999999999999999999999999999999999999999999923000000000090989999999999999999999999999999999999999999999999999999999999999999999230000000000909899999999999999999999999999999999999999999999999999999999999999999991
  2.  
  3. Bouncycastle HmacMD5的密钥内容和长度:[B@2fb212f0--64
  4. Bouncycastle HmacMD5算法摘要:[B@53f96306
  5. Bouncycastle HmacMD5算法摘要HEX771093e83aeb659d125100fa465bd34e
  6.  
  7. Bouncycastle HmacSHA256的密钥:[B@450b9338
  8. Bouncycastle HmacSHA256算法摘要:[B@7aee64f1
  9. Bouncycastle HmacSHA256算法摘要HEX2d211a42cb3fb68cd36255f9af4ef614eea6c8b93634183d333bf3e6e0b79d87
  10.  
  11. Bouncycastle HmacSHA1的密钥:[B@592bf469
  12. Bouncycastle HmacSHA1算法摘要:[B@54bb473b
  13. Bouncycastle HmacSHA1算法摘要HEXc07963727b485cf6579d103a822382f3159bc6ee
  14.  
  15. Bouncycastle HmacSHA384的密钥:[B@1527171d
  16. Bouncycastle HmacSHA384算法摘要:[B@395e7bc4
  17. Bouncycastle HmacSHA384算法摘要HEXcae75e5a2ce20d18bf0862215896f8dbe060ac10806925fa5d2bb15cc983543a1d0e53743f1e84ee53ad7db128547cde
  18.  
  19. HmacSHA512的密钥:[B@5689a400
  20. HmacSHA512算法摘要:[B@666e2862
  21.  
  22. ================下面的算法支持是bouncycastle支持的算法。sun java6不支持=======================
  23. Bouncycastle HmacMD2的密钥:[B@fca1ca
  24. Bouncycastle HmacMD2算法摘要:[B@49e1d547
  25. Bouncycastle HmacMD2Hex算法摘要:2fad1ddef0a1d4d9e7bed45c4b714ae5
  26.  
  27. Bouncycastle HmacMD4的密钥:[B@2ebaa4a4
  28. Bouncycastle HmacMD4算法摘要:[B@5f8f22f3
  29. Bouncycastle HmacMD4Hex算法摘要:3f41ccbf594e0170f7073e8c756aa039
  30.  
  31. Bouncycastle HmacSHA224的密钥:[B@100a384
  32. Bouncycastle HmacSHA224算法摘要:[B@50ef2f9f
  33. Bouncycastle HmacSHA224算法摘要:f7d0e74f5c965f7981155206c05deccf0867e9cf348a1e9569b07353

执行结论是:

HMAC的特点。随意的消息大小。固定的输出长度。

  1. HmacMD5算法摘要HEX771093e83aeb659d125100fa465bd34e//32*4=128位
  1. Bouncycastle HmacSHA1算法摘要HEXc07963727b485cf6579d103a822382f3159bc6ee//40*4=160位
  1. Bouncycastle HmacSHA256算法摘要HEX2d211a42cb3fb68cd36255f9af4ef614eea6c8b93634183d333bf3e6e0b79d87//64*4=256

还有个问题就是。我们在使用HMAC的时候使用了hash函数而且增加了密钥key。那么这个key是怎么增加进去的?

A=[msg || key]还是B=[key || msg],前缀和后缀的做法。前缀不可缺。有前缀的攻击,參考《深入浅出password学——经常使用加密技术原理与应用》马小婷的。后缀也有一种构建冲突攻击參考《深入浅出password学——经常使用加密技术原理与应用》马小婷。

HMAC方案是由一个内部哈希和一个外部哈希组成。他是Mihir Bellare、Ran Canetti和Hugo Krawczyk于1996年提出的。最大的一个有点就是存在安全证明。

------------------------------------------结束线----------------------------------------------------------------------------

消息摘要算法-HMAC算法的更多相关文章

  1. 消息摘要算法-MAC算法系列

    一.简述 mac(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥.因此MAC算法也经常被称作HMA ...

  2. Apache Commons Codec 与消息摘要算法(hash算法)

    首先我们要明白 Codec 是什么含义.它是 Coder + decoder = Codec,也就是编码器解码器.即是编码器,也是解码器. 官网地址:http://commons.apache.org ...

  3. password学4——Java 加密解密之消息摘要算法(MD5 SHA MAC)

    Java 加密解密之消息摘要算法(MD5 SHA MAC) 消息摘要 消息摘要(Message Digest)又称为数字摘要(Digital Digest). 它是一个唯一相应一个消息或文本的固定长度 ...

  4. 第五章 消息摘要算法--MAC

    注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第6章“验证数据完整性--消息摘要算法” 5.1.mac(又称为Hmac) 原理:在md与sha系列算法的基础上加入了密钥,是 ...

  5. JAVA加解密 -- 消息摘要算法

    消息摘要算法是一种单向加密算法 主要用于验证数据完整性,也是数字签名的核心算法 消息鉴别:指在接收方将原始信息进行摘要,然后与接收到的摘要信息进行对比 a.MD家族 – MD5(128位摘要信息) M ...

  6. MD、SHA、MAC消息摘要算法实现与应用

    1.消息摘要概述 消息摘要(Message Digest)又称为数字摘要(Digital Digest).它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生 ...

  7. 信息加密之消息摘要算法的MAC

    MAC是消息摘要算法的第三种实现方式,另外两种方式分别为:MD2\4\5.SHA. MAC的jdk实现:1.默认密钥方式 private static void MAC_JDK(){ try { Ke ...

  8. MD5 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)

    MD5 编辑 Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护.该算法的文件号为RFC 1321( ...

  9. 浅析nodeJS中的Crypto模块,包括hash算法,HMAC算法,加密算法知识,SSL协议

    node.js的crypto在0.8版本,这个模块的主要功能是加密解密. node利用 OpenSSL库(https://www.openssl.org/source/)来实现它的加密技术, 这是因为 ...

随机推荐

  1. js身份证验证代码

    var idCardNoUtil = { provinceAndCitys: {11:"北京",12:"天津",13:"河北",14:&qu ...

  2. view动画库

    Android View Animations这个项目收集了各种有趣的动画效果. 所有效果: Attension Flash, Pulse, RubberBand, Shake, Swing, Wob ...

  3. Excel02-快速无误输入多个零

    第一步:设置单元格格式-->小数位数为0,货币符号为¥ 第二步:在单元格输入数据:1**5回车即显示为¥100,000 **N 表示后面有N个零,会自动加入我们设置的货币符号¥ 这对我们在输入巨 ...

  4. linux内存机制

    ~# free -m         total used  free shared buffers cachedMem: 16086 8579 7507    0      152      800 ...

  5. unity中数据的持久化存储

    unity 提供了PlayerPrefs这个类用于存储游戏数据到电脑硬盘中. 这个类有10个函数可以使用 Class Functions类函数 SetInt Sets the value of the ...

  6. php echo字符串的连接格式

    echo "<td align=\"center\"><img src=\""; 1.  \"    \" 2. ...

  7. php简单的爬虫

    爬虫的原理是分析下载的页面,找出其中的连接,然后再下载这些链接,对链接再进行更深层次的递归,周而复始.在数据存储方面,先存储到redis里面,再有redis 写入到mysql,这样可以减轻mysql写 ...

  8. 三星手机照相机出现了故障,htc无法连接无线网

    1 重启 2 若还不行,把内存卡,电池拿掉, 也可下载一个相机应用

  9. HTML&CSS基础学习笔记1.16-单元格间距和表格主体

    上一篇讲html学习笔记,讲过了合并单元格,那么今天就来介绍下如何控制单元格的间距,以及表格主体的相关知识. 单元格间距 在上个知识点的显示结果中你可能发现了,单元格与单元格之间有一小段空白.这是由& ...

  10. Regular expression cheat sheet

    \s white-space characters \S Non-white-space characters \d digital numbers \D non-digital numbers \w ...