HMAC-SHA256 in C with OpenSSL - 如何获得正确的输出

Yul*_*lia 9 c encryption openssl cryptography hmac

这是我用来编码字符串的函数:

\n\n
#include <openssl/evp.h>\n#include <openssl/hmac.h>\n\nunsigned char *mx_hmac_sha256(const void *key, int keylen,\n                              const unsigned char *data, int datalen,\n                              unsigned char *result, unsigned int *resultlen) {\n    return HMAC(EVP_sha256(), key, keylen, data, datalen, result, resultlen);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我如何调用它并检查结果:

\n\n
char *key = strdup("security is awesome");\nint keylen = strlen(key);\nconst unsigned char *data = (const unsigned char *)strdup("this is highly sensitive user data");\nint datalen = strlen((char *)data);\nunsigned char *result = NULL;\nunsigned int resultlen = -1;\n\nresult = mx_hmac_sha256((const void *)key, keylen, data, datalen, result, &resultlen);\n\nfor (unsigned int i = 0; i < resultlen; i++) \n    printf("%c", result[i]);\n\nprintf("\\n");\nfor (unsigned int i = 0; i < resultlen; i++) \n    printf("%u ", result[i]);\n\nprintf("\\nencrypted: %s   len = %d\\n", result, resultlen);\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我得到的输出(垃圾):

\n\n
\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xd5\xb9m\xef\xbf\xbdyk\'\xef\xbf\xbdHH\xef\xbf\xbdT\xef\xbf\xbd,|\xef\xbf\xbdq\xef\xbf\xbd\xef\xbf\xbd_\xef\xbf\xbd\xef\xbf\xbd\n204 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 \nencrypted: \xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xd5\xb9m\xef\xbf\xbdyk\'\xef\xbf\xbdHH\xef\xbf\xbdT\xef\xbf\xbd,|\xef\xbf\xbdq\xef\xbf\xbd\xef\xbf\xbd_\xef\xbf\xbd\xef\xbf\xbd.  len = 32\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是当我将相同的字符串输入在线 HMAC 生成器时得到的哈希值:

\n\n
ccdbe6f787d5b96dba796b27ea484811ea54e52c7cf271f1acbec75fcdc91012\n
Run Code Online (Sandbox Code Playgroud)\n\n

在线生成 HMAC-SHA256

\n\n

我正在努力找出问题出在哪里。我使用的 mx_hmac_sha256 函数是从 StackOverflow 复制粘贴的,我检查了 OpenSSL 文档,他们建议了完全相同的函数,但没有提供更多指导。我是否错误地传递了变量?为什么关键参数的类型是 const void *,它不是一个字符串吗?也许 strdup 或 strlen 不适用于 unsigned char *?我是否以错误的方式解释输出?我怀疑问题在于我错误地处理了 unsigned char * 字符串,但我以前从未处理过它们,也不知道在哪里寻找错误。任何建议都非常欢迎

\n

Ras*_*ber 9

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

十进制的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
}
Run Code Online (Sandbox Code Playgroud)

反而。