消息验证码(MAC)也可以称为消息认证码。

定义:

消息验证码(Message Authentication Code, MAC)是一种用于验证消息完整性真实性的密码学工具。

MAC 无法证明消息来源的唯一性(与数字签名不同)。

那么如何做到的呢?

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

消息认证码和单向散列函数的区别就在有没有这个共享密钥。消息认证码就是利用共享密钥进行认证的。

MAC 的工作原理、MAC 的生成和验证流程如下:

  • 生成 MAC(发送方)

    1. 输入:原始消息(Message) + 共享密钥(Secret Key)。
    2. 计算 MAC:通过特定算法(如 HMAC)生成固定长度的标签(MAC Tag)。
    3. 发送:将原始消息和 MAC Tag 一起发送给接收方。
  • 验证 MAC(接收方)

    1. 接收数据:获取消息和 MAC Tag。
    2. 重新计算 MAC:使用相同的密钥和算法对消息重新生成 MAC Tag。
    3. 比对:
      • 一致:消息未被篡改,且由合法发送方生成。
      • 不一致:消息可能被篡改,或密钥错误。

认证流程


MAC 的分类

  1. 基于哈希的 MAC(HMAC)

    • 原理:结合哈希函数(如 SHA-256)和密钥生成 MAC。
    • 特点:高效、标准化(RFC 2104),广泛用于 TLS、JWT 等协议。
  2. 基于分组密码的 MAC(如 CMAC)

    • 原理:使用分组密码算法(如 AES)生成 MAC。
    • 特点:适合硬件实现,资源受限场景常用。
  3. 其他类型

    • Poly1305:基于模运算的高效 MAC,与 ChaCha20 加密算法配合使用。
    • GMAC:基于伽罗华域的 MAC,用于 GCM 加密模式。

认证加密

什么是认证加密?

2000 年以后,人们基于认证的研究更加进一步,产生了认证加密 (AE:Authenticated Encryption,AEAD:Authenticated Encryption with Associated Data)。

认证加密是一种将对称密码和消息认证相结合的技术,同时满足加密性完整性认证性三大功能。


为什么需要认证加密?

传统的数据保护方案通常将加密和完整性验证分开处理(例如先加密数据,再单独计算MAC),但这种分离可能引入安全漏洞:

  • 加密不验证完整性:攻击者可篡改密文,导致解密后得到无意义但看似合法的数据(如填充错误)。
  • 组合方式错误:若加密与MAC的组合顺序不当(如先MAC后加密),可能遭受选择密文攻击(CCA)。
  • 效率低下:分开实现加密和MAC需要两次计算,增加延迟和资源消耗。

认证加密(AE/ AEAD) 通过将加密和认证原子化整合,从根本上杜绝了上述问题。


认证加密的种类:

  • 例如 Encrypt-then-MAC,先用对称密码将明文加密,然后计算密文的 MAC 值。Encrypt-and-MAC,将明文用对称密码加密,并对明文计算 MAC 值。

  • MAC-then-Encrypt,先计算明文的 MAC 值,然后将明文和 MAC 值同时用对称密码加密。(在 HTTPS 中,一般使用 MAC-then-Encrypt 这种模式进行处理。)

  • GCM(Galois/Counter Mode)是一种认证加密方式。GCM 中使用 AES 等 128 位比特分组密码的 CTR 模式,并使用一个反复进行加法和乘法运算的散列函数来计算 MAC 值。CTR 模式加密与 MAC 值的计算使用的是相同密钥,所以密钥管理很方便。专门用于消息认证码的 GCM 成为 GMAC。GCM 和 CCM (CBC Counter Mode) 都是被推荐的认证加密方式。


MAC的攻击手段

重发攻击

窃听者不直接破解消息认证码,而是把它保存起来,反复利用,这种攻击就叫做重放攻击(replay attack)

防止重放攻击可以有 3 种方法:

  • 序号

    每条消息都增加一个递增的序号,并且在计算 MAC 值的时候把序号也包含在消息中。这样攻击者如果不破解消息认证码就无法计算出正确的 MAC 值。这个方法的弊端是每条消息都需要多记录最后一个消息的序号。

  • 时间戳

    发送消息的时候包含当前时间,如果收到的时间与当前的不符,即便 MAC 值正确也认为是错误消息直接丢弃。这样也可以防御重放攻击。这个方法的弊端是,发送方和接收方的时钟必须一致,考虑到消息的延迟,所以需要在时间上留下一定的缓冲余地。这个缓冲之间还是会造成重放攻击的可趁之机。

  • nonce

    在通信之前,接收者先向发送者发送一个一次性的随机数 nonce。发送者在消息中包含这个 nonce 并计算 MAC 值。由于每次 nonce 都会变化,因此无法进行重放攻击。这个方法的缺点会导致通信的数据量增加。

密钥推测攻击

在消息认证码(MAC)中,密钥推测攻击(Key Guessing Attack) 是一种针对 MAC 密钥的暴力破解攻击。攻击者通过已知的明文-标签对(Message-Tag Pair),尝试猜测生成 MAC 的密钥,从而伪造合法标签,破坏 MAC 的安全性。

密钥推测攻击的原理

  1. 攻击目标:

    通过已知的明文 ( M ) 和对应的 MAC 标签 ( T ),逆向推导出生成 ( T ) 的密钥 ( K )。

    公式:$ ( T = \text{MAC}(K, M) \rightarrow \text{求 } K ) $。

  2. 攻击方式:

    • 暴力穷举:尝试所有可能的密钥 ( K' ),计算 $ ( \text{MAC}(K', M) ) $ ,直到 $ ( \text{MAC}(K', M) = T )$ 。
    • 字典攻击:使用预生成的常用密钥字典(如弱密码库),加速猜测过程。
  3. 攻击前提:

    • 攻击者至少掌握一个有效的明文-标签对 ( (M, T) )。
    • MAC 算法的密钥空间较小(如密钥长度过短)。

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

消息认证码虽然可以证明双方发送的消息是一致的,没有篡改,也不存在中间人伪装。但是它无法 “对第三方证明” 和 “防止抵赖”。

  • 无法 “对第三方证明” 原因是因为消息认证码中用到的密钥是共享密钥,通信双方都有这个密钥,所以对第三方无法证明消息到底出自双方中的哪一方。(解决 “第三方证明” 的问题需要用到数字签名)

  • 无法 “防止抵赖” 原因是也是因为消息认证码的共享密钥双方都有,无法判断消息是发自于哪一方。所以消息认证码无法防止否认(nonrepudiation)。(解决 “防止抵赖” 的问题需要用到数字签名)

Reference

https://halfrost.com/message_authentication_code/#toc-16

消息验证码(MAC)的介绍的更多相关文章

  1. EQueue - 一个C#写的开源分布式消息队列的总体介绍(转)

    源: EQueue - 一个C#写的开源分布式消息队列的总体介绍 EQueue - 一个纯C#写的分布式消息队列介绍2 EQueue - 详细谈一下消息持久化以及消息堆积的设计

  2. 消息队列 RocketMQ4.x介绍和新概念讲解

    消息队列 RocketMQ4.x介绍和新概念讲解 Apache RocketMQ作为阿里开源的一款高性能.高吞吐量的分布式消息中间件 RocketMQ4.x特点 支持Broker和Consumer端消 ...

  3. C# BS消息推送 SignalR介绍(一)

    1. 前言 本文是根据网上前人的总结得出的. 环境: SignalR2.x,VS2015,Win10 介绍 1)SignalR能用来持久客户端与服务端的连接,让我们便于开发一些实时的应用,例如聊天室在 ...

  4. 消息摘要算法-MAC算法系列

    一.简述 mac(Message Authentication Code,消息认证码算法)是含有密钥散列函数算法,兼容了MD和SHA算法的特性,并在此基础上加上了密钥.因此MAC算法也经常被称作HMA ...

  5. EQueue - 一个C#写的开源分布式消息队列的总体介绍

    前言 本文想介绍一下前段时间在写enode时,顺便实现的一个分布式消息队列equeue.这个消息队列的思想不是我想出来的,而是通过学习阿里的rocketmq后,自己用c#实现了一个轻量级的简单版本.一 ...

  6. kafka分布式消息队列 — 基本概念介绍

    [http://www.inter12.org/archives/818] 这个应该算是之前比较火热的词了,一直没时间抽出来看看.一个新东西出来,肯定是为了解决某些问题,不然不会有它的市场.先简单看下 ...

  7. SOD开源框架MSF(消息服务框架)介绍

    前言:之前想做消息的广播,拖着就忘记了,现在拿了医生的框架来学习,就按实现了之前想实现的功能. 传送门http://www.cnblogs.com/bluedoctor/,框架的获取,按传送门的链接就 ...

  8. rabbitmq - (消息队列) 的基本原理介绍

    介绍 MQ全称为Message Queue, 是一种分布式应用程序的的通信方法,它是消费-生产者模型的一个典型的代表,producer往消息队列中不断写入消息,而另一端consumer则可以读取或者订 ...

  9. 第五章 消息摘要算法--MAC

    注意:本节内容主要参考自<Java加密与解密的艺术(第2版)>第6章“验证数据完整性--消息摘要算法” 5.1.mac(又称为Hmac) 原理:在md与sha系列算法的基础上加入了密钥,是 ...

  10. 消息队列activeMq 使用介绍

      深入浅出 消息队列 ActiveMQhttp://blog.csdn.net/jwdstef/article/details/17380471 一. 概述与介绍 ActiveMQ 是Apache出 ...

随机推荐

  1. 你的边比较松弛:最短路的 Bellman-Ford 和 SPFA 方法

    Dijkstra 的局限性 在带权图的最短路径问题中,我们的目标是从一个起点出发,找到到达其他所有节点的最短路径.无论是交通导航中的最短耗时路线,还是金融网络中的最小成本路径,这一问题的核心始终是如何 ...

  2. TypeScript 中的 type 和 interface:你真的了解它们的不同吗?

    如果你有写过 Vue3 的项目,那么对 TypeScript 肯定不会陌生.不管是公司新项目技术选型还是个人学习开发新的前端项目,Vue3 + TypeScript 已经成为首选技术方案之一 在 Ty ...

  3. KUKA库卡机器人维修碰撞、电源、网络故障

    在进行库卡机器人的维修作业时,我们通常要遵循一系列经过精心设计和标准化的操作流程与步骤,以确保维修工作的切实有效以及机器人能够在安全的状态下运行.   针对库卡机器人维修中的故障原因分析,可以从以下几 ...

  4. 安川Yaskawa机器人DX100示教器维修的方法

    安川Yaskawa机器人DX100示教器维修的优劣势分析 安川Yaskawa机器人示教编程,工业机器人维修,即操作人员经过安川机器人示教器,ABB机器人保养,手动操控机器人的关节运动,以使机器人运动到 ...

  5. PowerJob:一款强大且开源的分布式调度与计算框架

      项目名称:PowerJob 项目作者:假诗人 开源许可协议:Apache-2.0 项目地址:https://gitee.com/KFCFans/PowerJob 项目简介 PowerJob(原Oh ...

  6. Deepseek学习随笔(7)--- 构建私人知识库(附网盘链接)

    Step 1:创建知识库 入口定位 登录 DeepSeek 控制台 → 左侧导航栏点击「知识库」→ 点击「新建知识库」按钮 基础设置 知识库名称:建议使用「领域+用途」命名法,如「医疗-糖尿病文献库」 ...

  7. JavaUtils - [03] 代码生成器(旧)

    题记部分 001 || 引入依赖 <!-- Code Generator --> <dependency> <groupId>com.baomidou</gr ...

  8. 探秘Transformer系列之(7)--- embedding

    探秘Transformer系列之(7)--- embedding 0x00 概要 在Transformer中,把每个 Token(对应离散的输入数据,如单词或符号)映射到高维稠密向量空间的工作是由嵌入 ...

  9. Hi3516EV200 编译环境配置及交叉编译软件包

    基础信息 OS: Ubuntu 16.04 xenial SDK 版本: Hi3516EV200R001C01SPC012 - Hi3516EV200_SDK_V1.0.1.1 SDK 包路径:Hi3 ...

  10. Polar困难模式部分题解

    choose from pwn import *from LibcSearcher import *context.terminal = ["tmux","splitw& ...