当前位置:   article > 正文

HMAC MD5算法原理及用处_hmacmd5

hmacmd5

        MD5和SHA-1是一种HASH函数,又称杂凑函数,类似于指纹的应用。在网络安全协议中,杂凑函数用来处理电子签名,将冗长的签名文件压缩为一段独特的数字信息,像指纹鉴别身份一样保证原来数字签名文件的合法性和安全性。经过这些算法的处理,原始信息即使只更动一个字母,对应的压缩信息也会变为截然不同的“指纹”,这就保证了经过处理信息的唯一性。为电子商务等提供了数字认证的可能性。
而HMAC算法需要一个加密用散列函数(表示为H,可以是MD5或者SHA-1)和一个密钥K。我们用B来表示数据块的字节数。(以上所提到的散列函数的分割数据块字长B=64),用L来表示散列函数的输出数据字节数(MD5中L=16,SHA-1中L=20)。鉴别密钥的长度可以是小于等于数据块字长的任何正整数值。应用程序中使用的密钥长度若是比B大,则首先用使用散列函数H作用于它,然后用H输出的L长度字符串作为在HMAC中实际使用的密钥。一般情况下,推荐的最小密钥K长度是L个字节。

  我们将定义两个固定且不同的字符串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作用于第六步生成的数据流,输出最终结果

HMAC的典型应用

  HMAC的一个典型应用是用在“挑战/响应”(Challenge/Response)身份认证中,认证流程如下[3]:
   (1) 先由客户端向服务器发出一个验证请求。
   (2) 服务器接到此请求后生成一个随机数(text)并通过网络传输给客户端(此为挑战)。
   (3) 客户端将收到的随机数提供给ePass,由ePass使用该随机数(text)与存储在ePass中的密钥(K)进行HMAC-MD5运算并得到一个结果作为认证证据传给服务器(此为响应)。

   (4) 与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-MD5运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户

  1. /*
  2. ** Function: hmac_md5
  3. */
  4. void
  5. hmac_md5(text, text_len, key, key_len, digest)
  6. unsigned char* text; /* pointer to data stream */
  7. int text_len; /* length of data stream */
  8. unsigned char* key; /* pointer to authentication key */
  9. int key_len; /* length of authentication key */
  10. caddr_t digest; /* caller digest to be filled in */
  11. {
  12. MD5_CTX context;
  13. unsigned char k_ipad[65]; /* inner padding -
  14. * key XORd with ipad
  15. */
  16. unsigned char k_opad[65]; /* outer padding -
  17. * key XORd with opad
  18. */
  19. unsigned char tk[16];
  20. int i;
  21. /* if key is longer than 64 bytes reset it to key=MD5(key) */
  22. if (key_len > 64) {
  23. MD5_CTX tctx;
  24. MD5Init(&tctx);
  25. MD5Update(&tctx, key, key_len);
  26. MD5Final(tk, &tctx);
  27. key = tk;
  28. key_len = 16;
  29. }
  30. /*
  31. * the HMAC_MD5 transform looks like:
  32. *
  33. * MD5(K XOR opad, MD5(K XOR ipad, text))
  34. *
  35. * where K is an n byte key
  36. * ipad is the byte 0x36 repeated 64 times
  37. * opad is the byte 0x5c repeated 64 times
  38. * and text is the data being protected
  39. */
  40. /* start out by storing key in pads */
  41. bzero( k_ipad, sizeof k_ipad);
  42. bzero( k_opad, sizeof k_opad);
  43. bcopy( key, k_ipad, key_len);
  44. bcopy( key, k_opad, key_len);
  45. /* XOR key with ipad and opad values */
  46. for (i=0; i<64; i++) {
  47. k_ipad[i] ^= 0x36;
  48. k_opad[i] ^= 0x5c;
  49. }
  50. /*
  51. * perform inner MD5
  52. */
  53. MD5Init(&context); /* init context for 1st
  54. * pass */
  55. MD5Update(&context, k_ipad, 64) /* start with inner pad */
  56. MD5Update(&context, text, text_len); /* then text of datagram */
  57. MD5Final(digest, &context); /* finish up 1st pass */
  58. /*
  59. * perform outer MD5
  60. */
  61. MD5Init(&context); /* init context for 2nd
  62. * pass */
  63. MD5Update(&context, k_opad, 64); /* start with outer pad */
  64. MD5Update(&context, digest, 16); /* then results of 1st
  65. * hash */
  66. MD5Final(digest, &context); /* finish up 2nd pass */
  67. }
  68. Test Vectors (Trailing '\0' of a character string not included in test):
  69. key = 0x0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b
  70. key_len = 16 bytes
  71. data = "Hi There"
  72. data_len = 8 bytes
  73. digest = 0x9294727a3638bb1c13f48ef8158bfc9d
  74. key = "Jefe"
  75. data = "what do ya want for nothing?"
  76. data_len = 28 bytes
  77. digest = 0x750c783e6ab0b503eaa86e310a5db738
  78. key = 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  79. key_len 16 bytes
  80. data = 0xDDDDDDDDDDDDDDDDDDDD...
  81. ..DDDDDDDDDDDDDDDDDDDD...
  82. ..DDDDDDDDDDDDDDDDDDDD...
  83. ..DDDDDDDDDDDDDDDDDDDD...
  84. ..DDDDDDDDDDDDDDDDDDDD
  85. data_len = 50 bytes
  86. digest = 0x56be34521d144c88dbb8c733f0e8b3f6



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/447853
推荐阅读
相关标签
  

闽ICP备14008679号