【问题标题】:HMAC_Init_ex Corrupting Stack SpaceHMAC_Init_ex 破坏堆栈空间
【发布时间】: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_initHMAC_Init_ex 的返回值。
  • @ooga 他们都是无效的。抱歉,我忘了说我正在使用 Xcode 来构建它。我不知道如何检查编译命令,如果有的话。
  • 我在HMAC_CTX_init 之后检查了ctx,并没有什么奇怪的地方,但我不知道它应该是什么样子。
  • 这很奇怪。我刚刚在 Xcode 5.1.1 中构建并运行了 this sample。 Fwiw 您的代码末尾的“null-termination”是完全错误的(它的消息摘要;它不会产生 asci 字符串;您必须从字节中 make 一个作为链接样本显示),但我看不出这与您的问题有什么关系。
  • @WhozCraig 我尝试了一个不同的库函数,并且成功了……是的,我现在意识到我需要自己将它转换为字符串。 Facebook 不太喜欢我的哈希令牌!

标签: c macos openssl


【解决方案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);

【讨论】:

  • 感谢您对引擎的更正,但添加这两行后,我仍然遇到同样的问题。
【解决方案2】:

使用 [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

【讨论】:

    猜你喜欢
    • 2018-05-23
    • 2011-04-21
    • 2011-11-01
    • 2011-01-06
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多