密码学的工具箱里有六大工具 :分别是对称密码公钥密码单向散列函数消息认证码数字签名,和伪随机数生成器。

我们从Alice 和Bob的故事开始讲起。我们假设Alice 和 Bob 分别是两家银行。Alice 银行通过网络向Bob银行发送了一个汇款请求。Bob接受的请求是 从账号A向账号B汇款100万元。

这个时候,Bob怎么去确定这条线消息是Alice 发送的,怎么去确定该消息没有别人修改。如汇款请求的原意是“从账号A向账号C汇款100万元”,就是在消息传递的过程,怎么去保证该消息没有被篡改,是否有人伪装发送者发送该消息

其实这问题,我们要关注的问题是消息的“完整性”和“认证”这两个性质。

消息的完整性(intergrity)

消息的完整性就是指消息没有被篡改这一性质,消息的完整性也叫一致性。如果我们能够确认汇款请求的内容与Alice 所发出的内容完全一致,就相当于是确认了消息的完整性,也就意味着消息没有被篡改。

消息的认证(Authentication)

消息的认证是指“消息来自正确的发送者”这一性质。如果能够确认消息来自Alice 就相当于对消息进行了认证。也就是说消息不是其他人发送的。

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

什么是消息认证码

消息认证码(Message Authentication Code)是一种确认完整性并进行认证的技术,取三个单词的首字母,简称为MAC.

消息认证吗的输入包括任意长度的消息和一个发生者与接收者之间共享的秘钥,它可以输出固定长度的数据,这个数据称为MAC值。

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

消息认证码的使用

消息认证码的使用见下图

  1. 从上图,我们可以看出发送者与接受者Bob事先共享密钥
  2. 发送者Alice根据汇款请求消息计算MAC值
  3. 发送者Alice将汇款请求和MAC值发送给接受者Bob
  4. 接受者Bob根据接受到的汇款请求计算MAC值(使用共享密钥)
  5. 接受者Bob将自己计算的MAC值与从Alice处收到的MAC值进行比较
  6. 如果两个MAC值不一致,则接受者Bob就可以断定汇款请求不是来自Alice

消息认证码的使用场景

我们在SSL/TLS中使用了MAC(message authentication code)来验证内容的完整性,MAC中算法使用比较多是hmac算法。但是数字签名也能实现这种操作,我们为每一个数据包进行加密,MAC中是对称加密,计算成本低,可以在一个合理的范围内,而基于非对称加密的数字签名,计算量大,成本高,所以在验证数据宝的完整性,数据包的认证,使用mac来说更合理。

HMAC算法

我们利用hash+密钥能够计算出mac值,常用的hash算法有 md5, sha-256,sha-512 sha2 sha1 等等. HMAC算法详细内容见https://tools.ietf.org/html/rfc2104

消息认证码的攻击

重放攻击

当主动攻击者获取正确的MAC和消息时,能够伪装成Alice向Bob发送重复的消息。

我们设想以下的场景

  1. Mallory 窃听到Alice银行与Bob银行之间的通信
  2. Mallory到Alice银行向自己在Bob银行中的账户DXZW-29汇款100万元。于是Alice银行生成了汇款请求消消息“向账户DXZW-29汇款100万元”Alice银行为该汇款请求消息计算出正确的MAC值,然后将MAC和消息一起发送给Bob银行。
  3. Bob银行用收到的消息自行计算MAC值,并将计算结果与收到的MAC值进行比较。由于两个MAC值相等。因此Bob银行判断该消息是来自Alice银行的合法汇款请求,于是向DXZW-29账户汇款100万元。
  4. Mallory窃听了Alice银行发给Bob银行的汇款请求消息以及MAC值,并保存在自己的计算机中
  5. Mallory将刚刚保存下来的汇款请求消息以及MAC值再次发给Bob银行
  6. Bob银行用收到的消息自行计算MAC的值,并将计算结果与收到的MAC值进行对比。由于两个MAC值相等,因此Bob银行判断该消息是来自Alice银行的合法汇款请求。于是向Mallory的账户DXZW-29汇款100万元。
  7. Mallory重复5 100次
  8. Bob重复6 100次
  9. 这个时候Bob向DXZW-29的账户汇款100次,总共1亿元

这种方式称为重放攻击

怎么预防重放攻击

序号

 

随机数

发表评论

电子邮件地址不会被公开。 必填项已用*标注