【OpenSSL】HMAC消息认证码

2023-09-22 07:45:24

HMAC消息认证码

  • 哈希运算消息码(Hash-based Message Authentication Code)
  • 与密钥相关的单向散列函数
  • 应用在SSL协议中
  • 消息是否被正确传输
  1. 消息完整性
  2. 消息认证

算法流程

在这里插入图片描述

  1. 密钥填充0(填充到与散列函数分组长度一致)
  2. 填充后的密钥与0X36做异或ipad
  3. 与消息内容组合
  4. 第一次与单向散列函数进行散列计算
  5. 填充后密钥与0x5c做异或运算的到opad.
  6. 得到的opad与第一次散列结果做组合
  7. 再做一次散列, 得到最后的MAC值。
  8. 整体过程中密钥有点类似于SALT

HMAC 安全问题

  • 重放攻击
  1. 使用时间戳, nonce随机数解决
  • 无法解决的问题
  1. 无第3方证明,密码发送问题
  2. 防止否认

模拟HMAC消息

模拟消息发送端生成消息

string GetHMAC1() 
{
   unsigned char data[1024] = "HMAC1";
   int data_size = strlen((char*)data);
   //生成MAC存储空间
   unsigned char mac[1024] = { 0 };
   unsigned int mac_size = 0;
   char key[1024] = "123456";
   HMAC(EVP_sha256(), //设置HASH算法
   	key, //共享密钥
   	strlen(key), //密钥长度
   	data,
   	data_size,
   	mac, //返回的消息MAC
   	&mac_size //返回消息MAC长度
   );
   //生成消息,模拟发送消息体
   string msg(mac, mac + mac_size);    //1 . 消息的HMAC
   msg.append(data, data+data_size);  // 2. 消息内容
   return msg;
}

模拟消息接收端验证消息


void TestHMAC(string msg1) 
{
   //string msg1 = GetHMAC1();
   const char* data = msg1.data() + 32; // SHA-256就是32个字节
   int data_size = msg1.size() - 32; //去掉头部
   string hmac(msg1.begin(), msg1.begin() + 32); //拿到发送端生成的hmac

   unsigned char out[1024];
   unsigned int out_size = 0;
   //验证消息完整和验证
   char key[1024] = "123456";
   HMAC(EVP_sha256(),
   	key,
   	strlen(key),
   	(unsigned char*)data, //输入的数据
   	data_size,
   	out, 
   	&out_size
   );
   // 验证生成的HMAC
   string my_hmac(out, out + out_size);
   if (hmac == my_hmac) 
   {
   	cout << "消息HMAC校验成功, no change!" << endl;
   }
   else 
   {
   	cout << "消息HMAC校验失败, message change!" << endl;
   }
}

测试


int main(int argc, char* argv[])
{
   // 测试HMAC
   string msg1 = GetHMAC1();
   TestHMAC(msg1);
   return 0;
}

在这里插入图片描述

更多推荐

电子商务平台市场动向的数据分析平台:阿里商品指数,包括淘宝采购指数,淘宝供应指数,1688供应指数。

项目设计集合(人工智能方向):助力新人快速实战掌握技能、自主完成项目设计升级,提升自身的硬实力(不仅限NLP、知识图谱、计算机视觉等领域):汇总有意义的项目设计集合,助力新人快速实战掌握技能,助力用户更好利用CSDN平台,自主完成项目设计升级,提升自身的硬实力。专栏订阅:项目大全提升自身的硬实力[专栏详细介绍:项目设计

相比SiteGPT,用HelpLook创建Chatbot有哪些优势?

在当今快节奏的数字时代,很多企业都在不断寻找新的方法来改善客户支持和简化运营。一种广受欢迎的解决方案是使用AI问答机器人(Chatbot)。聊天机器人凭借其理解自然语言查询和实时响应的能力,已成为各行业企业不可或缺的工具。SiteGPT和HelpLook是两个比较强大的人工智能工具,在技术和人工智能社区中获得了不错的关

HTTPS加密流程

HTTPSHTTPS一.什么是HTTPS二.什么是"加密"三.加密的方式有哪些1.对称加密2.非对称加密3.中间人攻击4.引入证书HTTPS一.什么是HTTPSHTTPS与HTTP一样都是应用层协议,与HTTPS不同的是:HTTP的协议内容都是按照文本方式进行明文传输的,这导致在传输过程第三方者能够轻易获取传输的内容,

【操作系统】实验一 Linux初步

文章目录Linux初步一、实验目的二、实验内容Linux初步一、实验目的通过proc文件系统观察整个Linux内核和系统的一些重要特征,并编写一个程序,使用proc文件系统获得以及修改系统的各种配置参数。本实验需要学生具有Linux的基本操作技能,以及采用C语言编写程序的能力。二、实验内容以超级用户的身份登录Linux

【面试刷题】——TCP三次握手,以及为什么要三次握手

TCP(传输控制协议)的三次握手是建立TCP连接的过程,它确保了通信双方的正常启动和参数协商。三次握手的过程如下:客户端发送请求:客户端首先向服务器发送一个特殊的TCP报文,称为SYN(同步)报文。这个报文包含一个随机的序列号(ClientISN),并请求建立连接。此时客户端进入"SYN-SENT"状态。服务器回应:服

C2基础设施威胁情报对抗策略

威胁情报是指在信息安全和安全防御领域,收集、分析和解释与潜在威胁相关的信息,以便预先发现并评估可能对组织资产造成损害的潜在威胁,是一种多维度、综合性的方法,其通过信息的收集、分析和研判,帮助组织了解可能对其安全构成威胁的因素。这种方法不仅仅着重于技术层面,还包括了社会、心理、政治等多个维度,以此更好地应对不断变化和复杂

用js理解常用设计模式

目录原则创建型单例模式工厂模式js闭包:函数工厂结构型代理模式装饰器模式行为型职责链模式观察者模式原则S–SingleResponsibilityPrinciple单一职责原则一个程序只做好一件事如果功能过于复杂就拆分开,每个部分保持独立例如:Promise每个then中的逻辑只做好一件事O–OpenClosedPri

旧版office如何卸载干净,Mac电脑移除office教程

版office卸载不干净导致无法激活新版Microsoftoffice,这个问题如何解决呢?深受这一烦恼的小伙伴看过来!旧版office由于证书一直清理不干净,电脑上有旧证书存在导致新版offce激活不成功,具体手动清理方法带给大家。Microsoftoffice365安装方法一:关闭所有Office应用程序。打开“应

无线定位中TDOA时延估计算法matlab仿真

目录1.算法运行效果图预览2.算法运行软件版本3.部分核心程序4.算法理论概述5.算法完整程序工程1.算法运行效果图预览2.算法运行软件版本matlab2022a3.部分核心程序...................................................................figu

详解window.print(),实现长列表打印分页

相信大家平时做项目时,打印需求很常见,但想把打印做好,还是要花点时间的。特别是长列表要分页的情况。我们知道浏览原生API`window.print()`可以用于印当前窗口(window.document)视图内容。调用此方法会产生一个打印预览弹框,用户可以根据具体设置来得到打印结果。一、window的打印事件默认情况下

抄写Linux源码(Day12:从 MBR 到 C main 函数 (1) )

回忆我们需要做的事情:为了支持shell程序的执行,我们需要提供:1.缺页中断(不理解为什么要这个东西,只是闪客说需要,后边再说)2.硬盘驱动、文件系统(shell程序一开始是存放在磁盘里的,所以需要这两个东西)3.fork,execve,wait这三个系统调用,也可以说是进程调度(否则无法haltshell程序并且启

热文推荐