MD5 HMAC与OpenSSL

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

#include  #include  #include  #include  #include  #include  #include  #include  #include  #include  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 。 不应对此终止字符进行哈希处理。 我们通过指定数组的大小减去最后一个char来跳过此字符。

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