认证 - 消息认证码

消息被正确传送了吗

May 29, 2017 - 1 minute read -
security cryptography

1. 消息认证码

使用消息认证码可以确认自己受到的消息是否就是发送者的本意,也就是说,使用消息认证码可以判断消息是否被篡改,以及是否有人伪装成发送者发送了该消息。

1.1 汇款请求是正确的吗

Alice银行通过网络向Bob银行发送了一条汇款请求:从账户A-5374向账户B-6671汇款1000万元。

当然,Bob银行所收到的汇款请求内容必须与Alice银行所发送的内容是完全一致的。主动攻击者Mallory可能在中间对消息进行篡改或者伪装成Alice银行发送的。现在我们需要关注的问题是汇款请求(消息)的完整性和认证这两个性质

通过消息认证码,我们可以同时识别出篡改和伪装,也就是既可以确认消息的完整性,也可以进行认证。

1.2 什么是消息认证码

消息认证码(Message Authentication Code)是一种确认完整性并进行认证的技术,简称MAC

消息认证码的输入包括任意长度的消息和一个发送者与接受者之间共享的密钥,它可以输出固定长度的数据,这个数据成为MAC值

要计算MAC必须持有共享密钥,没有共享密钥的人就无法计算MAC值,消息认证码正是利用这一性质来完成认证的。此外,和单向散列函数的散列值一样,哪怕消息中发生1比特的变化,MAC值也会产生变化,消息认证码正是利用这一性质来确认完整性的。

1.3 消息认证码的使用步骤

Alice银行和Bob银行的故事为例。

关键操作 - 事先共享密钥

1.4 消息认证码的密钥配送问题

在消息认证码中,需要发送者和接收者之间共享密钥,而这个密钥绝对不能被Mallory获取。要解决密钥配送的问题,我们需要像对称密钥一样使用一些共享密钥的方法,例如公钥密码、Diffie-Hellman密钥交换、密钥分配中心,或者使用其他安全的方式发送密钥等。至于使用哪种配送方法,则需要根据具体的目的来选择了。

2. 消息认证码的应用实例

  • SWIFT,全称Security for Worldwide Interbank Financial Telecommunication(环球银行金融协会),成立于1973年,其目的是为国际银行间的交易保驾护航。成立时15个成员国,2008年时已经发展到208个成员国。银行之间是通过SWIFT来传递消息的,SWIFT中使用了MAC。
  • IPsec,是滴互联网基本通信协议–IP协议增加安全性的一种方式。在IPsec中,对通信内容的认证和完整性校验都是采用MAC来完成的。
  • SSL/TLS,通信内容的认证和完整性校验使用MAC。

3. 消息认证码的实现方法

  • 使用单向散列函数实现。使用SHA-2之类的单向散列函数可以实现消息认证码,其中一种实现方法称为HMAC
  • 使用分组密码实现。使用AES之类的分组密码可以实现消息认证码。
  • 其他实现。使用流密码和公钥密码等也可以实现消息认证码。

4. 认证加密

认证加密是一种将对称密码与消息认证码相结合,同时满足机密性、完整性和认证三大功能的机制。

认证加密方式有:Encrypt-then-Mac,Encypt-and-MAC,MAC-then-Encypt,GCM,GMAC等。

5. HMAC

5.1 什么是HMAC

HMAC是一种使用单向散列函数来构造消息认证码的方法(RFC2014),其中HMAC的H就是Hash的意思。

HMAC中所使用的单向散列函数并不仅限于一种,任何高强度的单向散列函数都可以被用于HMAC,如果将来设计出新的单向散列函数,也同样可以使用。

5.2 HMAC的步骤

  • 密钥填充:当密钥比单向散列函数的分组长度要短时,需要在末尾填充0,使其长度达到单向散列函数的分组长度为止。如果密钥比分组长度要长,则要用单向散列函数求出密钥的散列值,然后用这个散列值作为HMAC的密钥。
  • ipad是将00110110这一比特序列(即16进制的36)不断循环反复直到达到分组长度所形成的比特序列,其中ipad的i是inner的意思。
  • opad是将01011100这一比特序列(即16进制的5C)不断循环反复直到达到分组长度所形成的比特序列,其中opad的o是outer的意思。

6. 对消息认证码的攻击

  • 重放攻击。Mallory没有破解消息认证码,而是将Alice银行的正确MAC保存下来重放利用。
  • 密钥推测攻击。对消息认证码的暴力破解以及生日攻击。

7. 消息认证码无法解决的问题

  • 对第三方的证明。
  • 防止否认。