TTK*_*oid 4 c++ debian openssl sha256 hmac
下面的代码使用 HMAC SHA256 生成签名哈希。此代码在 Debian Jessie 和 Ubuntu 16.04(OpenSSL 1.0.2g 2016 年 3 月 1 日)上编译并运行良好。
\n\n#include <openssl/evp.h>\n#include <openssl/hmac.h>\n#include <iomanip>\n#include <iostream>\n#include <string>\n#include <sstream>\n\nusing namespace std;\n\nstring HMAC256(string data, string key)\n{\n stringstream ss;\n HMAC_CTX ctx;\n unsigned int len;\n unsigned char out[EVP_MAX_MD_SIZE];\n HMAC_Init(&ctx, key.c_str(), key.length(), EVP_sha256());\n HMAC_Update(&ctx, (unsigned char*)data.c_str(), data.length());\n HMAC_Final(&ctx, out, &len);\n HMAC_cleanup(&ctx); \n for (unsigned int i = 0; i < len; i++)\n {\n ss << setw(2) << setfill(\'0\') << hex << static_cast<int> (out[i]);\n }\n return ss.str();\n}\n\nint main()\n{\n cout << HMAC256("AAAA","BBBB") << endl;\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n然而....
\n\n在 Debian Stretch 上编译它时,出现以下错误:
\n\nhmac256.cpp: In function \xe2\x80\x98std::__cxx11::string HMAC256(std::__cxx11::string, std::__cxx11::string)\xe2\x80\x99:\nhmac256.cpp:14:18: error: aggregate \xe2\x80\x98HMAC_CTX ctx\xe2\x80\x99 has incomplete type and cannot be defined\n HMAC_CTX ctx;\n ^~~\nhmac256.cpp:18:9: warning: \xe2\x80\x98int HMAC_Init(HMAC_CTX*, const void*, int, const EVP_MD*)\xe2\x80\x99 is deprecated [-Wdeprecated-declarations]\n HMAC_Init(&ctx, key.c_str(), key.length(), EVP_sha256());\n ^~~~~~~~~\nIn file included from /usr/include/openssl/hmac.h:13:0,\n from hmac256.cpp:2:\n/usr/include/openssl/hmac.h:28:1: note: declared here\n DEPRECATEDIN_1_1_0(__owur int HMAC_Init(HMAC_CTX *ctx, const void *key, int len,\n ^\nRun Code Online (Sandbox Code Playgroud)\n\n这与新的 OpenSSL 版本(OpenSSL 1.1.0f 2017 年 5 月 25 日)有关。
\n\n问题
\n\n为什么我会遇到 OpenSSL 1.1 的问题,以及如何以保持与 OpenSSL 1.0 向后兼容性的方式修复该问题?
\n要修复错误,请阅读:升级到 OpenSSL 1.1.0。基本上,您需要创建一个新的 HMAC_CTX,如下所示:
HMAC_CTX *h = HMAC_CTX_new();
HMAC_Init_ex(h, key, keylen, EVP_sha256(), NULL);
...
HMAC_CTX_free(h);
Run Code Online (Sandbox Code Playgroud)
为了向后兼容,可以考虑使用宏来控制代码块进行编译。