目录
1.什么是MAC
2.CMAC
3.HMAC
4.小结
1.什么是MAC
MAC全称Message authentication code,是经过特定算法后产生的一小段数据信息,用于校验某数据的完整性和真实性。在数据传递过程中,可检查其内容是否被更改过,不管更改的原因是来自意外或是蓄意攻击。同时可以作为数据来源的身份验证,确认数据的来源。常见的MAC算法包括CMAC和HMAC。
2.CMAC
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
- 使用AES_KEY对全0输入块加密得到变量L;
- K1生成:如果L的最高有效位为0,K1 = L << 1; 如果L的最高有效位为1,K1 = const_Rb⊕( L << 1)。
- K2生成:如果K1的最高有效位为 0, K2 = K1 << 1; 如果K1的最高有效位为 1, K2 = const_Rb⊕( K1<< 1)。
特别是,针对数据不是数据块整数倍的情况,需要对最后一块进行填充,填充方式为
b (t) ||10...0,填充长度 = 数据块-len(t)。
需要注意的是,生成的MAC(也成TAG)长度是可以截取的,根据标准推荐,绝大部分应用应该至少保证8个字节长度的MAC,以抵御猜想攻击。
3.HMAC
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))
其中,
- H():某Hash函数;
- K:私钥;
- K1:有私钥K派生出的密钥
- 填充opad:outer pad,固定0x5c5c..5c 填充至hash算法分块大小;
- 填充ipad:inner pad,固定0x3636...36填充至hash算法分开大小;
具体步骤如下:
- 判断Len(K) == B(Hash函数分块大小),如是,设置K1 = K,直接进入第3步;如不是,进入第2步;
- 如果Len(K) > B,则需要使用hash函数对K进行处理,得到L字节长度字符串(例如SHA256可以得到32byte摘要值),并在该L字符串后补0到B字节长度 L||00..00,整体作为K0;如果Len(K)<B,则直接填充00到B字节长度作为K0;
- 将K0与ipad进行异或得到值Si,作为m的头部分,记为Si || m;
- 对Si || m进行hash处理,得到摘要MAC1;
- 将K0与opad进行异或得到值So,作为MAC1的头部分,记为So || MAC1;
- 再对So || MAC1进行hash处理,得到最终摘要MAC(m)。
以SHA-256为例,每组分块为512bit,得到32byte摘要值,具体流程如下:
图 3 HMAC-SHA256过程
4.小结
可以看到HMAC、CMAC均可以保证数据的完整性和真实性,RFC2104 HMAC于1997年发布,CMAC于2006年发布,针对HMAC的测试向量更容易在网上找到,并且由于HMAC不涉及加解密,在效率上应该更快一点。
但是从实际角度看,汽车行业多用AES-CMAC,猜想应该是很多MCU最开始就是根据SHE规范设计的硬件加速引擎,里面就要求使用CMAC,其次就是针对CAN通信,使用AES-CMAC在分组填充上更为优化,毕竟标准can一帧数据才8byte。总体而言,随着汽车芯片对信息安全重视程度不断提高,HSM支持的算法将会越来越多,包括国密SM2\3\4等等,这让我们在使用上会更加灵活。