分享

HMAC

 vclyin 2009-12-21
1、定义
       定义HMAC需要一个加密用散列函数(表示为H,可以是MD5或者SHA-1)和一个密钥K。我们用B来表示数据块的字节数。(以上所提到的散列函数的分割数据块字长B=64),用L来表示散列函数的输出数据字节数(MD5中L=16,SHA-1中L=20)。鉴别密钥的长度可以是小于等于数据块字长的任何正整数值。应用程序中使用的密钥长度若是比B大,则首先用使用散列函数H作用于它,然后用H输出的L长度字符串作为在HMAC中实际使用的密钥。一般情况下,推荐的最小密钥K长度是L个字节。
 
2、算法
        我们将定义两个固定且不同的字符串ipad,opad:(‘i','o'标志内部与外部)
  ipad = the byte 0x36 重复 B 次。
  opad = the byte 0x5C 重复 B 次。
  计算‘text'的HMAC:
  HMAC =   H( K XOR opad, H(K XOR ipad, text))
  即为以下步骤:
  (1) 在密钥K后面添加0来创建一个字长为B的字符串。(例如,如果K的字长是20
  字节,B=64字节,则K后会加入44个零字节0x00)
  (2) 将上一步生成的B字长的字符串与ipad做异或运算。
  (3) 将数据流text填充至第二步的结果字符串中。
  (4) 用H作用于第三步生成的数据流。
  (5) 将第一步生成的B字长字符串与opad做异或运算。
  (6) 再将第四步的结果填充进第五步的结果中。
  (7) 用H作用于第六步生成的数据流,输出最终结果。
 
3、HMAC实现流程:
   1)声明HMAC设备上下文   HMAC_CTX ctx;
   2)初始化HMAC设备上下文   HMAC_Init();
      HMAC_Init()-->HMAC_CTX_init()
                 -->HMAC_Init_ex()
   3)哈希运算加密      HMAC_Update();
   4)输出MAC值     HMAC_Final();
   5)关闭HMAC设备上下文  HMAC_CTX_cleanup();
   unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len,const unsigned char *d, size_t n, unsigned char *md,unsigned int *md_len)
  {
              HMAC_CTX c;
              static unsigned char m[EVP_MAX_MD_SIZE];
              if (md == NULL) md=m;
              HMAC_CTX_init(&c);
              HMAC_Init(&c,key,key_len,evp_md);
              HMAC_Update(&c,d,n);
              HMAC_Final(&c,md,md_len);
              HMAC_CTX_cleanup(&c);
              return(md);
  }
  evp_md指明HMAC使用的摘要算法;
  key为秘密密钥指针地址;
  key_len为秘密密钥的长度;
  d为需要做HMAC运算的数据指针地址;
  n为d的长度;
  md用于存放HMAC值;
  md_len为HMAC值的长度。
  HMAC进行哈希运算时是使用一个公共的随机数进行哈希运算,通过S/C双方进行SSL通信时,会建立一个session会话,每次通信都会随机生成一个master_key值,我们就可以很好利用这个master_key值进行哈希运算,提高了验证对方的完整性。
 
4、HMAC的典型应用
HMAC的一个典型应用是用在“挑战/响应”(Challenge/Response)身份认证中,认证流程如下[3]:
  (1) 先由客户端向服务器发出一个验证请求。
  (2) 服务器接到此请求后生成一个随机数并通过网络传输给客户端(此为挑战)。
  (3) 客户端将收到的随机数提供给ePass,由ePass使用该随机数与存储在ePass中的密钥进行HMAC-MD5运算并得到一个结果作为认证证据传给服务器(此为响应)。
  (4) 与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-MD5运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户。
 
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多