消息认证码

使用消息认证码可以判断消息是否被篡改,以及是否有人伪装成发送者发送了该消息。

消息认证码(Message Authentication Code,MAC)是一种确认完整性并进行认证的技术。

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

根据任意长度的消息输出固定长度的数据,这一点和单向散列函数很类似。但单向散列函数中计算散列值时不需要密钥,相对的,消息认证码中则需要使用发送者和接收者之间共享的密钥。

要计算 MAC 值必须持有共享密钥,没有共享密钥的人就无法计算 MAC 值,消息认证码正是利用这一性质来完成认证的。

和单向散列函数的散列值一样,哪怕消息中发生 1 比特的变化,MAC 值也会发生变化,消息认证码正是利用这一性质来确认完整性。

可以理解成消息认证码是一种与密钥相关联的单向散列函数。

消息认证码的使用步骤

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

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

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

要解决密钥配送问题,需要像对称密码一样使用一些共享密钥的方法,例如公钥密码、Diff-Hellman密钥交换、密钥分配中心,或者其他安全的方式发送密钥等。

消息认证码的实现方法

  • 使用单向散列函数实现,其中一种方法叫 HMAC。
  • 使用分组密码实现。
    将分组密码的密钥作为消息认证码的共享密钥来使用,并用 CBC 模式将消息全部加密。此时,初始化向量(IV)是固定的。由于消息认证码中不需要解密,因此将除最后一个分组以外的密文全部丢弃,而将最后一个分组用作 MAC 值。由于 CBC 模式的最后一个分组会受到整个消息以及密钥的双重影响,因此可以将它用作消息认证码。AES-CMAC 就是一种基于 AES 来实现的消息认证码。
  • 其他方法:流密码和公钥密码等也可以实现消息认证码。

认证加密

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

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

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

GCM与GMAC

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

专门用于消息认证码的 GCM 称为 GMAC。

HMAC

HMAC 是一种使用单向散列函数来构造消息认证码的方法,其中 HMAC 的 H 就是 Hash 的意思。

HMAC 中使用的单向散列函数并不仅限于一种,如果将来设计出新的单向散列函数,也可以使用。

使用 SHA-1、SHA-224、SHA-256、SHA-384、SHA-512 所构造的 HMAC,分别称为 HMAC-SHA-1、HMAC-SHA-224、HMAC-SHA-256、HMAC-SHA-384、HMAC-SHA-512。

HMAC 的步骤

1.密钥填充

如果密钥比单向散列函数的分组长度要短,就需要在末尾填充 0,直到其长度达到单向散列函数的分组长度为止。

如果密钥比单向散列函数的分组长度要长,则要用单向散列函数求出密钥的散列值,然后将这个散列值用作 HMAC 的密钥。

2.填充后的密钥与 ipad 的 XOR

将填充后的密钥与被称为ipad的比特序列进行 XOR 运算。ipad是将00110110这一比特序列(即16进制的36)不断循环反复直到达到分组长度所形成的的比特序列,其中ipadiinner(内部)的意思。

XOR 运算所得到的值就是一个和单向散列函数的分组长度相同,且和密钥相关的比特序列(ipadkey)。

3.与消息组合

ipadkey与消息组合,也就是将和密钥相关的比特序列(ipadkey)附加在消息的开头。

4.计算散列值

将第3步的结果输入单向散列函数,并计算出散列值。

5.填充后的密钥与 opad 的 XOR

将填充后的密钥与被称为opad的比特序列进行 XOR 运算。opad是将01011100这一比特序列(即16进制的 5C)不断循环反复直到达到分组长度所形成的比特序列,其中opadoouter(外部)的意思。

XOR 运算所得到的结果也是一个和单向散列函数的分组长度相同,且和密钥相关的比特序列(opadkey)。

6.与散列值结合

将第4步的散列值拼在opadkey后面。

7.计算散列值

将第6步的结果输入单向散列函数,并计算出散列值。这个散列值就是最终的 MAC 值。

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

对消息认证码的攻击

重放攻击

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

  • 对第三方证明
  • 防止否认
打赏
  • Copyrights © 2017-2023 WSQ
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信