HMAC_Init_ex损坏堆栈空间

HMAC_Init_ex损坏堆栈空间,c,macos,openssl,C,Macos,Openssl,我正在尝试使用OpenSSL的HMAC函数创建一个带有密钥的SHA256哈希。调用HMAC_Init_ex后,我的堆栈不断损坏(每个值都设置为0)。我正在使用Xcode并运行OS X 10.8.5。在我的终端中运行“openssl版本”将输出“openssl 0.9.8y 2013年2月5日” 这是我的函数和我所有的#includes: #include <stdio.h> #include <openssl/hmac.h> char* hash(char *str,

我正在尝试使用OpenSSL的HMAC函数创建一个带有密钥的SHA256哈希。调用HMAC_Init_ex后,我的堆栈不断损坏(每个值都设置为0)。我正在使用Xcode并运行OS X 10.8.5。在我的终端中运行“openssl版本”将输出“openssl 0.9.8y 2013年2月5日”

这是我的函数和我所有的
#include
s:

#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;
}
您错过了。引擎或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);
#包括
#包括
HMAC_CTX CTX;
结果=(无符号字符*)malloc(sizeof(字符)*结果长度);
发动机负载内置发动机();
发动机注册器全部完成();
HMAC_CTX_init(&CTX);
HMAC_Init_ex(&ctx,key,16,EVP_sha256(),NULL);
HMAC_更新(&ctx,数据,8);
HMAC_最终版(&ctx、结果和结果);
HMAC_CTX_清理(&CTX);

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

您的编译命令是什么?另外,检查
HMAC\u CTX\u init
HMAC\u init\u ex
@ooga的返回值,它们都是无效的。抱歉,我忘了说我正在使用Xcode构建这个。我不知道如何检查compile命令(如果有)。我在
HMAC\u ctx\u init
之后检查了
ctx
,没有什么奇怪的地方,但我不知道它应该是什么样子。这很奇怪。我刚刚在Xcode 5.1.1中构建并运行。Fwiw您的代码末尾的“空终止”是完全错误的(它的消息摘要;它不生成asci字符串;您必须从链接的示例所示的字节中生成一个),但我看不出这与您的问题有什么关系。@WhozCraig我尝试了另一个库函数,它工作了……是的,我现在意识到我需要自己把它转换成字符串。Facebook不太喜欢我的哈希令牌!谢谢你对引擎的修正,但是在添加了这两条线之后,我仍然有同样的问题。
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;
    }