《图解密码技术 (认证)》第八章 —— 消息认证码


一、本章学习内容

 使用消息认证码可以确认自己收到的消息 是否就是发送者的本意,也就是说,使用消息认证码可以 判断消息是否被篡改,以及 是否有人伪装成发送者 发送了该消息。
 消息认证码是密码学家工具箱中 6个重要的工具之一。我们来回忆一下,这 6个重要工具分别是:对称密码、公钥密码、单向散列函数、消息认证码、数字签名、伪随机数生成器。


二、消息认证码

1、汇款请求是正确的吗

 假设现在有两家银行:Alice银行 和 Bob银行,Bob银行 收到的请求内容是 “从账户 A-5374 向账户 B-6671 汇款 1000万 元“。
 上一章介绍了当攻击者 Mallory 篡改了消息时,应该如何检测消息的 ”完整性“。但是,如果 攻击者 Malloty 伪装 成 Alice银行 该怎么办呢?
 现在我们需要关注的问题是汇款请求 (消息) 的 “完整性”“认证” 这两个性质。

  • 完整性:“消息没有被篡改” 这一性质,也称为 一致性
  • 认证:“消息来自正确的发送者” 这一性质

2、什么是消息认证码

 消息认证码 Message Authentication Code,是一种确认 完整性 并进行 认证 的技术,简称 MAC
 消息认证码的 输人 包括 任意长度的消息一个发送者与接收者之间共享的密钥,它可以 输出 固定长度的 数据,这个数据称为 MAC值
 根据任意长度的消息输出固定长度的数据,这一点和 单向散列函数 很类似。但是,消息认证码中则需要使用 发送者与接收者之间共享的密钥

 可以暂且这样理解:消息认证码是一种与密钥相关联的单向散列函数,如 图8-1 所示。

  • 认证的实现:要计算 MAC 必须持有共享密钥,没有共享密钥的人就无法计算正确的 MAC值。
  • 完整性的保证:哪怕消息中发生 1比特的变化,MAC值 也会产生变化
    在这里插入图片描述

3、消息认证码的使用步骤

在这里插入图片描述

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

4、消息认证码的密钥配送问题

 从上面的过程可以看出,消息认证码也涉及到 密钥配送问题,即 共享密钥是绝对不能被 攻击者Mallory 偷听到的。这与 第三章 对称密码 中的很相似。要解决密钥配送问题,我们需要像对称密码一样使用一些共享密钥的方法,例如 公钥密码、Diffie-Hellman 密钥交换、密钥分配中心,或者使用其他安全的方式发送密钥等
 根据具体的目的来进行选择。


三、消息认证码的应用实例

1、SWIFT

 SWIFT 的全称是 Society for Worldwide Interbank Financial Telecommunication (环球银行金融电信协会),是于1973年成立的一个组织,其目的是为国际银行间的交易保驾护航。
 在使用公钥密码进行密钥交换之前,消息认证码所使用的共享密钥都是由人来进行配送的。

2、IPsec

 IPsec 是对互联网基本通信协议 —— IP 协议 增加安全性的一种方式。在 IPsec 对通信内容的认证和完整性校验都是采用消息认证码来完成的。

3、SSL/TLS

 SSL/TLS 是我们在网上购物等场景中所使用的通信协议。
 SSL/TLS 中对通信内容的认证和完整性校验也使用了消息认证码。关于 SSL/TLS 我们将在 第14章 中详细介绍。


四、消息认证码的实现方法

1、使用单向散列函数实现

 使用SHA-2 之类的单向散列函数可以实现消息认证码,其中一种实现方法称为 HMAC,具体步骤我们将在下节介绍。

2、使用分组密码实现

 使用 AES 之类的 分组密码 可以实现消息认证码。
 将 分组密码的 密钥 作为 消息认证码的 共享密钥 来使用,并用 CBC模式 (第4章)消息 全部加密。此时,初始化向量 IV 是固定的。由于消息认证码中 不需要解密,因此将 除最后一个分组外的 密文部分 全部丢弃,而将 最后一个分组 用作 MAC值。由于 CBC模式 的 最后一个分组 会受到 整个消息以及密钥 的双重影响,因此可以将它用作消息认证码。例如,AES-CMAC (RFC4493) 就是一种基于 AES 来实现的消息认证码。

3、其他实现方法

流密码公钥密码 等也可以实现消息认证码。


五、认证加密

认证加密 缩写为 AE 或 AEAD,是一种将 对称密码消息认证码 相结合,同时满足 机密性、完整性和认证 三大功能的机制。(AE:Authenticated Encryption,AEAD : Authenticated Encryption with Associated Data)

 有一种认证加密方式叫作 Encrypt-then-MAC (先加密,再计算MAC值),这种方式是 先用对称密码将明文加密然后计算密文的 MAC值。在 Encrypt-then-MAC 方式中,消息认证码的 输人 消息是 密文,通过 MAC值 就可以判断 ”这段密文的确是由知道明文和密钥的人生成的”
 使用这一机制,我们可以防止 攻击者Mallory 通过发送 任意伪造的密文,并让服务器解密来套取信息的攻击 (选择密文攻击,参见 5.7.5 节)。

 除了 Encrypt-then-MAC 之外,还有其他一些认证加密方式,如 Encrypt-and-MAC (将明文用对称密码加密,并对明文计算 MAC值)和 MAC-then-Encrypt (先计算明文的 MAC值,然后将明文和 MAC值 同时用对称密码加密)。

1、GCM 与 GMAC

 ***GCM (Galois/Counter Mode) 是一种认证加密方式。GCM 中使用 AES 等 128比特分组密码的 CTR 模式 (参见 4.7 节),并使用一个 反复进行加法和乘法运算的散列函数 来计算 MAC值。由于 CTR模式 的本质是 对递增的计数器值进行加密,因此可通过 对若行干分组进行 并行处理提高运行速度
 此外,由于 CTR模式 中,加密MAC值 的计算使用的是 相同的密钥,因此在 密钥管理 方面也更加容易。

专门用于消息认证码的 GCM 称为 GMAC。在《CRYPTREC 密码清单》[CRYPTREC] 中,GCM 和 CCM (CBC Counter Mode) 都被列为了推荐使用的认证加密方式。


六、HMAC 的详细介绍

1、什么是 HMAC

HMAC 是一种使用 单向散列函数 来构造 消息认证码 的方法 (RFC2104),其中 HMAC 的 H 就是 Hash。
HMAC 中所使用的 单向散列函数不仅限于一种,任何高强度的单向散列函数都可以被用于 HMAC,如果将来设计出新的单向散列函数,也同样可以使用。

2、HMAC 的步骤

在这里插入图片描述

  1. 密钥填充
     如果 密钥单向散列函数的分组长度1,就需要 在末尾填充 0,直到其长度达到单向散列函数的分组长度为止。
     如果 密钥分组长度,则要用 单向散列函数 求出 密钥的散列值 (也就是将一个比较长密钥进行哈希处理,变成一个比较短的值,单向散列函数输出的长度往往是固定的),然后将这个散列值用作 HMAC 的密钥
  2. 填充后的密钥与 ipad 的 XOR
     将 填充后的密钥被称为 ipad 的比特序列 进行 XOR 运算。ipad 是将 00110110 (十六进制 0x36) 这一比特序列,不断循环反复 直到达到分组长度 所形成的比特序列,其中 ipad 的 i 是 inner (内部) 的意思。
     所得到的值,就是一个 和单向散列函数的分组长度相同,且 和密钥相关 的比特序列。这里我们将这个比特序列称为 ipadkey
  3. 与消息组合
     随后,将 和密钥相关的比特序列,ipadkey,附加在消息的 开头
  4. 计算散列值
     将 3. 的结果 输人 单向散列函数,并计算出散列值。
  5. 填充后的密钥与 opad 的 XOR
     将 填充后的密钥被称为 opad 的比特序列 进行 XOR运算。opad 是将 01011100 (十六进制的 0x5C) 这一比特序列,不断循环反复 直到达到分组长度 所形成的比特序列,其中 opad 的 o 是 outer(外部) 的意思。
     所得到的结果也是一个 和单向散列函数的分组长度相同,且 和密钥相关 的比特序列。这里我们将这个比特序列称为 opadkey在这里插入图片描述
  6. 与散列值组合
     将 4. 的散列值拼在 opadkey 后面。
  7. 计算散列值
     将 6. 的结果输入 单向散列函数,并计算出散列值。这个散列值就是 最终的 MAC值

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


七、对消息认证码的攻击

1、重放攻击

 狡猾的主动攻击者 Mallory 想到可以通过 将事先保存的正确 MAC值 不断重放 来发动攻击,如果这种攻击成功的话,就可以让 100万元 滚雪球般地变成 1亿元。

  1. Malloiy 窃听到 Alice银行 与 Bob银行 之间的通信。
  2. Mallory 到 Alice银行 向自己在 Bob银行 中的 账户M-2653 汇款 100万元。于是 Alice银行 生成了汇款请求消息 “向账户M-2653 汇款 100万元”,Alice银行 为该汇款请求消息计算出正确的 MAC值,然后将 MAC 和 消息 一起发送给 Bob银行。
  3. Bob银行 用收到的消息 自行计算 MAC值,并将计算结果与 收到的 MAC值 进行对比。由于两个 MAC值 相等,因此 Bob银行 判断该消息是来自 Alice银行 的合法汇款请求,于是向 Mallory 的账户M-2653 汇款 100万元。
  4. Mallory 窃听了 Alice银行 发给 Bob银行 的汇款请求消息以及 MAC值,并保存在自己的计算机中。
  5. Mallory 将刚刚保存下来的 汇款请求消息 和 MAC值 再次发给 Bob银行。接下来会重复执行 第三步,又向 Mallory 的账户汇款 100万元。且该操作可以不断重复。

 在这里,Mallory 并 没有破解消息认证码,而只是将 Alice银行 的 正确MAC值 保存下来重复利用而已。这种攻击方式称为 重放攻击 replay attack,如 图8-4 所示。在这里插入图片描述
 有几种方法可以抵御重放攻击:

  1. 序号
     约定每次都对 发送的消息 赋予一个 递增的 编号 (序号),并且在计算 MAC值 时将序号也包含在消息中。这样一来,Mallory 就无法计算序号递增之后的 MAC值了。
  2. 时间戳
     约定在发送消息时包含 当前的时间,如果收到 以前的消息,即便 MAC值 正确 也将其当做 错误的消息 来处理,这样就能够防御重放攻击。
     但是发送者和接收者的时钟必须一致,考虑到通信的延迟,必须在时间判断上留下一定的缓冲时间,这样就留下了被重放攻击的可能。
  3. nonce
     在通信之前,接收者先向发送者发送一个 一次性的 随机数,这个随机数一般称为 nonce。发送者在 消息中 包含这个 nonce 并计算 MAC值。由于 每次通信时 nonce 的值 都会发生 变化,因此无法进行重放攻击。这种方法虽然有效,但 通信的数据量 会有所 增加

2、密钥推测攻击

 和对单向散列函数的攻击一样,对消息认证码也可以进行 暴力破解 (7.8.1节) 以及 生日攻击 (7.8.2节)
 对于消息认证码来说,应 保证不能根据 MAC值 推测出通信双方所使用的 密钥。如果主动攻击者 Mallory 能够 从 MAC值 反算出 密钥,就可以进行篡改、伪装等攻击。例如 HMAC 中就是利用 单向散列函数单向性抗碰撞性 来保证无法根据 MAC值 推测出密钥的。
 此外,在 生成消息认证码所使用的 密钥 时,必须使用 密码学安全的、高强度的 伪随机数生成器。如果密钥是人为选定的,则会增加密钥被推测的风险。


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

 例如 “对第三方证明” 和 “防止否认”,这两个问题就无法通过消息认证码来解决。

1、对第三方认证

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

 首先,Victor 要校验 MAC值,就需要知道 Alice 和 Bob 之间 共享的密钥
 假设 Bob 相信 Victor,同意将密钥告诉 Victor,即便如此,Victor 也无法判断这条消息是由 Alice 发送的,因为 Victor 可以认为:“即使 MAC值 是正确的,发送这条消息的人也不一定是 Alice,还有可能是 Bob“

 能够计算出 正确MAC值 的人 只有 Alice 和 Bob,在他们两个人之间进行通信时,可以断定 是对方 计算了 MAC值,这是因为共享这个密钥的双方之中,有一方就是自己。然而,对于第三方 Victor,Alice 或 Bob 却无法证明 是对方计算了 MAC值,而不是自己
 使用 第9章 中将要介绍的 数字签名 就可以实现对第三方的证明。

2、防止否认

 上面我们讲过,Bob 无法向验证者 Victor 证明 ”这条消息的确来自 Alice“,也就是说,发送者 Alice 可以向 Victor 声称:“我没有向 Bob 发送过这条消息。”这样的行为就称为 否认 repudiation)
 Alice 可以说 “这条消息是 Bob 自己编的吧”、“说不定 Bob 的密钥被主动攻击者 Mallory 给盗取了,我的密钥可是妥善保管着呢” 等。说白了,就是 Alice 和 Bob 吵起来了 (无法分辨谁是正确的)

 即便 Bob拿 MAC值 来举证,Victor 也无法判断 Alice 和 Bob 谁的主张才是正确的,也就是说,用消息认证码 无法 防止否认 nonrepudiation

 在这种情况下,使用 第9章 中将要介绍的 数字签名 就可以实现 防止否认


  1. 单向散列函数的分组,又称为哈希函数的块 (block),具体什么意思还不清楚。 ↩︎

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值