我试图使用OpenSSL& amp;生成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);
}
}
生成的哈希值不正确。我希望得到一些反馈,或者有人指出我正确的方向。
答案 0 :(得分:5)
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);
通过这种修改,似乎工作正常。
答案 1 :(得分:-1)
如果你写的话,你可以让一体化的OpenSSL HMAC命令更整洁:
result = HMAC(EVP_md5(), key, sizeof(key)-1, data, sizeof(data)-1, NULL, NULL);
因为key
和data
是用字符串文字初始化的,所以两者的最后一个字符都是\0
。不应对此终止字符进行哈希处理。我们通过指定数组的大小减去最后一个char来跳过这个字符。
您可以从https://tools.ietf.org/html/rfc2202获取HMAC-MD5的其他测试向量。
答案 2 :(得分:-2)
使用
result = HMAC(EVP_md5(), key, strlen(key), data, strlen(data), NULL, NULL);
代替
result = HMAC(EVP_md5(), key, 32, data, 28, NULL, NULL);
通常适用于任何数据和键