MAC(Message Authentication Code)
注意这里的MAC不是计算机网络中的MAC地址,而是信息认证码。对于一个加密后的消息,我们通常需要确认两点,第一点是其完整性,信息是否被篡改过;第二段是其出处,来源是否是合法对象,使用认证技术。 MAC:拥有【来自真正发信者】的性质,确定机密性,并对信息来源进行认证的代码。输入是信息和共享的密钥而输出是固定长度是固定的。MAC与哈希函数相似,区别在于哈希函数不需要使用密钥,而MAC需要使用密钥来获取输出。
MAC认证过程:A向B事前共享密钥,A用该密钥计算MAC值,然后将该MAC值通过安全途径送达B处。而此后与A交互时,在传输加密消息之前,直接通过明文形式传输这一段固定的信赖信息,该信赖信息由于是一般途径自然可能被篡改或伪造,此时用已经共享的密钥对其进行计算,计算得到的MAC值与从安全渠道获取的MAC值相比较,如果相同则证明来源确实是A没错,否则该信息是伪造的。
那么这里存在一个问题,这个安全的渠道是什么?这就又回到上一篇博文讲过的密钥配送问题了,详细内容请看一下上一篇博文的密钥配送问题。典例有公钥加密、 Diffie-Hellman 、KDC等。
MAC使用的例子:
- SWIFT: Society for Worldwide Internet Financial
Telecommunication,翻译为国际间银行通信协会。银行与银行之间交换交易信息时使用MAC。 - Ipsec:为IP协议安全而诞生,通信内容的完整性和认证都使用了MAC。
- SSL/TLS:Web 网购时使用的协议,同样使用MAC保证通信内容的完整性和认证。
MAC的实现:
- 利用SHA-1&MD5 等单方向哈希函数生成的MAC——HMAC。
- 利用块加密技术3DES/AES等生成的MAC。将块加密的密钥当做MAC的密钥使用,用CBC模式加密所有信息,因为在MAC中没有解密的必要,因此最后的加密结果当做MAC值,此外的部分舍弃掉。
- 此外还有流加密和公钥加密两种方式可以实现。
认证加密
认证密码,英文简写为AE或AEAD,从2000年开始进行研究,是将对称加密与MAC相结合形成的同时保证机密性、完整性和认证的结构。
- Encrypt-then-MAC
IPsec中使用,可以阻止选择密文攻击。将明文通过对称加密加密成密文后,将密文当做输入计算MAC值,然后组合密文与MAC值。选择密文攻击可以用密文生成任意对应的明文,但是由于最终加密结果并不仅仅是密文,因而无法解密出正确的明文。 - Encrypt-and-MAC
SSH是使用该方式的典例。使用同一个密钥加密。 - MAC-then-Encrypt
SSL是使用这种方法的典例。先计算MAC值并与明文结合后再加密。
- GCM(Galois/Counter Mode):是认证模式的一种。将与AES相同的128位块数据利用CTR模式计算MAC值。为此需要使用反复加法和反复乘法的哈希函数。由于CTR模式的特性,可以并发处理数据进而提高整体加密效率,此外CTR和MAC计算使用的是同一个密钥,因此管理便利。
- GMAC(Galois/Counter Mode MAC):GCM专用的MAC。
HMAC
HMAC是利用单方向哈希函数生成的MAC,上图是不同版本HMAC对应使用的哈希函数。根据RFC 2014的定义,HMAC生成公式如下。 生成过程:
步骤 | 操作 |
---|
1 | key padding 生成,用0填充密钥到与块加密长度相等的长度 | 2 | 经过填充的key与ipad异或运算 | 3 | ②与明文结合 | 4 | 计算③哈希值 | 5 | ①密钥与opad异或运算 | 6 | 与④得到的哈希值结合 | 7 | 计算⑥的哈希值 |
针对MAC的攻击
- 再传送攻击:replay attack。用实现保存的真正的mac值进行反复传输的一种攻击。
看下面一个例子: 黑客监听了A与B的通信,A与B都是银行。黑客在AB银行都有自己的账户,黑客在A银行制作一个信赖信息【向B银行的M账户存款10万元】,B银行的M账户也是他自己的账户。A银行将此信赖信息的MAC值计算后,附加到信赖信息内发给B银行,B银行将收到的信息计算MAC值比较两个MAC值,确定是正确无误的信赖信息。而黑客监听该流程从而得到了信赖信息和MAC值,然后,黑客将此组信息重发给B银行,B银行收到后,会验证MAC值,计算出了正确的结果,从而系统上会再给黑客B银行的账户增加十万元额度。由于是系统操作,因此只要使用过一次现金入账,此后就可以无限次重发该消息,令B银行无限次给自己进行“存款”。 应对策略:
- 序号(sequence number):为每次发送上述消息组增加一个序号并设置最大序号。该消息组每发一次便计数器+1,如果受到再传送攻击,则会是N个序号为x的消息组,则会被认定为假。
- 时间戳(timestamp):发送的信息组会记录当前时刻,当受到再传送攻击时,会收到 复数组同一已经过去的时刻发来的信息组。要求收发双方要提前将时钟同步。
- nonce:nonce是服务器产生的随机数,当客户端第一次发出请求时,获取nonce,将其与原文一起进行加密,进行发送。服务器使用同样的算法进行加密,与客户端发送过来的密文进行对比,若用户名一样则证明消息的有效性。若发现该nonce在数据库中已经存在,则该请求可能为恶意请求。但是随机数本身有可能会重复,因此可以结合上述两点来使用。
- 推测攻击:针对MAC本身的攻击有暴力解码和生日攻击。需要使考虑的单方向性、抗碰撞性、密钥生成时的伪随机数生成器等。
- 否认(repudiation):虽然收到明文并计算出了对应的MAC,但是无法证明 这一组重组信息是真的来自于合法用户,因为只要有密钥,就能生成对应正确的MAC。如果有多个合法用户持有一个密钥,则不能保证该合法用户不被另一个合法用户恶意攻击。举个例子,ABC三人,A偷了B的东西被C看到了,在此情况下A打死不承认该事件,由于没有证据,因而C的证言不能排除恶意攻击A的可能性,因此无法证明A是真的小偷。因此该弊端需要一项其他技术来解决。
|