IPSec防重放机制分析

      防重放机制有三种:时间戳、挑战和滑动窗。IPSec中使用了第三种机制,看了一些网上的资料终于看明白了,跟大家一起分享一下。

      一、滑动窗协议

     简单介绍一下滑动窗协议,该协议的最典型应用是用在TCP协议中,主要用于进行流控,下面的滑动窗的示意图:

               接收方提供的窗口

               |<----------------->|

                            可用窗口   

                            |<------>|

1234567891011
|<------>|

发送并被确认

             |<------>|

            发送未被确认

                           |<-------->|

                           能够发送 

                                           |---------------->

                                               不能发送

    收方在每个包中都要通报可用窗口大小      

    上面的例子是在发方角度去看,。其中字节1~3已经被收方确认,收方当前提供的窗口为4~9字节,其中4~6字节已发送出去但未被确认,可用窗口为7~9字节。9之后的字节不能被发送。当数据被发送但未确认时,窗口左沿向右移动,窗口收缩,意味着可接受的数据减少。数据被确认后,窗口右沿右移,窗口扩张,意味着可接收更多的数据。无论何时,右沿与左沿的距离不超过接收方提供的窗口。

    二、IPSec防重放

    IPSec滑动窗示意图如下:

                                                             大小为8的 滑动窗口

           |<--------------------------------------------------->|

n-3n-2n-1nn+1n+2n+3n+4n+5n+6n+7n+8n+9……

    其中红色背景为以受到数据包。


    接下来再分析一下IPSec中如何利用滑动窗来实现防重放攻击的。

    (1)IPSec协议中有一个序列号字段来唯一标识一个数据包

    (2) 关键数据结构为ipsec_sa,具体代码如下:

      struct ipsec_sa{

        ……

        u8  ipsa_replaywin; //滑动窗口大小

        u32 ipsa_replaywin_lastseq; //最后一个包的序号

        u32 ipsa_replaywin_bitmap; //已接收包位图,记录所有已接收过的序号

        u32 ipsa_replaywin_maxdiff; //最大包序号之间差值

        u32 ipsa_replaywin_errs ; //错误包序号

         ……

    }

    (3)具体处理流程如下:

    1)判断接收到的包序号是否小于最后一个包的序号,如果是,再检查最大包序号之间差值ipsa_replaywin_maxdiff;是否大于窗口大小,如果大于则说明数据包已经过期,否则转2)

    2)根据psa_replaywin_bitmap判断该序列号对应的包是否已经接受过,如果是则肯定是重放,反之不是重放,并更新ipsa_replaywin_bitmap

    3)如果接收到的序列号比最后一个包的序号大,并且差值小于窗口大小,则窗口向右滑动,否则窗口不滑动。最后更新 ipsa_replaywin_lastseq的值为本包序列号。

  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值