跳转至

第六章:消息认证码

在密码学中,消息认证码(英语:Message authentication code,缩写为MAC),又译为消息鉴别码、文件消息认证码、讯息鉴别码、信息认证码,是经过特定算法后产生的一小段信息,检查某段消息的完整性,以及作身份验证。它可以用来检查在消息传递过程中,其内容是否被更改过,不管更改的原因是来自意外或是蓄意攻击。同时可以作为消息来源的身份验证,确认消息的来源。

一. 消息认证码简介

消息认证实际上是对消息本身产生一个冗余的信息-MAC消息认证码, 消息认证码是利用密钥对要认证的消息产生新的数据块并对数据块加密生成的。它对于要保护的信息来说是唯一和一一对应的。因此可以有效地保护消息的完整性。以及实现发送方消息的不可抵赖和不能伪造。

1. MAC 函数

消息认证码(MAC)函数是消息和密钥的公开函数, 它产生定长的值, 以该值作为认证码。 MAC 函数有如下形式的定义:MAC = Ck(M), 其中M为一个变长消息, K是收发双方共享的密钥, C(k)M是定长的认证码。

1.1.MAC 函数的安全性要求如下
  • 攻击者已知 M 和 Ck(M), 则他构造满足 Ck(M1)=Ck(M)的消息 M1 在计算上是不可行的。
  • Ck(M) 应是均匀分布的, 即对任何随机选择的消息 M 和 M1, Ck(M1)=Ck(M)的概率是 2^-n, 其中 n 是 MAC 的比特长度。
  • 设 M1 是 M 的某个已知的变换, 即 M1=f(M). 例如: f可表示逆转M的一位或多位, 那么 Ck(M1)=Ck(M) 的概率是2^-n。

第一个要求可以防止攻击者制造出和给定 MAC 匹配的新消息。 第二个要求是为了阻止基于选择明文的穷举攻击。 最后一条要求认证算法对消息的某部分或位不应比其它部分或位更弱。

目前的现状是,人们比较喜欢使用 Hash 函数来设计消息认证码,关于 Hash 函数,请去阅读单向散列函数相关的章节。原因是 Hash函数具有以下这些特征:

  • 一般像 MD5, SHA-1, Blake2 这样的 Hash 函数, 其软件执行速度比诸如 DES 和 AES 这样的分组密码算法要快.
  • 可利用密码 Hash 函数代码库。
  • 美国或其他国家对密码 Hash 函数没有出口限制, 而对即使是用于 Mac 的对称分组密码都有出口限制。

Hash 函数不依赖于密钥, 所以不能将其直接用于 MAC。目前已经提出了许多将密钥加到 Hash 函数中的方案, 包括 UMAC 和 HMAC 等。 其中, HMAC 是目前最受欢迎的方案, 它被选为 IP 安全解决方案中实现 MAC 必须使用的方法, 并且其它 Internet 协议, 如安全套接协议 SSL 中也使用了 HMAC。下面我们会介绍几种常用的消息认证码算法。

二. HMAC算法

1.HMAC算法介绍

HMAC算法是由 H.krawcyzk, M.Bellare, R.Canetti 于1996 年提出的一种基于 Hash 函数和密钥进行消息认证的方法。 HMAC 所能提供的消息认证包括两方面的内容:

  • 消息完整性认证: 能够证明消息内容在传送过程中没有被修改。
  • 信源身份认证: 因为通信双方共享了认证的密钥, 接收方能够认证发送该数据的信源与所宣称的一致, 即能够可靠的确认接收的消息与发送的一致.

RFC20 给出的 HMAC 算法的设计目标如下:

  • 不必修改而直接使用现有 Hash 函数, 特别地,很容易免费得到软件上执行速度较快的 Hash 函数及其代码。
  • 如果找到或者需要更快或更安全的 Hash 函数, 应能很容易地替代原来嵌入的 Hash 函数。
  • 应保持 Hash 函数原有的性能, 不能过分降低其性能。
  • 对密钥的使用和处理应较简单。
  • 如果已知嵌入的 Hash 函数的强度, 则完全可以知道认证机制抗密码分析的强度。

设 H 是 HMAC 算法嵌入的 HASH 函数, M是 HMAC 作用的消息, 将M分组, 每个分组的长度为 b; K 是密钥, 其长度小于或等于b, 设 K+ 是把长度小于 b 的足用 0 填充 为 b 比特长的结果。ipad = 00110110(16 进制数 36)重复 b/8 次的结果, opad=01011100(16 进制数 5C)重复b/8次的结果。HMAC 算法描述如下: .: .:

即为以下步骤: - 在密钥 K 后面添加 0 来创建一个字长为 b 的字符串。 - 将上一步生成的 b 字长的字符串与 ipad 做异或运算。 - 将消息 M 的数据流填充至第二步的结果字符串中. - 用 H 作用于第三步生成的数据流。 - 将第一步生成的b 字长字符串与 opad 做异或运算。 - 再将第四步的结果填充进第五步的结果中. - 用 H 作用于第六步生成的数据流, 输出最终结果。

HMAC 算法的构造考虑到了 HASH 函数的缺陷, 在一定程度增加了攻击的难度。

HMAC 算法的密钥可以是任意长度, 当密钥长度比 Hash 曲函数的分组长度更长时, 要对密钥进行 Hash 运算, 用它的摘要作为 HMAC 使用的密钥。但是, 当密钥长度小于 Hash 函数输出 Hash 值的长度时,将降低HMAC 算法的安全性,因此推荐的密钥最小长度是嵌入 Hash 函数输出 Hash 值的长度。 长度大于 Hash 函数输出 Hash 值长度的密钥是可以接受的, 但是额外的长度并不能显著的提高 HMAC 算法的安全性。 另外, 密钥必须随机选取(或使用强壮的基于随机种子的伪随机生成方法), 并且要周期性的更新。 周期性地更新密钥是对付函数和密钥所存在的潜在缺陷的基本安全措施, 可以降低泄漏密钥带来的危害。

2.HMAC 的安全性

HMAC 算法的构造考虑到了 Hash 函数的缺陷, 它通过二次 Hash 运算修正了 Hash 函数的缺陷, 而且在密钥的作用下使 Hash 函数的值域没有缩小。 HMAC 的设计者考虑了不同攻击模型的攻击代价, 考虑到离线攻击比在线攻击更易于完成, 在构造 HMAC 时特别在二次 Hash 运算中也使用了密钥, 加强了对离线攻击的抵御能力。

HMAC 算法的安全性依赖于嵌入的 HASH 函数的安全性, 目前对 HMAC 算法最有力的攻击基于对 HASH 函数的碰撞攻击。 如果采用生日攻击, 在不更换 HMAC 算法的密钥的前提下, 对于嵌入输出摘要长度为 n 比特的 HASH 函数, 需要对大约2^n/2 个消息计算摘要, 才能找到一个碰撞。这在计算上是不可行的,因此,在现有的条件下, 生日攻击对 HMAC 算法基本不可行, 除非所嵌入的 HASH 函数存在严重的缺陷和冲突。由于 MD5 和 SHA-1 算法已经被破解,所有在选择嵌入 Hash 函数的时候一定要慎重,千万不要选择已经被破解的算法。

同时, HMAC 的安全性也依赖于密钥。 密钥的安全性依赖于密钥的长度和随机性。用 HMAC 进行消息认证时,应该选择随机密钥或使用密码伪随机序列生成器生成的密钥。密钥的长度不能小于 HASH 函数输出 HASH值的长度, 要采用安全的密钥协商机制,要尽量频繁地更新密钥,并对密钥进行良好地安全防护。 这些都是维护 HMAC 消息认证安全性的基本要素。如果攻击者无法破解密钥,即使攻击者找到了 HASH 函数的碰撞也无法伪造消息从而对 HMAC 消息认证进行有效的攻击。 所以, 在保证密钥安全性的前提下, HMAC 消息认证要比单纯的用 HASH 函数进行消息认证具有更高的安全性。

三. UMAC算法

四.总结