【发布时间】:2020-06-18 19:43:55
【问题描述】:
这是我用来编码字符串的函数:
#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 函数是从 StackOverflow 复制粘贴的,我检查了 OpenSSL 文档,他们建议的函数完全相同,但没有提供更多指导。我是否错误地传递了变量?为什么 key 参数的类型是 const void *,它不应该是一个字符串吗?也许 strdup 或 strlen 不适用于 unsigned char *?我是否以错误的方式解释输出?我怀疑问题在于我错误地处理了 unsigned char * 字符串,但我以前从未处理过它们,也不知道在哪里寻找错误。任何建议都非常受欢迎????
【问题讨论】:
-
我知道这是一个老问题,但是为什么输出指针的结果和参数都有“结果”,参数不应该只是 NULL(为了清楚起见)吗?跨度>
标签: c encryption openssl cryptography hmac