消息摘要算法-HMAC算法

来源:互联网 发布:gta5线上ae86改装数据 编辑:程序博客网 时间:2024/06/05 14:09

转载地址:http://blog.csdn.net/feiyangxiaomi/article/details/34445005

一、简述

  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系列算法支持表

 

算法摘要长度备注HmacMD5128BouncyCastle实现HmacSHA1160BouncyCastle实现HmacSHA256256BouncyCastle实现HmacSHA384384BouncyCastle实现HmacSHA512512JAVA6实现HmacMD2128BouncyCastle实现HmacMD4128BouncyCastle实现HmacSHA224224BouncyCastle实现

[java] view plain copy
  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.         //初始化密钥  
  376.         byte[] key3=HAMC.initHmacSHAKey();  
  377.         //获取摘要信息  
  378.         byte[] data3=HAMC.encodeHmacSHA(str.getBytes(), key3);  
  379.         String datahex3=new String(Hex.encode(data3));  
  380.         System.out.println("Bouncycastle HmacSHA1的密钥:"+key3.toString());  
  381.         System.out.println("Bouncycastle HmacSHA1算法摘要:"+data3.toString());  
  382.         System.out.println("Bouncycastle HmacSHA1算法摘要HEX:"+datahex3);  
  383.         System.out.println();  
  384.           
  385.           
  386.         //初始化密钥  
  387.         byte[] key4=HAMC.initHmacSHA384Key();  
  388.           
  389.         //获取摘要信息  
  390.         byte[] data4=HAMC.encodeHmacSHA384(str.getBytes(), key4);  
  391.         String datahex4=new String(Hex.encode(data4));  
  392.         System.out.println("Bouncycastle HmacSHA384的密钥:"+key4.toString());  
  393.         System.out.println("Bouncycastle HmacSHA384算法摘要:"+data4.toString());  
  394.         System.out.println("Bouncycastle HmacSHA384算法摘要HEX:"+datahex4);  
  395.         System.out.println();  
  396.           
  397.           
  398.         //初始化密钥  
  399.         byte[] key5=HAMC.initHmacSHA512Key();  
  400.         //获取摘要信息  
  401.         byte[] data5=HAMC.encodeHmacSHA512(str.getBytes(), key5);  
  402.         System.out.println("HmacSHA512的密钥:"+key5.toString());  
  403.         System.out.println("HmacSHA512算法摘要:"+data5.toString());  
  404.         System.out.println();  
  405.           
  406.         System.out.println("================以下的算法支持是bouncycastle支持的算法,sun java6不支持=======================");  
  407.         //初始化密钥  
  408.         byte[] key6=HAMC.initHmacMD2Key();  
  409.         //获取摘要信息  
  410.         byte[] data6=HAMC.encodeHmacMD2(str.getBytes(), key6);  
  411.         String datahex6=HAMC.encodeHmacMD2Hex(str.getBytes(), key6);  
  412.         System.out.println("Bouncycastle HmacMD2的密钥:"+key6.toString());  
  413.         System.out.println("Bouncycastle HmacMD2算法摘要:"+data6.toString());  
  414.         System.out.println("Bouncycastle HmacMD2Hex算法摘要:"+datahex6.toString());  
  415.         System.out.println();  
  416.           
  417.         //初始化密钥  
  418.         byte[] key7=HAMC.initHmacMD4Key();  
  419.         //获取摘要信息  
  420.         byte[] data7=HAMC.encodeHmacMD4(str.getBytes(), key7);  
  421.         String datahex7=HAMC.encodeHmacMD4Hex(str.getBytes(), key7);  
  422.         System.out.println("Bouncycastle HmacMD4的密钥:"+key7.toString());  
  423.         System.out.println("Bouncycastle HmacMD4算法摘要:"+data7.toString());  
  424.         System.out.println("Bouncycastle HmacMD4Hex算法摘要:"+datahex7.toString());  
  425.         System.out.println();  
  426.           
  427.         //初始化密钥  
  428.         byte[] key8=HAMC.initHmacSHA224Key();  
  429.         //获取摘要信息  
  430.         byte[] data8=HAMC.encodeHmacSHA224(str.getBytes(), key8);  
  431.         String datahex8=HAMC.encodeHmacSHA224Hex(str.getBytes(), key8);  
  432.         System.out.println("Bouncycastle HmacSHA224的密钥:"+key8.toString());  
  433.         System.out.println("Bouncycastle HmacSHA224算法摘要:"+data8.toString());  
  434.         System.out.println("Bouncycastle HmacSHA224算法摘要:"+datahex8.toString());  
  435.         System.out.println();  
  436.     }  
  437. }  
运行结果是
[java] view plain copy
  1. 原文:123000000000090989999999999999999999999999999999999999999999999999999999999999999999111230000000000909899999999999999999999999999999999999999999999999999999999999999999992300000000009098999999999999999999999999999999999999999999999999999999999999999999923000000000090989999999999999999999999999999999999999999999999999999999999999999999230000000000909899999999999999999999999999999999999999999999999999999999999999999992300000000009098999999999999999999999999999999999999999999999999999999999999999999923000000000090989999999999999999999999999999999999999999999999999999999999999999999230000000000909899999999999999999999999999999999999999999999999999999999999999999992300000000009098999999999999999999999999999999999999999999999999999999999999999999923000000000090989999999999999999999999999999999999999999999999999999999999999999999230000000000909899999999999999999999999999999999999999999999999999999999999999999992300000000009098999999999999999999999999999999999999999999999999999999999999999999923000000000090989999999999999999999999999999999999999999999999999999999999999999999230000000000909899999999999999999999999999999999999999999999999999999999999999999992300000000009098999999999999999999999999999999999999999999999999999999999999999999923000000000090989999999999999999999999999999999999999999999999999999999999999999999230000000000909899999999999999999999999999999999999999999999999999999999999999999991  
  2.   
  3. Bouncycastle HmacMD5的密钥内容和长度:[B@2fb212f0--64  
  4. Bouncycastle HmacMD5算法摘要:[B@53f96306  
  5. Bouncycastle HmacMD5算法摘要HEX:771093e83aeb659d125100fa465bd34e  
  6.   
  7. Bouncycastle HmacSHA256的密钥:[B@450b9338  
  8. Bouncycastle HmacSHA256算法摘要:[B@7aee64f1  
  9. Bouncycastle HmacSHA256算法摘要HEX:2d211a42cb3fb68cd36255f9af4ef614eea6c8b93634183d333bf3e6e0b79d87  
  10.   
  11. Bouncycastle HmacSHA1的密钥:[B@592bf469  
  12. Bouncycastle HmacSHA1算法摘要:[B@54bb473b  
  13. Bouncycastle HmacSHA1算法摘要HEX:c07963727b485cf6579d103a822382f3159bc6ee  
  14.   
  15. Bouncycastle HmacSHA384的密钥:[B@1527171d  
  16. Bouncycastle HmacSHA384算法摘要:[B@395e7bc4  
  17. Bouncycastle HmacSHA384算法摘要HEX:cae75e5a2ce20d18bf0862215896f8dbe060ac10806925fa5d2bb15cc983543a1d0e53743f1e84ee53ad7db128547cde  
  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的特点,任意的消息大小;固定的输出长度;

[java] view plain copy
  1. HmacMD5算法摘要HEX:771093e83aeb659d125100fa465bd34e//32*4=128位  
[java] view plain copy
  1. Bouncycastle HmacSHA1算法摘要HEX:c07963727b485cf6579d103a822382f3159bc6ee//40*4=160位  
[java] view plain copy
  1. Bouncycastle HmacSHA256算法摘要HEX:2d211a42cb3fb68cd36255f9af4ef614eea6c8b93634183d333bf3e6e0b79d87//64*4=256  


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

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

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


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

原创粉丝点击