MAC 与 HMAC 技术辨析

很多技术人员以为消息验证码(MAC,message authentication code)就是 HASH 函数,或者是带密钥的 HASH 函数,并认为 MAC 就是 HMAC,混为一谈。这都是片面的、局部的。
其实这是一个完整性校验的技术系列。
先说 MAC,总体而言,MAC 是单向函数的一种实现,但两种又不一样。
区别之一
HASH 算法的作用之一是完整性校验,但不能确保消息是否被篡改,即只能确定发送过来的消息是完整的,但不能确定是谁发送的,是否被中间人篡改。MAC 则可以证明消息没有被篡改,证明消息是正确的发送者发送的,也就是消息是经过验证的。
如何确定消息是特定的发送者发送的?
通信双方共享同一个密钥,只有拥有密钥的双方才能使用和验证消息验证码。
两者的计算模型如下图所示:

MAC 值一般和原始消息一起传输,原始消息可以选择加密或不加密,或使用通信级加密如 https。通信双方会以相同的方式生成 MAC 值,然后进行比较,如果两个值相同,表示消息验证通过。要计算 MAC 必须持有共享密钥,没有共享密钥的人无法计算 MAC 值。
区别之二
MAC 函数可以用 MAC 函数来构造,就叫做 HMAC,也可以使用对称加密函数来构造。
主要原因是密码界对 HSAH 函数的研究比对称加密算法的研究要晚一些,早期的时候就有使用对称加密算法来构造单向散列函数的,比如在 unix 系统的口令认证里面,它把用户口令加盐之后作为密钥,对一个固定的 64 比特值重复使用 DES 加密 25 次,把结果作为散列值。这起到的作用与 HASH 函数是类似的。后来 HASH 算法研究成熟之后就趋向使用 HASH 来构造 MAC 函数了,一方面是由于 HASH 函数计算比对称密码算法快一些,另一方面,在一些国家对称密码算法限制出口,但 HASH 算法没有这方面的限制,所以人们更趋向用 HASH 来构造 MAC 函数。

评论