图解 | 消息认证码(MAC)到底解决了什么问题?还有什么问题是它解决不了的?

news2024/9/22 2:44:24

消息认证码(Message Authentication Code,MAC)是一种用于验证数据完整性和来源可信性(对消息进行认证)的技术。它通常由一个密钥和被保护的消息通过特定算法计算得出,接收方可以使用相同的密钥(共享密钥)来验证发送者是否真的发送了这条消息,防止被篡改和伪造。常用的SSL/TLS、IPsec协议均使用了MAC技术。

1. 产生背景

随着网络通信的发展,安全需求日益增强,传统的加密技术无法仅凭密码就保证信息的完整性和真实性。因此,MAC应运而生,作为数据完整性的一种轻量级解决方案,适用于对实时性和计算资源有限的系统。

当然,如果不考虑实时性和资源限制,我们完全有更好的解决方案,即采用数字签名技术进行通信,数字签名不仅能保障完整性、支持任何第三方证明,还能防止对方否认(抵赖)

消息认证码VS数字签名

2. MAC工作原理

为了容易理解消息认证码的工作原理,我们再次请出密码学的老朋友Alice和Bob,在本文中Alice要向Bob发送一个转账请求。

消息认证码工作流程

具体工作流程

  1. Alice与Bob事先共享密钥。(PS:关于如何事先共享密钥请参阅《对称密码中的密钥是如何实现安全配送的?》)
  2. Alice根据转账请求消息计算MAC值,MAC值的计算方法详见第3章节(HMAC)。
  3. Alice将转账请求消息和MAC值发送给Bob。
  4. Bob使用共享密钥结合收到的转账请求消息计算得出MAC值。
  5. Bob将自己计算的MAC值与接收到的MAC值进行比较,如果值一致则可以确认转账请求来自Allice(即认证成功),否则消息不是来自Alice(即认证失败)。

3. MAC值的经典实现方法(HMAC)

HMAC(Hash-based Message Authentication Code)是一种基于哈希函数的消息认证码机制。它结合了密钥和哈希函数,用于保护信息安全。HMAC工作的核心思想是先使用一个预共享的密钥对原始数据进行加密,然后通过哈希函数处理加密后的结果,得到一个固定长度的摘要,即HMAC值。

HMAC实现原理

从上述流程中可以看出MAC值一定是和消息、密钥相关的且固定长度的比特序列

上图中的 7 个步骤可以简化为以下 4 步(方便记忆):

  1. 密钥预处理:将密钥与一个固定的填充字符串(如0x36或0x5C)进行XOR运算,确保密钥长度与哈希函数的块大小一致。

  2. 消息预处理:将预处理后的密钥与消息进行拼接。

  3. 一次哈希:对拼接后的结果进行哈希运算,得到一个哈希值。

    HMAC中用到的单向散列函数有多种,只要满足高强度的单向散列函数就可用于HMAC。比如使用 SHA-256 构造的HMAC称为HMAC-SHA-256,使用MD5构造的HMAC称为HMAC-MD5

  4. 二次哈希:将预处理后的密钥与上一步得到的哈希值再次进行哈希运算,得到最终的HMAC值。

或者可以用以下公式记忆:

H M A C ( K , M ) = H ( H ( i p a d k e y ∣ ∣ M ) ∣ ∣ o p a d k e y ) HMAC(K,M) = H(H(ipadkey || M) || opadkey ) HMAC(K,M)=H(H(ipadkey∣∣M)∣∣opadkey)

其中:

  • H 为共享密钥(Key),
  • H 为密码散列函数(如SHA256),
  • M 是要认证的消息,
  • || 表示组合的意思,
  • ipadkey 是内部填充(0x36…36,十六进制循环序列)与密钥XOR得到的内部序列,其中ipadkey = inner + pad +key
  • opadkey 是外部填充(0x5c…5c,十六进制循环序列)与密钥XOR得到的外部序列,其中opadkey = outer + pad +key

此外,还可以通过分组密码(如AES)、公钥密码、流密码等来实现MAC。

疑问1:大家猜猜看,为何HMAC的计算过程中一定要涉及到两次哈希运算,改成一次可行么?可以评论区留下你的答案。

4. 消息认证码无法解决的问题

4.1. 无法对第三方证明

假设Bob在接收了来自Alice的消息之后,想要向第三方验证者证明这条消息的确是Alice发送的,但是用消息认证码无法进行这样的证明,这是为什么呢?

  • 首先,第三方验证者要校验MAC值,就需要知道Alice和Bob之间共享的密钥;
  • 其次,即便Bob相信第三方验证者并将密钥告诉了第三方验证者,但此时第三方验证者仍无法断定这条消息是由Alice发送的,因为第三方验证者可能认为:“即使MAC值是正确的,发送这条消息的人也不一定是Alice,还有可能是Bob自己发给自己的”。

4.2. 无法防止否认

假设Bob收到了包含MAC值的消息,这个MAC值是用Alice和Bob共享的密钥计算出来的,因此Bob能够判断这条消息来自Alice。但上面我们提过,Bob无法向第三方验证者证明这一点,因为发送者Alice可以向第三方验证者声称:“我没有向Bob发送过这条消息(即Bob否认了消息发送)”。 故而消息认证码无法防止否认。

如果要想解决以上两个问题,我们就要改用数字签名技术,可以参阅博文

  • 《一文彻底搞懂公钥密码、数字签名和数字证书》

5. 消息认证码面临的攻击

即便消息认证码可以解决认证和完整性问题,但依然存在如下安全风险

  • 重放攻击:Alice与Bob的通信过程可以被攻击者窃听到,如果攻击者保存了Alice发送的消息及其对应的MAC值,就可以基于此消息和MAC值重复多送发送给Bob,最终导致Bob执行了多次转账。重放攻击

  • 密钥推测攻击:由于HMAC中使用了单向散列函数,那么针对单向散列函数的暴力破解和生日攻击同样可应用于消息认证码攻击。

不过针对以上两种攻击,也有非常多的应对方案,欢迎大家在评论区留下你的答案。网络安全是一个永远聊不完的话题,欢迎大家一起来碰撞!


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2153932.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++类之set与get理解

在类中,我们尝尝将一些变量设置为private或者protect里面,而我们经常会遇到在主函数(main.cpp)使用到这些private变量,而往往我们会下意识地在主函数直接调用在private里面的变量,但现实比较残酷&#xff0…

20240921解决使用PotPlayer在WIN10电脑播放4K分辨率10bit的视频出现偏色的问题

20240921解决使用PotPlayer在WIN10电脑播放4K分辨率10bit的视频出现偏色的问题 2024/9/21 10:40 缘起:常见的问题,你下载视频的时候,4K分辨率的视频播放的时候出现偏色异常,但是1080p分辨率的正常呀! 偏色的识别&…

re题(32)BUUCTF-[MRCTF2020]hello_world_go

BUUCTF在线评测 (buuoj.cn) 查壳,无壳,64位elf文件 ida打开是go语言写的,shiftF12看字符串 ctrlF搜索字符串,得到flag 本题是go语言写的,可以用linux打开go语言文件,本题直接把flag放到了字符串表&#xf…

数据结构---二叉搜索树(二叉排序树)

什么是二叉排序树 二叉搜索树又是二叉排序树,当我们的是一颗空树或者具有以下性质时: 左子树不为空,左子树上的值都小于我们的根节点上的值。右子树不为空时,右子树上的值都大于我们的根节点上的值左右子树都是二叉搜索树&#…

我的AI工具箱Tauri版-VideoDuplication视频素材去重

本教程基于自研的AI工具箱Tauri版进行VideoDuplication视频素材去重。 该项目是基于自研的AI工具箱Tauri版的视频素材去重工具,用于高效地处理和去除重复视频内容。用户可以通过搜索关键词"去重"或通过路径导航到"Python音频技术/视频tools"模…

封装的例题

答案A 解析: 选项B说法也正确,但是不如A更有效 选项C 不管采用什么方法,文档是必须要写的 选项D 说法太绝对了,如果封装的内容不适合,开发者可能做软件开发反而难度系数加大

芯片开发(1)---BQ76905---底层参数配置

主要开发思路:AFE主要是采集、保护功能、均衡,所以要逐一去配置芯片的寄存器 采集、均衡功能主要是配置引脚 保护功能主要是参数寄存器配置,至于如何使用命令修改寄存器参数该系列芯片提供了子命令和直接命令两种方式 BQ76905的管脚配置 I、参数配置 …

ubuntu 执行定时任务crontab -e 无法输入的问题

界面显示 GNU nano 4.8 /tmp/crontab.l0A1HJ/crontab # Edit this file to introduce tasks to be run by cron. # # Each task to run has to be defined t…

全国职业院校技能大赛(大数据赛项)-平台搭建hive笔记

在大数据时代,数据量呈爆炸性增长,传统的数据处理工具已难以满足需求。Hive作为一个开源的数据仓库工具,能够处理大规模数据集,提供了强大的数据查询和分析能力,是大数据学习中的关键工具。在全国职业院校技能大赛&…

【图像检索】基于Gabor特征的图像检索,matlab实现

博主简介:matlab图像代码项目合作(扣扣:3249726188) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于Gabor特征的图像检索,用matlab实现。 一、案例背景和算法介绍 这次博…

GPT-4o在matlab编程中性能较好,与智谱清言相比

边标签由矩阵给出 s [1 2 3 3 3 3 4 5 6 7 8 9 9 9 10]; t [7 6 1 5 6 8 2 4 4 3 7 1 6 8 2]; G graph(s,t); plot(G) ------------------- GPT-4o给出的代码可用, clc;clear; % 定义边的起点和终点 s [1 2 3 3 3 3 4 5 6 7 8 9 9 9 10]; t [7 6 1 5 6 8 2 …

您可能一直在寻找的 10 个非常有用的前端库

文章目录 前言正文1.radash2.dayjs3.driver4.formkit/drag-and-drop5.logicflow6.ProgressBar7.tesseract8.zxcvbn9.sunshine-track10.lottie 前言 前端开发中,总有一些重复性的工作让我们疲于奔命。为了提高开发效率,我们精心挑选了10个功能强大、易于…

【油猴脚本】00010 案例 Tampermonkey油猴脚本,动态渲染表格-添加提示信息框,HTML+Css+JavaScript编写

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【油…

Ubuntu 22.04 源码下载、编译

Kernel/BuildYourOwnKernel - Ubuntu Wikihttps://wiki.ubuntu.com/Kernel/BuildYourOwnKernel 一、查询当前系统内核版本 rootubuntu22:~# uname -r 5.15.0-118-generic 二、查询本地软件包数据库中的内核源码信息 rootubuntu22:~# apt search linux-source Sorting... Do…

Unity实现原始的发射子弹效果

1 创建一个炮塔,按下空格-坦克会发射一个小球2.小球会掉在地上滚下来-添加组件3 间隔几秒后自动销毁程序逻辑:1.在场景中创建一个炮塔\子弹拿到代码里的变量里程序逻辑: 2.if语句检测用户有没有按下空格程序逻辑: 3.在炮塔坐标的位…

5. 数字证书与公钥基础设施

5. 数字证书与公钥基础设施 (1) PKI 的定义、组成及应用 PKI(Public Key Infrastructure,公钥基础设施) 是一个使用公钥技术来提供安全服务的框架。它定义了如何管理和维护公钥,以及如何通过证书来验证公钥的真实性。PKI的核心组成部分包括: 证书颁发机构(CA, Certifica…

(done) 声音信号处理基础知识(4) (Understanding Audio Signals for ML)

来源:https://www.youtube.com/watch?vdaB9naGBVv4 模拟信号特点如下 时域连续(x轴) 振幅连续(y轴) 如下是模拟信号的一个例子: 数字信号特点如下: 一个离散值序列 数据点的值域是一系列有限的值 ADC:模拟信号到数字信号的…

Elionix 电子束曝光系统

Elionix 电子束曝光系统 - 上海纳腾仪器有限公司 -

Python包、模块、库辨析

目录 1 模块的基础介绍 2 包的概念解析 3 库的定义与作用 4 区分三者 5 实例 __init__.py addition.py multiplication.py main_scipt 1 模块的基础介绍 模块是 Python 编程的基本组成部分之一,它是单个文件 ,包含 Python 代码,可以定…

GB28181协议接入SVMSPro平台

国标28181协议接入SVMSPro平台 步骤一:海康摄像机28181配置;登录海康摄像机网页进配置选项,左边选网络-高级设置-平台接入-类型选28181 勾选启用,28181协议版本选最新2016 SIP服务器ID:默认20位 34020000002000000001,也可在服务端…