【发布时间】:2014-06-08 01:08:12
【问题描述】:
我正在尝试使用 OpenSSL 的 HMAC 函数创建带有密钥的 SHA256 哈希。在我调用 HMAC_Init_ex 之后,我的堆栈不断损坏(每个值都设置为 0)。我正在使用 Xcode 并运行 OS X 10.8.5。在我的终端中运行“openssl version”输出“OpenSSL 0.9.8y 5 Feb 2013”。
这是我的函数和我所有的#includes:
#include <stdio.h>
#include <openssl/hmac.h>
char* hash(char *str, char* key){
int inputLen = strlen(str);
int keyLen = strlen(key);
HMAC_CTX ctx;
HMAC_CTX_init(&ctx);
HMAC_Init_ex(&ctx, key, keyLen, EVP_sha256(), NULL); // Everything is fine up to here.
HMAC_Update(&ctx, str, inputLen); // By the time this line runs, str and key are NULL, and inputLen and keyLen are 0.
char* ret = malloc(65*sizeof(char));
HMAC_Final(&ctx, ret, 65);
HMAC_CTX_cleanup(&ctx);
ret[65] = '\0';
return ret;
}
此代码应该可以工作。它可能与我的图书馆有关,但我不知道是什么。导入库时我做错了吗?
更新:
我从here 中找到了一个使用完全封装的hmac 函数的示例,并说这与我之前所做的基本相同,而且奇怪的是,它有效。所以我已经绕过了我的问题,但你仍然可以回答,以防它帮助别人。除了我的图书馆可能有一些奇怪的特定问题。工作函数:
char* hash(char *str, char* key){
int inputLen = strlen(str);
int keyLen = strlen(key);
unsigned int retLen = 65;
char* ret = emalloc(retLen*sizeof(char));
ret = HMAC(EVP_sha256(), key, keyLen, (unsigned char*)str, inputLen, NULL, NULL);
return ret;
}
【问题讨论】:
-
你的编译命令是什么?另外,检查
HMAC_CTX_init和HMAC_Init_ex的返回值。 -
@ooga 他们都是无效的。抱歉,我忘了说我正在使用 Xcode 来构建它。我不知道如何检查编译命令,如果有的话。
-
我在
HMAC_CTX_init之后检查了ctx,并没有什么奇怪的地方,但我不知道它应该是什么样子。 -
这很奇怪。我刚刚在 Xcode 5.1.1 中构建并运行了 this sample。 Fwiw 您的代码末尾的“null-termination”是完全错误的(它的消息摘要;它不会产生 asci 字符串;您必须从字节中 make 一个作为链接样本显示),但我看不出这与您的问题有什么关系。
-
@WhozCraig 我尝试了一个不同的库函数,并且成功了……是的,我现在意识到我需要自己将它转换为字符串。 Facebook 不太喜欢我的哈希令牌!