消息完整性和哈希函数

  • 1. Message Integrity - 消息的完整性
    • 1.1 消息安全性和消息完整性的联系
  • 2. Message Authentication Code - 消息认证码
    • 2.1 Defination
    • 2.2 MAC 安全的定义
    • 2.2 Replay Attacks - MAC的不足
    • 2.3 MAC Contruction for Fixed-length Message
    • 2.4 (Basic) CBC - MAC
      • 2.41 (Basic) CBC - Mac 的安全性问题
      • 2.42 能不能直接从tag里面恢复信息呢
      • 2.43 CBC - MAC Extension 解决长度不可变的问题
  • 3. Hash Function
    • 3.1 哈希函数的简介
    • 3.2 哈希函数的三个特性
      • 3.21 Unpredictability 不可预测性
      • 3.22 Preimage resistance 抗原像攻击
      • 3.23 哈希碰撞和生日攻击
    • 3.3 实践中的Hash Function
  • 4. HMAC
    • 4.1 Hash and MAC
    • 4.2 HMAC 的实现原理
  • 5. Authenticated Encryption - 认证加密术
  • 6. Secure Communication Sessions
    • 5.1 基本介绍
    • 5.2 各种攻击
    • 5.3 实现安全认证会话的方法

1. Message Integrity - 消息的完整性

前面我们很详细的讲解了 怎么保证信息的安全性, 从古典加密方式, 现代加密准则, 一次一密再到对称加密, 可以说我们安全方面的建设目前是有了一定的进展, 那么问题来了, 怎么保证消息的完整性呢? 首先我们来看下消息的安全性和消息的完整性的区别与联系

1.1 消息安全性和消息完整性的联系

  • 安全和完整是可以有一个而没有另一个的, 不同的策略针对了不同的目标

  • 加密可以检测消息的修改, 比如一个人修改了消息的密文导致解码的明文没有了意义, 这时我们就可以说这个消息被更改了, 但是这不是加密的意义, 加密的意义是为了防止消息被窃听, 对应了我们第一讲中的Interception:

    加密一般来说不提供任何完整性.

  • 完整性对应的是Fabrication 和 Modification

2. Message Authentication Code - 消息认证码

2.1 Defination

A message authentication code 是由3个算法定义的: Gen, Mac, Vrfy.

  1. Gen: 生成一个随机的key.
  2. Mac: 这一步是生成用于认证是否被更改的tag t.
    输入: key 和 message, 其实这个很好理解你要确保消息没被改动肯定要确保这个tag和源消息要联系在一起
    输出: tag t -> Mack(m)
  3. Vrfy:
    输入: tag t 和 message ∈ m {0,1}* (一个特定长度的bit串)
    输出: 如果接受的话(也就是没被改动的话)输出1, 不然拒绝的话(也就是被修改了或者丢失的话)输出0.

Vrfy~k~(m, Mac~k~(m) )=1

从这里是不是可以看出点问题, 这里的m根本不关心是密文还是明文, 因为我们根本不关心你的消息会不会被泄露, 我们只关心会不会有人来更改我们的数据, 如果有我们要有能力检测到并纠正.

下面我们来看下MAC的工作流程
在这里插入图片描述
本发送了一条信息, 并且附上了tag t, 这时候有个坏人掌控了他们的沟通信道, 在中间截获了消息并且发送了m’,t’ 接收方收到了这个更改后的消息, 这个坏人觉得大功告成了, 没想到接受放运行了verify算法后发现输出是0, 她意识到消息被更改了, 于是她通知对方去换一个安全的信道, 坏人的计划落空了. 在这里我们根本不关心秘密安不安全或者说我们就是明文传输不怕被别人看到, 但是我们关心信息有没有更改, 或者说发送方是不是接收方所期待的发送方.

2.2 MAC 安全的定义

  1. Threat model
    (1). Adaptive chosen-message attack” 自适应的选择明文攻击 (仅仅比选择暗文攻击差一个档次)
    (2). 假设攻击者可以诱导发送方对攻击者选择的消息进行身份验证 - 这和美军诱导日军发送密文是一样的选择明文
  2. Security goal
    (1). 存在性不可伪造
    (2). 攻击者不能在任何未被发送方认证的消息上添加虚假的标签
    一个满足上述定义的MAC可以在任何需要完整性的地方使用

2.2 Replay Attacks - MAC的不足


什么是重放攻击呢? 重放攻击就是, 针对已经有的一条信息, 我完全copy发送给对方或者持有相同加密秘钥的第三方, 比如俄罗斯 中国 英国 在一个群里, 俄罗斯跟中国说石油涨价吧, 中国说好, 攻击者这时把好给复制了, 下次俄罗斯说借我点钱, 攻击者直接代替中方回复好,问题就来了. 由于是完全copy所以不会出现tag和信息不对等的情况那么vrfy出来一定是1也就是说一定会判定信息没被修改过, 从某种程度上来讲, 这是对的, 但是它没有办法在这种办法上保证发的那个人是你期盼的那个人. 总的来说这个方法如果只靠MAC自己是不行的.

  1. 但也不是很难解决比如加上时间戳或者其它的状态.
  2. 这个攻击是无法被不加状态的无状态机防范的.

2.3 MAC Contruction for Fixed-length Message

这个Fixed-length Message 是不是很像block cipher 每个block 信息的长度都是固定的, 那我们自然而然的想到我们是不是能用block cipher的方式生成秘钥.

  1. 写一个 F function: length-perserving psedorandom function
  2. 用上面的F构建一个MAC π function
  3. 用 F 去生成一个独一无二的key
  4. Mack(m) = output Fk(m)
  5. Vrfyk(m,t): output 1 iff Fk(m) = t

在 F 确实是一个 length-perserving perdorandom function 的情况下, MAC π 是一个安全算法.
注意这里的安全指的是完整性领域的安全定义就像上面说过的一样.

但是这个是有一些drawbacks的比如说, block cipher 每个块都是有固定的长度的很短, 那我们这样的构建就被限制到了认证很短的, 固定长度的信息, 下一步我们要去认证长的长度可变的信息. authenticate long, variable length message.

这个其实对应了之前我们讲的 Electronic Codebook mode:

2.4 (Basic) CBC - MAC

这个东西是什么呢, 就是用了cipher block chain mode 的MAC, 其实很简单刚才能加密的少无非是因为每个块之间相互独立, 那我们把他们串起来用串起来的信息获得t不就行了, 串起来的信息包含了前面所有信息, 所以只要有一个信息更改那么t所对应的vrfy算法解出来一定是0.

最后只输出最后那个tag ti:ti=Fk[mi XOR Fk[mi-1]]

Fk对应了上面的length perseving pesudorandom function:
把每个块出来的tag t和下一个明文消息异或后在通入tag生成器里, 这样生成的tag就会带有前面所有的明文消息信息. 但是与之前的CBC-AES不同的是我们这里只输出最后一个tag, 大家有没有发现在这一节中tag几乎就等于上一届中的暗文, 因为这一节中tag背后的认证才是要保护的东西, 就像上一节中密文背后的明文才是要保护的东西一样.
这个 CBC - MAC 和 CBC mode 有什么不同呢?

  1. CBC-MAC 是 没有 initialization vector的 也就意味着如果两条消息一样那他们的tag也是一样的.
  2. In CBC-MAC, only the final value is outputted 那么接收方用这个和上面的mi理论上就能验证消息了

2.41 (Basic) CBC - Mac 的安全性问题

  • If F is a length-preserving pseudorandom function, then for anyfixed l, basic CBC-MAC is a secure MAC for messages of length l ⋅ n — I.e., the sender and receiver must agree on the length parameter l in advance
    这里面的l指的应该是一个block的块数, n 应该是每个block里存放的信息长度.

2.42 能不能直接从tag里面恢复信息呢

这个问题我们先回去看下当初CBC mode 是怎么解出信息的, 很简单:

  1. 用第一个密文反解出第一个中间明文
  2. 用第一个中间明文去和IV异或获得第一个明文
  3. 用第二个密文用同样的方法获得中间明文2
  4. 中间明文2去和上一步的密文1异或获得明文2
  5. 剩下的以此类推

这里面的关键其实是每一步都生成了并输出了当前round的密文 而我们这里的每一轮的tag是没有导出的
我们从图中直接看一下

  1. 先从最后一个tag用解密算法解出中间明文
  2. 但是这个时候需要上面的tag解出明文信息mi, 可是你上一步就没有导出哇怎么可能解出来

2.43 CBC - MAC Extension 解决长度不可变的问题

目前为止我们只解决了长度不够的问题, 现在要去解决长度不可变的问题, 因为上面也说了, 每个block的长度是需要提前定义好的这也是CBC - MAC 安全的一个必要条件.
这个问题其实都不是个问题, 你想想我们当初为了解决那个CBC mode 里面信息完全一样密文也会完全一样的问题加入了Initialization Vector 我们现在照样可以在每条信息中封装长度l 如下图所示:

其实就是在应用 (Basic) CBC - MAC 之前先预先确定长度.

3. Hash Function

3.1 哈希函数的简介

什么是Hash 函数呢, 哈希函数其实就是一个映射方式, 将一个随意长度(arbitrary length message) 映射成一个短的, 长度固定的摘要(digest).

哈希函数有keyed和unkeyed之分, keyed就是在上面的输入不只有M还有一个秘钥key, unkeyed就是输入只有arbitrary length 的message, 正式地来说, 哈希方程一般是keyed, 但是在实践中我们不用key, 因此在本节的讲述中我们只涉及unkeyed Hash Function.

3.2 哈希函数的三个特性

3.21 Unpredictability 不可预测性

任何信息的哈希值都是不可预测的, 即使三个输入之间只差2位哈希值也天差万别:

  • a is 01100001
  • b is 01100010
  • c is 01100011

    这也叫做抗第一原像攻击攻击: 攻击者无法通过分析不同信息的哈希值获得原信息的消息.

3.22 Preimage resistance 抗原像攻击

这个其实叫做抗第二原像攻击因为, 但攻击者发现无法发现信息间的差别他就会想那我能不能直接逆回去获得原消息, 不巧的是这个也无法实现, 因为哈希函数是一个 one-way function:

3.23 哈希碰撞和生日攻击

首先来看下什么叫做哈希碰撞, 其实很简单就是两个不同的输入对应了一个相同的哈希值.

举个例子现在有个网站有很多的客户映射成了哈希值, 那如果A, B的哈希值是相同的那么理论上A或者B就可以知道对方在此网站上的全部信息. 对于攻击者来说我前两种方法行不通那我就制造哈希碰撞去获得你们的信息. 那么什么时候哈希碰撞100%发生呢?