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