消息认证码MAC
MAC是消息认证码(messageauthentication code)的简称,是一种确认完整性并进行认证的技术。
消息认证码的输入包括任意长度的消息和一个发送者哥接收者之间共享的密钥。它可以输出固定长度的数据,这个数据就称为消息认证码,也称为MAC值(这一点和单向散列函数很类似,但是注意:单向散列函数计算的过程中是不需要密钥的,但是计算消息认证码的时候是需要发送者和接收者之间的共享密钥的)。
-
认证:要计算MAC必须要持有消息发送者和接收者之间的共享密钥,没有共享密钥的人是根本没办法计算MAC值的,即MAC就是通过这一性质来完整对消息的认证的。
-
完整性:消息只要发生1比特的变化,MAC值也会产生巨大的变化,这一点和单向散列函数很相似,MAC就是利用这一性质来确认消息的完整性的,。
单向散列函数与MAC的比较(也可以理解MAC为一种与密钥相关联的单向散列函数):
MAC流程
例如Alice向Bob发送汇款请求,认证过程如下:
发送者Alice银行和接收者Bob银行事先共享密钥;
发送者Alice银行根据汇款请求信息使用第1步的共享密钥计算出MAC值;
发送者Alice银行将汇款请求信息和第2步计算得到的MAC值一起发送给接收者Bob银行;
接收者Bob银行收到消息后,使用第1步的共享密钥对汇款请求信息计算出MAC值;
接收者Bob银行将自己计算出的MAC与发送者Alice银行发送过来的MAC进行比较;
如果两者MAC一致,则接收者Bob银行可以确认这个消息确实来自发送者Alice(即认证成功),最后可以发起汇款;如果不一致,则可以判定消息不是来自发送者Alice银行(即认证失败),最后不可以发起汇款。
MAC实现方法
-
使用Hash函数实现
基于SHA-1、MD5之类的单向散列函数实现消息认证码,简称为HMAC,其中一种方法称为HMAC。
-
使用分组密码实现
使用DES、AES之类的分组密码实现。(可以将分组密码的密钥作为消息认证码的共享密钥来使用,并使用CBC模式将全部的消息进行加密,由于消息认证码不需要解密,因此可以将除了最后一个分组以外的密文数据全部丢弃,而将最后一个分组用作MAC值。由于CBC模式的最后一个分组会收到整个消息以及密钥的双重影响,因此可以用作消息认证码。
-
其他方法
使用流密码或者非对称密码也可以实现消息认证码。
MAC无法解决的问题
MAC的密钥分发困难问题
对第三方证明
防止否认
就此,需要引入PKI/CA,数字签名技术。
MAC应用
IPsec、SSL/TLS、SWIFT等都应用了MAC技术。