重放攻击案例
一 重放攻击
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值推测出密钥的。
此外,在生成消息认证码所使用的密钥时,必须使用密码学安全的、高强度的伪随机数生成器。如果密钥是人为选定的,则会增加密钥被推测的风险。