Message Authentication Codes

前面我们聊了数字签名,这一节来看看Message authentication codes,也叫MAC,中文消息认证

MAC是用来做什么的?和数字签名有什么不同?

一句话,所谓消息认证,就是为了防止消息篡改,数字签名也可以防止消息篡改,两者的不同在于:

  • 消息认证一般是用在对称加密系统,通信双方共享一个秘钥
  • 数字签名是用在非对称加密系统,也就是公钥私钥加密

MAC和哈希很像:

  • 哈希是对给定的一个数据进行哈希计算,得到一个哈希值
digest = HASH(msg)
  • MAC是对给定的一个数据加上通信双方共享的秘钥,这两个参数,通过MAC算法得到的一个authentication code,认证码。
auth_code = MAC(key, msg)

MAC算法

最常见的MAC算法都是基于哈希的,我们称之为HMAC (Hash-based MAC, 比如HMAC-SHA256)。

使用Python计算HMAC-SHA256:

>>> import hashlib, hmac, binascii
>>>
>>> mac = hmac.new(b'key', b'some msg', hashlib.sha256).digest()
>>> print(binascii.hexlify(mac))
b'32885b49c8a1009e6d66662f8462e7dd5df769a7b725d1d546574e6d5d6e76ad'
>>>

MAC的使用场景

mkdocs

  • 通信双方共享一个秘钥,并且协商好MAC的算法(比如HMAC-SHA256)
  • 消息发送方把未加密的消息,连同消息+秘钥计算出的MAC值发送给消息接收方
  • 接收方通过秘钥和消息计算出MAC值,如果计算的MAC和接收到的MAC值相同,则可以说明消息违背第三方篡改。

安全性

HMAC算法的安全性和其哈希算法的安全性相关,比如SHA1和MD5都是不安全的哈希算法,存在哈希碰撞,所以用于HMAC也是不安全的。