openssl库HMAC使用 undefined reference to `HMAC_CTX_new‘

这篇具有很好参考价值的文章主要介绍了openssl库HMAC使用 undefined reference to `HMAC_CTX_new‘。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原因

由于使用的openssl库版本的问题HMAC_CTX *HMAC_CTX_new(void)为OpenSSL 1.1.0后开始引入的函数,老的库要使用void HMAC_CTX_init(HMAC_CTX *ctx)

老的 HMAC库函数(版本1.1.0前)

函数原型

#include <openssl/hmac.h>

 unsigned char *HMAC(const EVP_MD *evp_md, const void *key,
               int key_len, const unsigned char *d, int n,
               unsigned char *md, unsigned int *md_len);

 void HMAC_CTX_init(HMAC_CTX *ctx);

 int HMAC_Init(HMAC_CTX *ctx, const void *key, int key_len,
               const EVP_MD *md);
 int HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int key_len,
                   const EVP_MD *md, ENGINE *impl);
 int HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, int len);
 int HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len);

 void HMAC_CTX_cleanup(HMAC_CTX *ctx);
 void HMAC_cleanup(HMAC_CTX *ctx);

官网介绍

使用

HMAC的实现在crypto/hmac/hmac.c中,如下:

unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len,
                  const unsigned char *d, size_t n, unsigned char *md,
                  unsigned int *md_len)
{
	HMAC_CTX c;
	static unsigned char m[EVP_MAX_MD_SIZE];
	if (md == NULL) md=m;
	HMAC_CTX_init(&c);
	HMAC_Init(&c,key,key_len,evp_md);
	HMAC_Update(&c,d,n);
	HMAC_Final(&c,md,md_len);
	HMAC_CTX_cleanup(&c);
	return(md);
}
  • evp_md指明HMAC使用的摘要算法;
  • key为秘密密钥指针地址;
  • key_len为秘密密钥的长度;
  • d为需要做HMAC运算的数据指针地址;
  • n为d的长度;
  • md用于存放HMAC值;
  • md_len为HMAC值的长度。

例子:

int hmac_sha256_test(void)
{
    // The secret key for hashing
    const char key[] = "012345678";
    // The data that we're going to hash
    char data[] = "hello world";
    // Be careful of the length of string with the choosen hash engine. SHA1 needed 20 characters.
    // Change the length accordingly with your choosen hash engine.
    unsigned char *result;
    unsigned int len = 32;

    result = (unsigned char *)malloc(sizeof(char) * len);

    HMAC(EVP_sha256(), key, strlen(key), (uint8_t *)data, strlen(data), result, &len);

    printf("HMAC digest: ");
    for (int i = 0; i != len; i++)
        printf("%02x", (unsigned int)result[i]);
    printf("\n");

    free(result);
    return 0;
}

验证

在线验证计算hmac网站

OpenSSL 1.1.0 HMAC库函数

 #include <openssl/hmac.h>

 unsigned char *HMAC(const EVP_MD *evp_md, const void *key,
                     int key_len, const unsigned char *d, size_t n,
                     unsigned char *md, unsigned int *md_len);

 HMAC_CTX *HMAC_CTX_new(void);
 int HMAC_CTX_reset(HMAC_CTX *ctx);

 int HMAC_Init_ex(HMAC_CTX *ctx, const void *key, int key_len,
                  const EVP_MD *md, ENGINE *impl);
 int HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, size_t len);
 int HMAC_Final(HMAC_CTX *ctx, unsigned char *md, unsigned int *len);

 void HMAC_CTX_free(HMAC_CTX *ctx);

 int HMAC_CTX_copy(HMAC_CTX *dctx, HMAC_CTX *sctx);
 void HMAC_CTX_set_flags(HMAC_CTX *ctx, unsigned long flags);
 const EVP_MD *HMAC_CTX_get_md(const HMAC_CTX *ctx);

 size_t HMAC_size(const HMAC_CTX *e);

官网介绍

HMAC介绍

HMAC用于保护消息的完整性,它采用摘要算法对消息、填充以及秘密密钥进行混合运算。在消息传输时,用户不仅传送消息本身,还传送HMAC值。接收方接收数据后也进行HMAC运算,再比对MAC值是否一致。由于秘密密钥只有发送方和接收方才有,其他人不可能伪造假的HMAC值,从而能够知道消息是否被篡改。

ssl协议中用HMAC来保护发送消息,并且ssl客户端和服务端的HMAC密钥是不同的,即对于双方都有一个读MAC保护密钥和写MAC保护密钥。

参考

openSSL官网
OpenSSL 中文手册
C++ HMAC_CTX_init函数代码示例文章来源地址https://www.toymoban.com/news/detail-676057.html

到了这里,关于openssl库HMAC使用 undefined reference to `HMAC_CTX_new‘的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • nmealib库编译提示 undefined reference to `ceil‘

    下载了nmealib库文件,默认工程进行编译,报错,提示如下: 网上搜索,因为使用了 ceil 数学相关的库,说是链接需要添加 -lm 的参数。 官方的 Makefile 文件 可以看到 LIBS 已经包含了 lm 。目前的报错该怎么解决呢? 解决办法:修改 LIBS 中 lm 的位置,放在后面。 如下: 再次编

    2024年01月20日
    浏览(30)
  • Vitis HLS出现undefined reference to的可能解决办法

    问题描述: undefined reference to `cv::namedWindow(std::__cxx11::basic_stringchar, std::char_traitschar, std::allocatorchar const, int)\\\' undefined reference to `cv::resizeWindow(std::__cxx11::basic_stringchar, std::char_traitschar, std::allocatorchar const, int, int)\\\' undefined reference to `cv::imshow(std::__cxx11::basic_stringchar, std::char_traitscha

    2024年02月02日
    浏览(37)
  • undefined reference to `__android_log_print‘

    今天给JNI的C代码添加“__android_log_print”日志打印,发现报错。 这里对原因进行分析 build.gradle中 CCallJava.c(JNI文件中) so文件没有没有添加log的链接库,添加“LOCAL_LDLIBS := -llog”即可

    2024年01月20日
    浏览(65)
  • Dev C++中出现 undefined reference to XXX 错误的解决方式

            主函数中调用在其他文件中定义的函数,编译报错:未定义的引用xxx。         原理:编译器在生成可执行文件的过程包括预处理、编译、汇编、链接,这4个过程,这个问题一般出现在 链接 过程,所谓的链接过程,就是把不同的目标文件粘合在一起,生成一

    2024年02月03日
    浏览(33)
  • 【debug】OpenCV出现问题:undefined reference to ‘cv::Mat::Mat()‘

    参考:动手学ROS2 分析原因: undefined reference to \\\'cv::Mat::Mat()\\\' 原因在于g++找不到库文件,解决方法就是我们帮助它定位到库文件的位置,并通过-L参数指定库目录,-l(小写L)指定库的名字。 解决方法: 在执行命令时添加后缀参数

    2024年02月08日
    浏览(35)
  • Qt 编译纯c的C99的项目, error: undefined reference to `f()‘

    把Cpp的后缀该为C是什么样的 尝试引用一个奇门排盘的c程序,在git上找到的叫cqm, 然后总是报错 error: undefined reference to `f()\\\' 很是郁闷 于是新建了个项目试验一下,终于摸清了需要命名空间。 后来这么写就可以了 a.h  a.cpp (c文件不支持命名空间!) test.cpp 引用的cpp

    2024年02月07日
    浏览(40)
  • 从链接器的角度详细分析g++报错: (.text+0x24): undefined reference to `main'

    /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o: in function `_start\\\': (.text+0x24): undefined reference to `main\\\' collect2: error: ld returned 1 exit status    在使用g++编译链接两个C++源文件main.cpp以及VecAdd.cpp时出现了以上编译报错。main.cpp中引用了VecAdd.cpp中定义的函数vecAdd来实现两个

    2024年02月08日
    浏览(30)
  • centos7 编译bluez ARM版本及undefined reference to `g_thread_new‘

            在我辛辛苦苦编译成功 glib 库后(看我上一篇文章 centos7 glib2.0 arm版本的编译),以为可以顺利编译我的 bluez ARM 版本,结果出现了最后一个错误(其中一个是私有库里的),如: 就是这个 g_thread_new 没有找到实现,然后在网上搜了半天,都说是 glib 库里的实现,但

    2024年02月07日
    浏览(25)
  • undefined reference to `dlopen‘ ‘SSL_library_init‘ `X509_certificate_type‘

    使用Crow的时候需要注意crow依赖asio依赖OpenSSL,asio要求1.22以上版本,我使用的是1.26.0; 这个版本的asio要求OpenSSL是1.0.2,其他版本我得机器上编不过,ubuntu上默认带的OpenSSL是1.1.1; 所以我下载了OPENSSL1.2.0重装,地址: https://www.openssl.org/source/old/ 编译cpp启用Crow的SSL时会出现一些

    2024年02月13日
    浏览(32)
  • error: undefined reference to ‘cv::Mat::~Mat()‘解决AndroidStudio集成OpenVC出现的编译报错问题

    本来这种类型的博客不是笔者想写的,不过这个问题,笔者经过网上一番搜索却没有可用的解决方案,因此分享出来帮助大家填坑。 OpenCV官方的Android SDK在这里下载,集成方法就不多介绍了,可以看这两位博主的文章:  小小情意的​ Android 接入 OpenCV库的三种方式 ​  春末

    2024年02月07日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包