重放攻击案例

一 重放攻击

1 故事

 

主动攻击者Mallory想到可以通过将事先保存的正确MAC值不断重放来发动攻击,如果这种攻击成功的话,就可以让100万元滚雪球般地变成1亿元。

攻击过程如下:

1 Mallory窃听到Alice银行与Bob银行之间的通信。

2 Mallory到Alice银行向自己在Bob银行中的账户M-2653汇款100万元。于是Alice银行生成了下列汇款请求消息:

“向账户M-2653汇款100万元”

Alice银行为该汇款请求消息计算出正确的MAC,然后将MAC和消息一起发送给Bob银行。

3 Bob银行用收到的消息自行计算MAC,并将计算结果和收到的MAC值进行对比。由于两个MAC值相等,因此Bob银行判断该消息是来自Alice银行的合法汇款请求,于是向Mallory的账户M-2653汇款100万元。

4 Mallory·窃听了Alice银行发给Bob银行的汇款请求消息以及MAC值,并保存在自己的计算机中。

5 Mallory将刚刚保存下来的汇款请求消息以及MAC值再次发给Bob银行。

6 Bob银行用收到的消息自行计算MAC值,并将计算结果与收到的MAC值进行对比,由于两个MAC值相等,因此Bob银行判断该消息时来自Alice银行的合法汇款请求(误解),于是向Mallory的账户M-2653汇款100万元。

7 Mallory将步骤5重复100次。

8 Bob银行向Mallory的账号总计汇入100万元*100=1亿元,这时Mallory将这笔钱取出来。

在这里,Mallory并没有破解消息认证码,而只是将Alice银行正确MAC值保存下来重复利用而已。这种攻击方式称为重放攻击。

2 抵御重放攻击方法

2.1 序号

约定每次都对发送消息赋予一个递增的编号(序号),并且在计算MAC值时将序号也包含在消息中。这样一来,由于Mallory无法计算序号递增之后的MAC值,因此就可以防御重放攻击。这种方法虽然有效,但是对每个通信对象都需要记录最后一个消息的序号。

2.2 时间戳

约定在发送消息时包含当前的时间,如果收到以前的消息,即便MAC值正确也将其当做错误的消息来处理,这样就能够抵御重放攻击。这种方法虽然有效,但是发送者和接收者的时钟必须是一致的,而要考虑到通信的延迟,必须在时间判断上留下缓冲,于是多多少少还是会存在可以进行重放攻击的空间。

2.3 nonce

在通信之前,接收者先向发送者发送一个一次性的随机数,这个随机数一般称为nonce。发送者在消息中包含这个nonce并计算MAC值。由于每次通信时nonce的值都会发发生变化,因此无法进行重放攻击。这种方法虽然有效,但通信的数据量会有所增加。

二 密钥推测攻击

和单向散列函数的攻击一样,对消息认证码也可以进行暴力破解以及生日攻击。

对于消息认证码来说,应保证不能根据MAC值推测出通信双方所用的密钥。如果主动攻击Mallory能够从MAC值反算出密钥,就可以进行篡改、伪装等攻击。例如HMAC中就是利用单向散列函数的单向性和抗碰撞性来保证无法根据MAC值推测出密钥的。

此外,在生成消息认证码所使用的密钥时,必须使用密码学安全的、高强度的伪随机数生成器。如果密钥是人为选定的,则会增加密钥被推测的风险。

 

posted @ 2021-08-22 17:55  朱加强  阅读(795)  评论(0编辑  收藏  举报