Mountain lion 上的 HMAC OSX 10.8.3 EXC_CRASH
HMAC on Mountain lion OSX 10.8.3 EXC_CRASH
使用 OpenSSL 的 HMAC 函数寻求一些帮助。目前此功能在 HMAC 调用上失败。仅限 OSX。 linux 和 windows os 都工作正常。
QString tradingDialog::HMAC_SHA512_SIGNER(QString UrlToSign, QString Secret){
QString retval = "";
QByteArray byteArray = UrlToSign.toUtf8();
const char* URL = byteArray.constData();
QByteArray byteArrayB = Secret.toUtf8();
const char* Secretkey = byteArrayB.constData();
const EVP_MD *md = EVP_sha512();
unsigned char* digest = NULL;
// Be careful of the length of string with the choosen hash engine. SHA1 produces a 20-byte hash value which rendered as 40 characters.
// Change the length accordingly with your choosen hash engine
char mdString[129] = { 0 };
// Using sha512 hash engine here.
digest = HMAC(md, Secretkey, strlen( Secretkey), (unsigned char*) URL, strlen( URL), NULL, NULL);
for(int i = 0; i < 64; i++){
sprintf(&mdString[i*2], "%02x", (unsigned int)digest[i]);
}
retval = mdString;
return retval;
}
你没有说 osx 上的问题是什么,但看起来你不是 nul 终止 mdString
,所以尝试将其更改为
char mdString[129] = { 0 };
您链接到的崩溃日志显示您的应用正在中止,因为堆栈已损坏(我假设这发生在退出时)。
我会说最后的 sprintf
导致了这个,因为它在 mdString
数组的末尾后添加了一个空字节。试试上面的修改,看看是否有帮助。
这应该会在所有平台上崩溃,但我猜你有 "lucky"。
使用 OpenSSL 的 HMAC 函数寻求一些帮助。目前此功能在 HMAC 调用上失败。仅限 OSX。 linux 和 windows os 都工作正常。
QString tradingDialog::HMAC_SHA512_SIGNER(QString UrlToSign, QString Secret){
QString retval = "";
QByteArray byteArray = UrlToSign.toUtf8();
const char* URL = byteArray.constData();
QByteArray byteArrayB = Secret.toUtf8();
const char* Secretkey = byteArrayB.constData();
const EVP_MD *md = EVP_sha512();
unsigned char* digest = NULL;
// Be careful of the length of string with the choosen hash engine. SHA1 produces a 20-byte hash value which rendered as 40 characters.
// Change the length accordingly with your choosen hash engine
char mdString[129] = { 0 };
// Using sha512 hash engine here.
digest = HMAC(md, Secretkey, strlen( Secretkey), (unsigned char*) URL, strlen( URL), NULL, NULL);
for(int i = 0; i < 64; i++){
sprintf(&mdString[i*2], "%02x", (unsigned int)digest[i]);
}
retval = mdString;
return retval;
}
你没有说 osx 上的问题是什么,但看起来你不是 nul 终止 mdString
,所以尝试将其更改为
char mdString[129] = { 0 };
您链接到的崩溃日志显示您的应用正在中止,因为堆栈已损坏(我假设这发生在退出时)。
我会说最后的 sprintf
导致了这个,因为它在 mdString
数组的末尾后添加了一个空字节。试试上面的修改,看看是否有帮助。
这应该会在所有平台上崩溃,但我猜你有 "lucky"。