27、HMAC

2023-11-14

HMAC产生背景

HMAC为什么会被提出来?是MAC的产生有什么缺陷么?

HMAC规范的设计是由于存在对将密钥与hash函数相结合的更简单机制的攻击。换言之就是有些将密钥和hash函数结合使用产生MAC的算法容易被攻击。而这种生成消息认证码的方法就像炸弹一样,可能随时都会给企业和社会带来危险。

例如:

  1. MAC = H ( key| message ):对于大多数散列函数,很容易在不知道密钥的情况下将数据附加到消息中并获得另一个有效的MAC。(“长度扩展攻击”)
  2. MAC = H ( message | key附加密钥):攻击者可以在未加密的散列函数中找到与MAC 中存在冲突的hash值。
  3. MAC = H ( key| message| key ):但有信息安全方面的论文提出了这种方法的漏洞,即使使用两个不同的密钥也是如此。

基于上述问题,Mihir Bellare、Ran Canetti和Hugo Krawczyk 在他们的论文中提出了HMAC 结构的定义和分析:

HMAC简介

HMAC(Hash Message Authentication Code),中文名“散列消息鉴别码”,主要是利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。

HMAC是由H.Krawezyk,M.Bellare,R.Canetti于1996年提出的一种基于Hash函数和密钥进行消息认证的方法,并于1997年作为RFC2104被公布,并在IPSec和SSL中得以广泛应用,现在已经成为事实上的Internet安全标准。它可以与任何迭代散列函数捆绑使用。HMAC是Internet协议(IP)安全的强制安全实施方法,并在Internet上广泛使用的安全套接层(SSL)协议中使用。

HMAC是一种使用单向散列函数来构造消息认证码(MAC)的方法,其中H就代表了hash的意思。HMAC中所使用的单向散列函数并不是仅仅局限于一种,任何获得认证的高强度的单向散列函数都可以用于HMAC的计算。

HMAC是含有密钥的散列函数算法,包含MD和SHA两个系列的消息摘要算法。HMAC只是在原有的MD和SHA算法的基础上添加了密钥。

MD系列:HmacMD2,HmacMD4,HmacMD5

SHA系列:HmacSHA1,HmacSHA224,HmacSHA256,HmacSHA384,HmacSHA512

算法

摘要长度

HmacMD2

128bit

HmacMD4

128bit

HmacMD5

128bit

HmacSHA1

160bit

HmacSHA224

224bit

HmacSHA256

256bit

HmacSHA384

384bit

HmacSHA512

512bit

HMAC流程

下面看看HMAC的内部工作原理,首先看看HMAC中使用的各个变量:

  • MD=使用的消息摘要(散列)函数
  • M=计算MAC的输入函数
  • L=消息M的块数
  • b=每块的位数(分组长度)
  • K=HMAC使用的共享对称密钥
  • ipad=字符串00110110重复b/8次
  • opad=字符串01011010重复b/8次

根据这些输入,可以如下步骤了解HMAC的操作。

1、密钥填充

使K的长度的等于b,根据密钥K的长度,分三种情况:

1)K<b:这是需要扩展密钥(K),使得K的长度等于b(初始消息块的位数)。为此,在K左边加上足够的0;例如,如果初始密钥长度为170位,而b为512,则增加342个0位到K左边,修改后的密钥继续称为K。

2)K=b:这时不需要任何操作,直接转第2步。

3)K>b:这是需要整理K,使K的长度等于b(初始消息块的位数)。为此,使K通过为该HMAC实例选择的消息摘要算法(H),从而得到密钥K,然后将其长度整理为b。

2、K与ipad做异或运算

第一步填充后的密钥K与ipad做异或XOR运算,得到比特序列ipadkey。

其中,ipad是将00110110这一比特序列不断循环反复直到达到分组长度所形成的比特序列,其中ipad的i是inner的意思;异或XOR运算所得到的值,就是一个和单向散列函数的分组长度相同,且和密钥相关的比特序列。这里将这个比特序列称为ipadkey。

3、将消息M添加到ipadkey

将ipadkey与消息组合,也就是将和密钥相关的比特序列(ipadkey)附加在消息M的开头。

4、消息摘要算法

将第3步的输出(即ipadkey与消息M的组合)输入单向散列函数(如MD5或SHA-1),并计算出散列值H。

5、K与opad做异或运算

将第一步填充后的密钥K与被称为opad的比特序列进行XOR运算,得到比特序列opadkey。

opad是将01011100这一比特序列不断循环反复直到达到分组长度所形成的比特序列,其中opad的o是outer的意思。XOR运算所得到的结果也是一个和单向散列函数的分组长度相同,且和密钥相关的比特序列。这里将这个比特序列称为opadkey。

6、将H添加到opadkey

将第4步求出的消息摘要H添加到opadkey末尾。

7、消息摘要算法

将第6步的输出(即opadkey与H的组合)输入单向散列函数(如MD5或SHA-1),并计算出散列值,这个散列值就是最终的HMAC值。

通过上述流程可以看出,最后得到的HMAC值,一定是一个和输入的消息以及密钥都相关的长度固定的比特序列。

HMAC特点

缺点:

首先计算初始消息的指印(消息摘要),然后用对称密钥加密,只有发送方和接收方知道这个密钥,从而使接收方可以肯定消息来自正确的发送方,没有在中途被篡改。但是存在一下问题:

(1)HMAC中假设只有发送方和接收方知道,存在密钥交换问题。

(2)即使解决了密钥交换问题,HMAC也不适用于多个接收方的情形。这是因为,为了用HMAC产生MAC,就要利用对称密钥,而对称密钥是双方共享的:一个发送方,一个接收方。

(3)接收方是如何知道消息来自发送方,而不是来自其他的接收方。所有接收方都知道这个对称密钥,因此很可能以发送方的身份发一个假消息,用HMAC准备这个消息的MAC,发送消息和MAC,就像合法的发送方一样,这是无法阻止和检测的。

(4)如何证明MAC是A产生还是B产生的,A和B都知道这个对称密钥,双方都有可能生成这个消息及其MAC。

HMAC安全性

针对 HMAC 的最常见攻击是暴力破解密钥。还记得2019年获得未来科学大奖的王小云教授么?她所在团队在2009年在不使用相关密钥的情况下对 HMAC-MD5 进行了差分攻击,结果是可以在2的97次方次查询内以百分之八十七的概率区分使用md5算法加密的HMAC,而这也推动了HMAC使用其他更安全的hash函数在2011年在RFC6151标准中总结了HMAC-md5的安全注意事项。其中提到“对 HMAC-MD5 的攻击在用作消息验证码时似乎并不表明存在实际漏洞,但对于新的协议设计,不应包含具有 HMAC-MD5 的密码套件”。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

27、HMAC 的相关文章

随机推荐

  • 一台电脑如何配置多个JDK

    一 起因 之前电脑装的JDK是1 7版本 由于业务需要 需要安装JDK1 8版本 可我又不想把之前的JDK1 7卸载掉 于是试着两个版本共存 二 探索 众所周知 想要查看JDK是否安装配置成功 需要再dos窗口中输入 java versio
  • Windows11配置Java8开发环境 - JDK1.8

    1 下载JDK 我们要下载的是Oracle版本的JDK 我们首先进入Oracle的官网的Java下载页面 https www oracle com cn java technologies downloads 一直往下滑 找到Java8 g
  • Mybatis 工作原理详解

    目录 Mybatis持久层框架 结果集进行ORM映射 步骤解析 1 获取结果集及结果映射入口 2 开始ORM映射接口 3 数据库结果集解析 完成ORM映射 4 保存并获取ORM映射后的结果集 参数传递方式 顺序传参法 Param注解传参法
  • Unity3d 开始界面空白(黑屏)问题

    1 I found packages unityeditor cloud hub 0 0 1 tgz and unity editor home 0 0 7 tgz in C Program Files Unity Editor Data
  • AIGC产业研究报告2023——语言生成篇

    本文阅读时间 10 分钟 今年以来 随着人工智能技术不断实现突破迭代 生成式AI的话题多次成为热门 而人工智能内容生成 AIGC 的产业发展 市场反应与相应监管要求也受到了广泛关注 为了更好地探寻其在各行业落地应用的可行性和发展趋势 易观对
  • 基于多动作深度强化学习的柔性车间调度研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 文献来源 4 Python代码实现 1 概述 灵活作业车间调度问题 FJSP 在现代制造
  • webpack处理图片资源(jpeg,jpg,png等)

    在webpack5以前 我们处理图片资源通过 file loader 和 url loader 进行处理 现在 Webpack5 已经将两个 Loader 功能内置到 Webpack 里了 我们只需要简单配置即可处理图片资源 webpack
  • 升级到windows server 2008

    网站从 win server 2003 升级到 win server 2008 中间遇到过一些问题 但也收获了很多惊喜 问题 原来的UrlReweite模块不工作了 lt httpModules gt lt add type XXX Ser
  • 2、在hilens_kit安装ros后,启动功能包

    2 在hilens kit安装ros后 启动功能包 在设备上复制ROS core components workspace ROS catkin ws 因为根分区很小 建议将其复制到主文件夹 并创建指向根的符号链接 将ros catkin
  • String 字符串成员函数

    string append 通过在其当前值的末尾附加其他字符来扩展字符串 其他字符串可以截取中间一段 string assign 为字符串分配一个新值 替换其当前内容 string at 获取字符串中的字符 返回对字符串中pos位置的字符的
  • shell 变量 $?

    在 Unix 和 Linux 系统中 每个 shell 命令都有一个与之关联的退出状态 exit status 或返回代码 return code 这个数字值通常用于表示命令是否成功执行 一个零 0 表示成功 而非零值 通常是 1 255
  • Spring中的IOC和AOP是什么意思?

    1 Spring是什么 IOC 控制反转 和AOP 面向方面编程 作为Spring框架的两个核心 很好地实现了解耦合 所以 简单来说 Spring是一个轻量级的控制反转 IoC 和面向切面 AOP 的容器框架 spring的基本框架主要包含
  • B树和B+树的区别是什么

    B 树和 B 树是两种不同的数据结构 B 树是一种平衡树 其中每个节点的子节点数量在一个给定的范围内 通常在 2 到 4 之间 这使得 B 树能够在插入和删除数据时保持平衡 从而提高查找效率 B 树也是一种平衡树 但它有一些不同的特征 首先
  • 终端输入命令报错:”因为在此系统上禁止运行脚本“解决方法

    计算机上启动 Windows PowerShell 时 默认执行策略是 Restricted Restricted 执行策略不允许任何脚本运行 所以修改执行策略就可以了 在电脑搜索框搜索 pw 打开PowerShell 输入 set exe
  • 由于请求头 content-type为application/json导致请求出错

    preface 最近在写 react 项目 然后调用后台接口的时候总是报错 我本以为是后台接口的问题 后来后台说 请求体 不能为 null 然后就简单做了总结 请求头 content type 一般使用的两种格式 application j
  • 对象存储哪家价格便宜?最便宜的云存储推荐!

    我们知道 对象存储是一种云存储服务 不同的云存储 价格也是有所不同的 而对象存储的价格取决于选择的存储容量和服务商 不同的存储容量 价格也是不同的 容量越大 价格也是越贵 不同的服务商 对象存储的价格也是有差异的 那么 对象存储哪家价格便宜
  • C语言获取鼠标位置并设置鼠标位置

    示例程序 include
  • 表单请求改为ajax,使用jq将form表单提交改为ajax提交

    大家可能都会有这样的经历 辛辛苦苦的敲了半天的form表单 然后被通知要改成ajax表单提交 于是就开始了一行一行的获取input的值 复制 粘贴的过程 要是碰上表单行数特别多的时候更麻烦 下面介绍一种方法 用最少的代码量完成form表单提
  • 5G MEC边缘云组网方案与业务案例分析

    1 MEC概念 MEC边缘云 Multi Access Edge Cloud 是在靠近人 物或数据源头的网络边缘侧部署云资源池和云平台 它在5G时代将扮演重要的角色 MEC边缘云的优势在于 一方面它实现了在更靠近数据源所在的本地网内运算 尽
  • 27、HMAC

    HMAC产生背景 HMAC为什么会被提出来 是MAC的产生有什么缺陷么 HMAC规范的设计是由于存在对将密钥与hash函数相结合的更简单机制的攻击 换言之就是有些将密钥和hash函数结合使用产生MAC的算法容易被攻击 而这种生成消息认证码的