使用 OpenSSL 1.1 的 SHA256 HMAC 未编译

TTK机器人

下面的代码使用 HMAC SHA256 生成签名哈希。此代码在 Debian Jessie 和 Ubuntu 16.04(OpenSSL 1.0.2g 2016 年 3 月 1 日)上编译并运行良好。

#include <openssl/evp.h>
#include <openssl/hmac.h>
#include <iomanip>
#include <iostream>
#include <string>
#include <sstream>

using namespace std;

string HMAC256(string data, string key)
{
        stringstream ss;
        HMAC_CTX ctx;
        unsigned int  len;
        unsigned char out[EVP_MAX_MD_SIZE];
        HMAC_Init(&ctx, key.c_str(), key.length(), EVP_sha256());
        HMAC_Update(&ctx, (unsigned char*)data.c_str(), data.length());
        HMAC_Final(&ctx, out, &len);
        HMAC_cleanup(&ctx); 
        for (unsigned int i = 0;  i < len;  i++)
        {
          ss << setw(2) << setfill('0') << hex << static_cast<int> (out[i]);
        }
        return ss.str();
}

int main()
{
    cout << HMAC256("AAAA","BBBB") << endl;
    return 0;
}

然而....

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

hmac256.cpp: In function ‘std::__cxx11::string HMAC256(std::__cxx11::string, std::__cxx11::string)’:
hmac256.cpp:14:18: error: aggregate ‘HMAC_CTX ctx’ has incomplete type and cannot be defined
         HMAC_CTX ctx;
                  ^~~
hmac256.cpp:18:9: warning: ‘int HMAC_Init(HMAC_CTX*, const void*, int, const EVP_MD*)’ is deprecated [-Wdeprecated-declarations]
         HMAC_Init(&ctx, key.c_str(), key.length(), EVP_sha256());
         ^~~~~~~~~
In file included from /usr/include/openssl/hmac.h:13:0,
                 from hmac256.cpp:2:
/usr/include/openssl/hmac.h:28:1: note: declared here
 DEPRECATEDIN_1_1_0(__owur int HMAC_Init(HMAC_CTX *ctx, const void *key, int len,
 ^

这与新的 OpenSSL 版本(OpenSSL 1.1.0f 2017 年 5 月 25 日)有关。

问题

为什么我会遇到 OpenSSL 1.1 的问题,以及如何以与 OpenSSL 1.0 保持向后兼容性的方式修复它?

是的

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Ruby中使用HMAC SHA256

服务器未安装Digest :: SHA'hmac_sha256_base64',我可以改用Digest :: HMAC_SHA1'hmac_sha1'吗?

使用Swift,如何使用SHA1创建OpenSSL HMAC摘要,然后使用严格的encode64进行编码

使用Python实现SHA1-HMAC

Java Mac sha256哈希与使用包的PHP hmac sha256不匹配?

使用C ++中的键生成HMAC SHA256哈希

在Dart中使用hmac和sha256签名消息

Perl hmac sha256与PHP使用包不同

使用HMAC SHA1的CCKeyDerivationPBKDF通常返回-1

如何使用 sha256 哈希生成 0 到 1 之间的随机数

Android / Python如何使用RSA和PKCS1填充来验证签名SHA256

openSSL如何使用SHA256签署证书

使用SHA256摘要进行OpenSSL RSA签名

在Delphi中使用OpenSSL验证SHA256签名失败

openssl dgst -sha1 -hmac“ key”产生多余的((stdin)=”前缀和尾随换行符

PHP 相当于 openssl dgst -sha1 -hmac KEY -binary

不同的 SHA1 但相同的 SHA256

将 sha1 转换为 sha256

SHA1和SHA256是否关联?

使用secp256r1曲线和SHA256算法生成ECDSA签名-BouncyCastle

我可以使用sha1,sha256 lib生成的字符串作为哈希键吗

使用Java提供各种哈希算法(MD5,SHA1,SHA256等)的库吗?

SAML令牌:为什么要使用多种哈希/摘要算法:sha256和sha1?

使用JavaScript计算HMAC-SHA1签名

如何在OpenSSL中使用p-256和SHA256获得ECSDA?

使用cryptojs通过SHA256算法生成符合RFC 2104的HMAC

HMAC 和 SHA256 - 如何使用随机数进行验证

如何在Common Lisp中使用Ironclad创建SHA256 HMAC?

使用 hmac 和 sha256 的 Python 加密没有给出与 javascript 相同的结果