更新时间:2022-08-25 16:55
在密码学中,消息认证码(英语:Message authentication code,缩写为MAC),又译为消息鉴别码、文件消息认证码、讯息鉴别码、信息认证码,是经过特定算法后产生的一小段信息,检查某段消息的完整性,以及作身份验证。它可以用来检查在消息传递过程中,其内容是否被更改过,不管更改的原因是来自意外或是蓄意攻击。同时可以作为消息来源的身份验证,确认消息的来源。
非正式地,消息验证代码由三种算法组成:
对于安全的不可伪造的消息认证代码,在不知道密钥的情况下计算给定消息的有效标签在计算上是不可行的,即使在最坏的情况下,我们假设对手可以伪造除给定消息之外的任何消息的标签。
形式上,消息认证码(MAC)是有效算法(G,S,V)的三倍,满足:
如果对于每个有效的对手A,MAC是不可伪造的,
Pr (k←G(1), (x,t) ←A(1),x∉ Query(A, 1),V(k,x,t) =accepted)< negl(n),
其中AS(k,·)表示A有权访问oracle S(k,·),而Query(AS(k,·),1n)表示由A生成的S上的查询集,它知道n。显然,我们要求任何对手都不能直接查询S上的字符串x,否则该对手很容易获得有效的标签。
虽然MAC功能类似于加密散列函数,但它们具有不同的安全要求。为了被认为是安全的,MAC功能必须抵抗选择明文攻击下的存在性伪造。这意味着即使攻击者可以访问拥有密钥并为攻击者选择的消息生成MAC的oracle,攻击者也无法在不执行不可行数量的情况下猜测其他消息(不用于查询oracle)的MAC计算。
MAC与数字签名不同,因为MAC值都是使用相同的密钥生成和验证的。这意味着消息的发送方和接收方必须在启动通信之前就相同的密钥达成一致,如对称加密的情况。出于同样的原因,在网络范围的共享密钥的情况下,MAC不提供由签名提供的不可否认性的属性:任何可以验证MAC的用户也能够为其他消息生成MAC。相反,使用密钥对的私钥生成数字签名,该密钥对是公钥密码术。由于此私钥只能由其持有者访问,因此数字签名证明文档是由该持有者签署的。因此,数字签名确实提供了不可否认性。但是,可以通过将密钥使用信息安全地绑定到MAC密钥的系统来提供不可否认性。相同的密钥由两个人拥有,但是一个密钥的副本可用于MAC生成,而另一个密钥的副本在硬件安全模块中仅允许MAC验证。这通常在金融业中完成。
消息完整性代码(MIC)经常替代术语MAC,尤其是在通信中,其中首字母缩写词MAC传统上代表MAC地址(媒体访问控制地址)。但是,一些作者使用MIC来引用消息摘要,这与MAC不同,消息摘要不使用密钥。这种缺乏安全性意味着任何旨在用于衡量消息完整性的消息摘要都应加密或以其他方式防止篡改。创建消息摘要算法,使得给定消息将始终产生相同的消息摘要,假设使用相同的算法来生成两者。相反,MAC算法被设计为仅当相同的消息,秘密密钥和初始化向量被输入到相同的算法时才产生匹配的MAC。消息摘要不使用密钥,因此,当它们自己使用时,它们比MAC更不可靠地衡量消息完整性。因为MAC使用密钥,所以它们不一定需要加密以提供相同级别的保证。
RFC 4949建议避免使用术语“消息完整性代码”(MIC),而是使用“校验和”,“错误检测代码”,“散列”,“键控散列”,“消息验证代码”或“受保护的校验和”。
MAC算法可以由其他加密原语构建,例如加密散列函数(如HMAC的情况)或来自分组密码算法(OMAC,CBC-MAC和PMAC)。 然而,许多最快的MAC算法(如UMAC和VMAC)都是基于通用散列构建的。
另外,MAC算法可以有意地组合两个或更多个加密原语,以便即使后来发现其中一个易受攻击也能保持保护。 例如,在传输层安全性(TLS)中,输入数据被分成两半,每个半部用不同的散列原语(MD5和SHA-1)处理,然后一起进行异或输出以输出MAC。
存在定义MAC算法的各种标准。 这些包括:
ISO / IEC 9797-1和-2定义了可用于任何分组密码或散列函数以及各种不同参数的通用模型和算法。 这些模型和参数允许通过指定参数来定义更具体的算法。 例如,FIPS PUB 113算法在功能上等同于具有填充方法1的ISO / IEC 9797-1 MAC算法1和DES的分组密码算法。
在此示例中,消息的发送方通过MAC算法运行它以生成MAC数据标记。 然后将消息和MAC标签发送到接收器。 接收器依次使用相同的密钥通过相同的MAC算法运行传输的消息部分,产生第二MAC数据标签。 接收器然后将在传输中接收的第一MAC标签与第二生成的MAC标签进行比较。 如果它们相同,则接收器可以安全地假设在传输期间消息未被改变或篡改(数据完整性)。
然而,为了允许接收器能够检测重放攻击,消息本身必须包含确保该相同消息只能被发送一次的数据(例如,时间戳,序列号或使用一次MAC)。 否则,攻击者可能甚至不了解其内容,记录此消息并在以后播放,产生与原始发件人相同的结果。
一次性MAC
通用散列,特别是成对独立散列函数,只要密钥最多使用一次,就提供安全的消息验证代码。 这可以被视为一次性认证。
最简单的这种成对独立散列函数由随机密钥key=(a,b)定义,并且消息m的MAC标签被计算为tag =(am + b)mod p,其中p是prime。
一般地,只要对于k路独立散列函数使用小于k次的密钥,k独立散列函数就提供安全消息认证码。