HMAC_Init_ex破坏堆栈空间

时间:2014-06-08 01:08:12

标签: c macos openssl

我正在尝试使用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;
}

2 个答案:

答案 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