我正在尝试在C ++中使用openssl来使用HMAC-SHA256。
我正在使用python代码仔细检查我的输出,这似乎证明出现了问题......令人惊讶的是我能够使用HMAC-SHA384和HMAC-SHA512进行哈希(仍然使用我的python代码进行双重检查)
有人可以指出我做错了吗?
我的代码:
static std::vector<unsigned char> hmac_sha256(const std::vector<unsigned char>& data, const std::vector<unsigned char>& key)
{
unsigned int len = EVP_MAX_MD_SIZE;
std::vector<unsigned char> digest(len);
HMAC_CTX ctx;
HMAC_CTX_init(&ctx);
HMAC_Init_ex(&ctx, key.data(), key.size(), EVP_sha256(), NULL);
HMAC_Update(&ctx, data.data(), data.size());
HMAC_Final(&ctx, digest.data(), &len);
HMAC_CTX_cleanup(&ctx);
return digest;
}
我的HMAC-SHA384和HMAC-SHA512的实现与上述不同,分别通过EVP_sha384()和EVP_sha512()...来改变EVP_sha256()...
示例:message =“azertyAZERTY”,key =“vzxgPuegSjRksLnCAu / LElxWRonjVkCoArWzZqliiSEtmlbaCfZaGkrSweWJKQkgQsyrBUpSusAcPcGDfFhWOx ==”(在我的函数中使用之前,应对其进行b64解码)。
以下python实现
import json, hmac, hashlib, time, requests, base64 from requests.auth import AuthBase
message = "azertyAZERTY"
hmac_key = base64.b64decode("vzxgPuegSjRksLnCAu/LElxWRonjVkCoArWzZqliiSEtmlbaCfZaGkrSweWJKQkgQsyrBUpSusAcPcGDfFhWOx==")
signature256 = hmac.new(hmac_key, message, hashlib.sha256)
print('signature 256 : ' +
signature256.digest().encode('base64').rstrip('\n'))
signature384 = hmac.new(hmac_key, message, hashlib.sha384)
print('signature 384 : ' +
signature384.digest().encode('base64').rstrip('\n'))
signature512 = hmac.new(hmac_key, message, hashlib.sha512)
print('signature 512 : ' +
signature512.digest().encode('base64').rstrip('\n'))
返回
signature 256 : tfnYBB630T/8TemIeNMSSTuY12eJMmel55ZWaRAEq/w=
signature 384 : irWXsFWoNREZddkTRDzPFgyhyiLoIt8uoi0Kpxw4GgYSfSnILXLdQu0HuM5qN4Zb
signature 512 : DU+sAkJnJBqY1QPwJRmwCK/vdACwKfysz+PetdsmvlmgRlK8Ad1tbHsjvRs/By2PR7uWEngXGjocTgqjDGMTFw==
而我的c ++实现
std::string secret = "vzxgPuegSjRksLnCAu/LElxWRonjVkCoArWzZqliiSEtmlbaCfZaGkrSweWJKQkgQsyrBUpSusAcPcGDfFhWOx==";
std::vector<unsigned char> v = b64_decode(secret);
std::string message = "azertyAZERTY";
std::vector<unsigned char> data(message.begin(), message.end());
std::vector<unsigned char> v = b64_decode(secret);
std::cout << "signature 256 : " << b64_encode(hmac_sha256(data, v)) << std::endl;
std::cout << "signature 384 : " << b64_encode(hmac_sha384(data, v)) << std::endl;
std::cout << "signature 512 : " << b64_encode(hmac_sha512(data, v)) << std::endl;
返回
signature 256 : AUTcxQUgWHDOX3KzXJwl6ACDtfNJlMXq55pTBGp3RxAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
signature 384 : irWXsFWoNREZddkTRDzPFgyhyiLoIt8uoi0Kpxw4GgYSfSnILXLdQu0HuM5qN4ZbAAAAAAAAAAAAAAAAAAAAAA==
signature 512 : DU+sAkJnJBqY1QPwJRmwCK/vdACwKfysz+PetdsmvlmgRlK8Ad1tbHsjvRs/By2PR7uWEngXGjocTgqjDGMTFw==
人们可以看到签名256看起来非常不同......
非常感谢你!