繁体   English   中英

具有OpenSSL的MD5 HMAC

[英]MD5 HMAC With OpenSSL

我试图用OpenSSL生成MD5 HMAC,并且大部分代码都被借用了。 正在生成的hmac不正确:

#include <openssl/hmac.h>
#include <openssl/evp.h>
#include <syslog.h>
#include <string.h>

#include <openssl/engine.h>
#include <openssl/hmac.h>
#include <openssl/evp.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main() 
{
  unsigned char* key = (unsigned char*) "2012121220121212201212122012121220121212201212122012121220121212";
  unsigned char* data = (unsigned char*) "johndoejohndoejohndoejohndoejohndoejohndoejohndoejohndoejohndoejohndoejohndoejohndoe";
  unsigned char* expected = (unsigned char*) "abcd1d87dca34f334786307d0da4fcbd";
  unsigned char* result;
  // unsigned int result_len = 16;
  unsigned int result_len = 16;
  int i;
  static char res_hexstring[32];

  // result = HMAC(EVP_sha256(), key, 4, data, 28, NULL, NULL);
  result = HMAC(EVP_md5(), key, 32, data, 28, NULL, NULL);
  for (i = 0; i < result_len; i++) {
    sprintf(&(res_hexstring[i * 2]), "%02x", result[i]);
  }

  if (strcmp((char*) res_hexstring, (char*) expected) == 0) {
    printf("Test ok, result length %d\n", result_len);
  } else {
    printf("Got %s instead of %s\n", res_hexstring, expected);
  }
}

产生的哈希不正确。 我会很高兴收到一些反馈或有人向我指出正确的方向。

HMAC的第三个和第五个参数是错误的。 您必须传递密钥的长度和数据的长度。 在您的示例中,这分别是64和84,而不是32和28。

因此:

-    result = HMAC(EVP_md5(), key, 32, data, 28, NULL, NULL);                                                                                                                                                                         
+    result = HMAC(EVP_md5(), key, 64, data, 84, NULL, NULL); 

通过此修改,它似乎可以正常工作。

如果编写以下命令,则可以使多合一OpenSSL HMAC命令更整洁:

result = HMAC(EVP_md5(), key, sizeof(key)-1, data, sizeof(data)-1, NULL, NULL);

因为keydata是用字符串文字初始化的,所以两者的最后一个字符都是\\0 此终止符不应被散列。 我们通过指定数组的大小减去最后一个字符来跳过此字符。

您可以从https://tools.ietf.org/html/rfc2202获得HMAC-MD5的其他测试向量。

使用

result = HMAC(EVP_md5(), key, strlen(key), data, strlen(data), NULL, NULL);

代替

result = HMAC(EVP_md5(), key, 32, data, 28, NULL, NULL);

通常适用于任何数据密钥

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM