我正在尝试使用OpenSSL的HMAC函数创建一个带密钥的SHA256哈希。在调用HMAC_Init_ex之后,我的堆栈不断被破坏(每个值设置为0)。我正在使用Xcode并运行OS X 10.8.5。在我的终端中运行“openssl version”输出“OpenSSL 0.9.8y 2013年2月5日”。
这是我的功能以及我的所有#include
:
#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;
}
答案 0 :(得分:1)
您错过了OpenSSL/Initialization。ENGINE或ssh配置为您提供了密码方法,摘要方法等。
#include <openssl/engine.h>
#include <openssl/hmac.h>
HMAC_CTX ctx;
result = (unsigned char*) malloc(sizeof(char) * result_len);
ENGINE_load_builtin_engines();
ENGINE_register_all_complete();
HMAC_CTX_init(&ctx);
HMAC_Init_ex(&ctx, key, 16, EVP_sha256(), NULL);
HMAC_Update(&ctx, data, 8);
HMAC_Final(&ctx, result, &result_len);
HMAC_CTX_cleanup(&ctx);
答案 1 :(得分:1)
使用[ssh -Version]获取openssl版本,当版本低于1.0.1e时,应使用HMAC_Init ...而不是HMAC_Init_ex ...
在1.0.1e版本中,像这样的HMAC实现
unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len,const unsigned char *d, size_t n, unsigned char *md,unsigned int *md_len)
{
HMAC_CTX c;
static unsigned char m[EVP_MAX_MD_SIZE];
if (md == NULL) md=m;
HMAC_CTX_init(&c);
if (!HMAC_Init(&c,key,key_len,evp_md))
goto err;
if (!HMAC_Update(&c,d,n))
goto err;
if (!HMAC_Final(&c,md,md_len))
goto err;
HMAC_CTX_cleanup(&c);
return md;
err:
return NULL;
}
您可以在openssl的更高版本中比较HMAC()API