当前位置: 首页 > backend >正文

消息认证码(message authentication code)MAC

概述
消息认证码(message authentication code)是一种确认完整性并进行认证的技术,简称为MAC。

使用消息认证码可以确认自己收到的消息是否就是发送者的本意,也就是说,使用消息认证码可以判断消息是否被篡改,以及是否有人伪装成发送者发送了该消息。

消息认证码的输入包括任意长度的消息和一个发送者与接收者之间共享的密钥,它可以输出固定长度的数据,这个数据称为MAC值。

消息认证码的使用步骤:
以Alice银行和Bob银行的故事为例,
(1)发送者Alice与接收者Bob事先共享密钥;
(2)发送者Alice根据汇款请求消息计算MAC值(使用共享密钥)
(3)发送者Alice将汇款请求消息和MAC值两者发送给接收者Bob
(4)接收者Bob根据收到的汇款请求消息计算MAC值(使用共享密钥)
(5)接收者Bob将自己计算的MAC值和从Alice处收到的MAC值进行对比
(6)如果两个MAC值一致,则接收者Bob就可以判定汇款请求的确来自Alice(认证成功);
如果不一致,则可以判定消息不是来自Alice(认证失败)

MAC的密钥配送问题

在消息认证码中,需要发送者和接收者之间共享密钥,而这个密钥不能被主动攻击者Mallory获取。如果这个密码落入Mallory手中,则Mallory也可以计算出MAC值,从而就能够自由地进行篡改和伪装攻击,这样一来消息认证码就无法发挥作用了。

实际上,对称密码地密钥配送问题在消息认证码中也同样会发生,要解决密钥配送问题,需要像对称密码一样使用一些共享密钥地方法,如公钥密码、密钥分配中心,或者使用其他安全的方式发送密钥等。

MAC的应用实例
(1)IPsec
IPsec是对互联网基本通信协议——IP协议(Internet Protocol)增加安全的一种方式。在IPsec中,对通信内容的认证和完整性校验都是采用MAC来完成的。
(2)SSL/TLS
SSL/TLS是我们在网上购物等场景中使用的通信协议。SSL/TLS中对通信内容的认证和完整性校验也使用了消息认证码。
(3)SecOC
Security Onboard Communication,是AUTOSAR组织为实现ECU间通信安全提出的标准,主要包含基于MAC的身份验证和基于Freshness的放重放攻击

对MAC的攻击
重放攻击
举例如下

  • Mallory 窃听到Alice银行与Bob银行之间的通信

    Mallory到Alice银行向Mallory自己在Bob银行中的账户M-2653汇款100万元。
    于是Alice银行生成了下列汇款请求信息:
    “向账户M-2653汇款100万元”
    Alice银行为该汇款请求信息计算出正确的MAC值,然后将MAC和消息一起发送给Bob银行

  • Bob银行用收到的消息自行计算MAC值,并将计算结果与收到的MAC值进行对比。由于两个MAC值相等,因此Bob银行判断该消息是来自Alice银行的合法汇款请求,于是向Mallory的账户M-2653汇款100万元。

  • Mallory窃听了Alice银行发给Bob银行的汇款请求消息以及MAC值,并保存在自己的计算机中

  • Mallory将刚刚保存下来的汇款请求消息以以及MAC值再次发给Bob银行

  • Bob银行用收到的消息自行计算MAC值,并将计算结果与收到的MAC值进行对比。
    由于两个MAC值相等,因此Bob银行判断该消息是来自Alice银行的合法汇款请求(误解),于是向Mallory的账户M-2653汇款100万元。

  • 这样执行100次后,Bob银行向Mallory的账户总计汇入
    100万元 x 100 = 1亿元,这时Mallory将这笔钱取出来

在这里,Mallory并没有破解消息认证码,而只是将Alice银行的正确MAC值保存下来重复利用而已,这种攻击方式称为重放攻击(reply attack)

有几种方式可以防御重放攻击。
序号
约定每次都对发送的消息赋予一个递增的编号(序号),并且在计算MAC值事将序号也包含在消息中。这样一来,由于Mallory无法计算出序号递增之后的MAC值,因此就可以防止重放攻击,这种方式虽然有效,但是每个通信对象都需要记录一个消息的序号。
时间戳
约定在发送消息时包含当前的时间,如果收到以前的消息,即便MAC值正确也将其当作错误的消息来处理,这样就能够防御重放攻击。
这种方法虽然有效,但是发送者和接收者的时钟必须一致,而且要考虑到通信的延迟,必须在时间的判断上留下缓冲,于是多多少少还是会存在可以重放攻击的空间。

MAC无法解决的问题
对第三方证明
假设Bob在接收到了来自Alice的消息之后,想要向第三方验证者Victor证明这条消息的确是Alice发送的,但是用MAC无法进行这样的证明,
首先,Victor要校验MAC值,就需要知道Alice和Bob之间共享的密钥

假设Bob相信Victor,同意将密钥告诉Victor,即便如此,Victor也无法判断这条消息是由Alice发送的,因为Victor认为:“即便MAC值是正确的,发送这条消息的人也不一定是Alice,还有可能是Bob。"

防止否认

假设Bob收到了包含MAC值得消息,这个MAC值是用Alice和Bob共享得密钥计算出来的,因此Bob能够判断这条消息的确来自Alice。

但是,Bob无法向验证者Victor证明这一点,也就说,发送者Alice可以向Victor声称:“我没有向Bob发送过这条消息。”这样的行为就是否认。

Alice可以说:“这条消息是Bob自己编的吧”
即便Bob拿MAC值来举证,Victor也无法判断Alice和Bob谁的主张才是正确的,也就是说,用MAC无法防止否任(nonrepudiation)

http://www.xdnf.cn/news/15238.html

相关文章:

  • skywalking镜像应用springboot的例子
  • 【设计模式】单例模式 饿汉式单例与懒汉式单例
  • jenkins自动化部署前端vue+docker项目
  • 并发--Callable vs Runnable
  • 代码随想录算法训练营第三十二天|LeetCode 509 斐波那契数,LeetCode 70 爬楼梯,LeetCode 746 使用最小花费爬楼梯
  • 笔记-分布式计算基础
  • 云计算三大服务模式深度解析:IaaS、PaaS、SaaS
  • zynq-PS篇——bperez77中DMA驱动注意事项
  • 飞算 JavaAI 智能编程助手:颠覆编程旧模式,重构新生态
  • 深入解析Java的G1收集器:原理、实战与优缺点
  • Umi-OCR 的 Docker安装(win制作镜像,Linux(Ubuntu Server 22.04)离线部署)
  • 企业采购成本越来越贵?根源在哪,数据怎么分析?
  • 奇哥面试记:SpringBoot整合RabbitMQ与高级特性,一不小心吊打面试官
  • 供应链管理-计划:产能策略
  • Java 并发AQS为什么是双向链表
  • [面试] 手写题-选择排序
  • 学习C++、QT---20(C++的常用的4种信号与槽、自定义信号与槽的讲解)
  • JavaAI时代:重塑企业级智能开发新范式
  • 秋招小白学数据结构-1-数据结构前置知识
  • 面向构件的编程(COP)深度解析:构建模块化系统的工程范式
  • Linux_3:进程间通信
  • (六)复习(OutBox Message)
  • 游戏的程序员会不会偷偷改自己账号的数据?
  • C++迭代器失效
  • 数据结构 顺序表(3)---顺序表的应用
  • 计算机基础:内存模型
  • 深入理解JVM的垃圾收集(GC)机制
  • 【U-Boot】Shell指令
  • 今日行情明日机会——20250711
  • 运行ssh -T git@github.com报错