赞
踩
目录
MAC全称Message authentication code,是经过特定算法后产生的一小段数据信息,用于校验某数据的完整性和真实性。在数据传递过程中,可检查其内容是否被更改过,不管更改的原因是来自意外或是蓄意攻击。同时可以作为数据来源的身份验证,确认数据的来源。常见的MAC算法包括CMAC和HMAC。
CMAC全称Cipher-based message authentication codes,利用分组加密和私钥来生成MAC,用于验证消息的完整性和真实性,常见算法如AES-CMAC。
根据NIST 800-38B描述,CMAC算法的核心是CBC-MAC的一种变体OMAC1,该算法是为了解决CBC-MAC本身缺陷。
在2001年,John Black and Phillip Rogaway为了解决CBC-MAC缺陷,提出了改进措施,命名为XCBCa,但该改进措施所需密钥至少为3个,为此Tetsu Iwata and Kaoru Kurosawa 在2003年进一步提出One-key CBC MAC(OMAC),用于解决密钥长度问题。
CBC-MAC是最早的MAC算法,原理非常简单,就是使用CBC进行计算,取最后一个分区作为Tag,如下图:
图1 CBC-MAC
但该方式容易被攻击者构造新的数据\MAC,在消息长度不固定的情况下不安全。
CMAC仍旧基于CBC-MAC对消息数据进行处理,区别在于最后MAC生成时根据数据长度和派生的不同密钥进行处理,如下图所示:
图2 AES-CMAC的两种情况
- Case 1:消息数据是数据块的整数倍,使用私密密钥k1生成MAC(T);
- Case 2:消息数据不能整除,使用私密密钥k2生成MAC(T);
上图中,AES_KEY表示实际输入的K,K1、K2分别由AES_KEY进行派生,基本步骤如下:
两个使用到的常数:
const_Zero = 0x00000000000000000000000000000000
const_Rb(AES) = 0x00000000000000000000000000000087
const_Rb(DES\3DES) = 0x000000000000001B
特别是,针对数据不是数据块整数倍的情况,需要对最后一块进行填充,填充方式为
b (t) ||10...0,填充长度 = 数据块-len(t)。
需要注意的是,生成的MAC(也成TAG)长度是可以截取的,根据标准推荐,绝大部分应用应该至少保证8个字节长度的MAC,以抵御猜想攻击。
HMAC全称Keyed-Hashing for Message Authentication,同样是为了满足数据的完整性和真实性。
HMAC可以基于任何hash函数实现,例如SHA512、SHA-1、MD5等,而所谓Keyed-Hashing,是将密钥参与到Hash计算,而不是做任何加解密操作。
根据RFC 2104介绍,针对消息数据m的HMAC计算应采用如下公式:
MAC(m) = HMAC(K,m)= H( K1⊕opad) || H(K1⊕ ipad || m))
其中,
具体步骤如下:
以SHA-256为例,每组分块为512bit,得到32byte摘要值,具体流程如下:
图 3 HMAC-SHA256过程
可以看到HMAC、CMAC均可以保证数据的完整性和真实性,RFC2104 HMAC于1997年发布,CMAC于2006年发布,针对HMAC的测试向量更容易在网上找到,并且由于HMAC不涉及加解密,在效率上应该更快一点。
但是从实际角度看,汽车行业多用AES-CMAC,猜想应该是很多MCU最开始就是根据SHE规范设计的硬件加速引擎,里面就要求使用CMAC,其次就是针对CAN通信,使用AES-CMAC在分组填充上更为优化,毕竟标准can一帧数据才8byte。总体而言,随着汽车芯片对信息安全重视程度不断提高,HSM支持的算法将会越来越多,包括国密SM2\3\4等等,这让我们在使用上会更加灵活。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。