【问题标题】:HMAC-SHA256 in C with OpenSSL - how to get a correct output带有 OpenSSL 的 C 语言中的 HMAC-SHA256 - 如何获得正确的输出
【发布时间】: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


【解决方案1】:

您得到相同的结果,您只是将其打印为十进制,而在线工具输出的是十六进制。

十进制的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
}

改为。

【讨论】:

  • 谢谢,您建议的 printf 语句无法编译,但 printf("%x", result[I]) 产生了预期的输出!
猜你喜欢
  • 2013-07-29
  • 2020-07-03
  • 2020-08-29
  • 2020-10-18
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-30
相关资源
最近更新 更多