使用 OpenSSL 1.1 的 SHA256 HMAC 未编译

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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而....

\n\n

在 Debian Stretch 上编译它时,出现以下错误:

\n\n
hmac256.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 ^\n
Run 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

dou*_*uyw 5

要修复错误,请阅读:升级到 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)

为了向后兼容,可以考虑使用宏来控制代码块进行编译。