带有 OpenSSL 的 C 语言中的 HMAC-SHA256 - 如何获得正确的输出
HMAC-SHA256 in C with OpenSSL - how to get a correct output
这是我用来编码字符串的函数:
#include <openssl/evp.h>
#include <openssl/hmac.h>
unsigned char *mx_hmac_sha256(const void *key, int keylen,
const unsigned char *data, int datalen,
unsigned char *result, unsigned int *resultlen) {
return HMAC(EVP_sha256(), key, keylen, data, datalen, result, resultlen);
}
我是这样调用它并检查结果的:
char *key = strdup("security is awesome");
int keylen = strlen(key);
const unsigned char *data = (const unsigned char *)strdup("this is highly sensitive user data");
int datalen = strlen((char *)data);
unsigned char *result = NULL;
unsigned int resultlen = -1;
result = mx_hmac_sha256((const void *)key, keylen, data, datalen, result, &resultlen);
for (unsigned int i = 0; i < resultlen; i++)
printf("%c", result[i]);
printf("\n");
for (unsigned int i = 0; i < resultlen; i++)
printf("%u ", result[i]);
printf("\nencrypted: %s len = %d\n", result, resultlen);
这是我得到的输出(垃圾):
�����չm�yk'�HH�T�,|�q��_��
204 219 230 247 135 213 185 109 186 121 107 39 234 72 72 17 234 84 229 44 124 242 113 241 172 190 199 95 205 201 16 18
encrypted: �����չm�yk'�HH�T�,|�q��_��. len = 32
这是我将相同的字符串输入在线 HMAC 生成器时得到的哈希值:
ccdbe6f787d5b96dba796b27ea484811ea54e52c7cf271f1acbec75fcdc91012
我正在努力找出哪里出了问题。我使用的 mx_hmac_sha256 函数是从 Whosebug 复制粘贴的,我检查了 OpenSSL 文档,他们建议使用完全相同的函数,但没有提供更多指导。我是否错误地传递了变量?为什么关键参数的类型是const void *,难道不是字符串吗?也许 strdup 或 strlen 不适用于 unsigned char *?我是否以错误的方式解释输出?我怀疑问题是我错误地处理了 unsigned char * 字符串,但我以前从未处理过它们,也不知道在哪里寻找错误。非常欢迎任何建议
您得到了相同的结果,您只是将其打印为小数,而在线工具输出的是十六进制。
204 十进制是十六进制的 CC,219 是 DB 等等
尝试
for (unsigned int i = 0; i < resultlen; i++){
printf("%02hhX", result[i]); // or just "%02X" if you are not using C11 or later
}
相反。
这是我用来编码字符串的函数:
#include <openssl/evp.h>
#include <openssl/hmac.h>
unsigned char *mx_hmac_sha256(const void *key, int keylen,
const unsigned char *data, int datalen,
unsigned char *result, unsigned int *resultlen) {
return HMAC(EVP_sha256(), key, keylen, data, datalen, result, resultlen);
}
我是这样调用它并检查结果的:
char *key = strdup("security is awesome");
int keylen = strlen(key);
const unsigned char *data = (const unsigned char *)strdup("this is highly sensitive user data");
int datalen = strlen((char *)data);
unsigned char *result = NULL;
unsigned int resultlen = -1;
result = mx_hmac_sha256((const void *)key, keylen, data, datalen, result, &resultlen);
for (unsigned int i = 0; i < resultlen; i++)
printf("%c", result[i]);
printf("\n");
for (unsigned int i = 0; i < resultlen; i++)
printf("%u ", result[i]);
printf("\nencrypted: %s len = %d\n", result, resultlen);
这是我得到的输出(垃圾):
�����չm�yk'�HH�T�,|�q��_��
204 219 230 247 135 213 185 109 186 121 107 39 234 72 72 17 234 84 229 44 124 242 113 241 172 190 199 95 205 201 16 18
encrypted: �����չm�yk'�HH�T�,|�q��_��. len = 32
这是我将相同的字符串输入在线 HMAC 生成器时得到的哈希值:
ccdbe6f787d5b96dba796b27ea484811ea54e52c7cf271f1acbec75fcdc91012
我正在努力找出哪里出了问题。我使用的 mx_hmac_sha256 函数是从 Whosebug 复制粘贴的,我检查了 OpenSSL 文档,他们建议使用完全相同的函数,但没有提供更多指导。我是否错误地传递了变量?为什么关键参数的类型是const void *,难道不是字符串吗?也许 strdup 或 strlen 不适用于 unsigned char *?我是否以错误的方式解释输出?我怀疑问题是我错误地处理了 unsigned char * 字符串,但我以前从未处理过它们,也不知道在哪里寻找错误。非常欢迎任何建议
您得到了相同的结果,您只是将其打印为小数,而在线工具输出的是十六进制。
204 十进制是十六进制的 CC,219 是 DB 等等
尝试
for (unsigned int i = 0; i < resultlen; i++){
printf("%02hhX", result[i]); // or just "%02X" if you are not using C11 or later
}
相反。