用于网络入侵检测系统的快速匹配方法

文档序号:7678042阅读:157来源:国知局

专利名称::用于网络入侵检测系统的快速匹配方法
技术领域
:本发明涉及一种网络入侵检测系统,更具体而言,涉及一种用于网络入侵检测系统的快速匹配算法。
背景技术
:在1998年,MartinRoesch先生用C语言开发了开放源代码的入侵检测系统Snort(“SNORTNetworkIntrusionDetectionSystem,,,http://www.snort,org)。直至今天,Snort已发展成为一个多平台、实时流量分析、网络IP数据包记录等特性的强大的网络入侵检测/防御系统(NetworklntrusionDetection/PreventionSystem),即NIDS/NIPS。Snort符合通用公共许可(GPL-GUNGeneralPubicLicense),在网上可以通过免费下载获得Snort,并且只需要几分钟就可以安装并开始使用它.snort基于libpcap。网络入侵检测系统(NIDS)对于网络管理员保护网络而言是一种重要的安全性工具,它通过检查监测实时数据包和检测诸如未经授权的访问、端口扫描和拒绝服务(DoS)攻击拒绝之类的恶意攻击,能让网络管理员监控好网络。NIDS使用规则(或签名)数据库对数据包进行分类,以确定数据包是否是恶意的。一种有效地搜索匹配规则的常见方法是,即为给定的规则集建立诸如规则树或有限自动机之类的图表,并使用数据包作为输入字符串来对其进行遍历。由于流量和网络威胁的日益增长,入侵检测变得更加耗费资源,再加以现今的高速网络和大型规则集,一个网络入侵检测系统会占用CPU大量时间和内存。因此,高吞吐量的模式匹配引擎以及对内存访问频率的降低是整体入侵检测性能的关键。除数据包头预处理外,在当前的网络的许多重要的服务都是基于有效载荷检查的。NIDS、流量监控和第7层过滤要求对数据包内容的精确分析,以与包含应用程序,病毒,协议定义等具体的一个预定义的数据包匹配。传统上,这些数据集由一系列数字签名构成,这些数字签名可以通过字符串匹配进行查找,安全签名已被指定为基于字符串的精确匹配,但确切的字符串匹配不足以发现恶意模式,所以现在更有表现力的正则表达式(regulationexpressoin)被用来形容各种有效载荷的数字签名。例如,在Linux应用协议分类器中,所有的协议标识符都被表示为正则表达式。相似地,开放源码的网络入侵检测系统Snort("SNORTNetworklntrusionDetectionSystem",http://www.snort,org)已经从2003年4月没有正则表达式规则集的状态,发展到2010年11月8786种规则中的5549种含有至少有一个Perl兼容正则表达式(PCRE)。另一个开源入侵检测系统Bro也将正则表达用为其模式语言。这些都被不同的厂商应用于防火墙和设备中,例如思科公司。数据包内容扫描对于网络安全和网络监控是至关重要的。现代网络设备需要高速地执行深度数据包检测以实现安全性和特殊用途的服务。Boyer-Moore串查找算法——这是一种特别有效的字符串搜索算法,并已用于实际的字符串搜索文献的基准——被广泛使用于深度的数据包检测,但它存在两个重要的不足第一,由于需要对每一个目标字符串(密钥)进行预处理并且不能同时搜索多个密钥,它的速度实在不够快;第二,它仅执行精确的字符串匹配。近来,有限自动机(FA)是最流行的用于实现正则表达式匹配的方法,但它们需要复杂的预处理来构成FA,并且需要大量的内存。非确定性有限自动机(NFA)对于每个字符需要更多的状态转换,因此查找的时间复杂度为0(m),其中m表示NFA中的状态数量。另一方面,NFA也是空间方面极其有效的结构。然而,确定性有限自动机(DFA)对每个字符只需要一个状态遍历,但是对于目前的正则表达式集合它们需要一个极大的内存量。当检查一个特定数据包的有效载荷时,仅需要考虑规则集合的一个很小的子集,因此DFA会浪费绝大部分的内存。基于以上原因,这些解决方法对于实际的深度包检测中并不适用,因为它们在线处理数据包时要求很高的速度。为了加快模式匹配的速度,提出了一些硬件解决方案已经被提出(例如,C.H.Lin,C.T.Huang,C.P.Jiang禾口S.C.Chang,“OptimizationofPatternMatchingCircuitsforRegularExpressiononFPGAIEEETransactionsonVeryLargeScaleIntegrationSystems,Vol.15,Iss.12,pp.1303—1310,2007年10月;W.Zhang,Y.Xue,D.S.Wang,Τ.Song,"Amultiplesimpleregularexpressionmatchingarchitectureandcoprocessorfordeeppacketinspection,,,Asia-PacificConferenceonComputerSystemsArchitecture,pp.1-8,2008年;P.Marco,B.Ivano,S.MarcoD.,"ReCPUAparallelandpipelinedarchitectureforregularexpressionmatching,,,IFIPInternationalConferenceonVeryLargeScaleIntegration,pp.19-24.2007年10月;I.Bonesana,Μ.Paolieri,Μ.D.Santambrogio,"AnadaptableFPGA-basedSystemforRegularExpressionMatching",Design,AutomationandTestinEurope,DATE'08,pp.1262-1267,2008^3^;N.Yamagaki,R.Sidhu,S.Kamiya,"High-speedregularexpressionmatchingengineusingmulti-characterNFAInternationalConferenceonFieldProgrammableLogicandApplications,pp.131-136,2008年9月),它们大多是基于有限自动机(FA)的。因此,当前始终存在对于能够通过减少CPU时钟周期占用时间和内容访问次数来提高入侵检测速度的网络入侵检测系统的需求。
发明内容根据现在的知识水平而言,本文提出一个创新的、不同的模式匹配方法我们把数据包的有效载荷划分成多个固定长度的块,逐个地对每一块执行模式匹配。对于每一个块仅需要较少数量的比较,这是基于这样一个事实网络入侵检测系统中正常的数据流几乎不与任何病毒签名相匹配,而且我们需要比较的大部分密钥都很短。对多个密钥的并行检查加快了处理速度,减少指令间数据相关性。对于非固定长度的正则表达式密钥,我们的算法被用作一个哈希表来尽可能避免对大部分数据包的进一步检查。我们的算法只需要少量的内存来存储经常使用的数据,这些数据存储在高速缓存(Cache)中,因此CPU绝大部分时间并不需要访问主内存。内存访问延迟的时间通常是数百倍于CPU时钟周期,由于需要很少的内存访问,我们的算法加快了模式匹配的速度。根据一个实施例,一种基于Snort入侵检测系统的快速字符串匹配方法,其中,把数据包的有效负荷划分成多个相同大小的块,每一块的长度是L字节,而且需要3个长度为L-比特的窗来记录暂时的结果。用来记录正在被检查的块的结果的窗被称为CW,用来记录前一个块所产生的结果的窗称为PW,用来记录由当前块产生并用于下一个块匹配的结果的窗被称作NW,该方法包括以下步骤(1)对于第一个块,将这三个窗中的比特全部设定成0,并且将一个计数器“CNT”初始化为L;(2)如果CNT是L,将当前块与密钥的第一个字符的L个副本进行NXOR(异或非)运算,并将该L-比特的结果存储至CW中;如果不是,将当前块与密钥的下一个字符的L个副本进行NXOR运算,随后与CW进行AND运算,并将结果存储至Cff;(3)如果这是密钥中的最后一个字符,且新的CW不是0,则就找到了匹配;如果不是,则进入第四步;(4)如果PW和CW都是0,则将{CW,NW}向右移CNT个比特,然后将NW复制至PW,设置CNT为L并移动至下一个块并进行至步骤2以进行进一步的检查;(5)如果PW全部是0,且CW除了最低有效比特之外也全是0,则将{CW,NW}向右移CNT个比特,然后将NW复制至PW,将CNT设置成L并移动至下一个块并进行至步骤2以进行进一步的检查;(6)如果PW不是0,或者CW不是0或1,则将{PW,Cff,NW}向右移1个比特,并将CNT数减1;(7)回到步骤2。图1是在Snort中使用的一种简单的树结构;图2是根据本发明的实施例的快速字符串匹配的结构;以及图3是根据本发明的实施例的快速字符串匹配方法的实例的示意图。具体实施例方式NIDS和SnortSnort("SNORTNetworkIntrusionDetectionSystem",http://www.snort,org)使用一种简单的语言来定义规则,用以描述网络行为。每种规则由五个必要字段和大量的可选字段构成。必要字段包括协议类型(例如TCP,UDP)、源/目的IP地址和端口号,所有这些都是一个数据包报头的一部分。Snort把括号中的关键字解释为“可选字段”。常用可选字段是^content”(搜索数据包的有效载荷以查找指定模式),“msg”(设置当数据包产生一个事件时要发送的消息),等等。用来检查一个数据包是否与任一规则相匹配的一种直接的方法是以蛮力方式查找规则库针对该数据包逐个地测试每一个规则。这种方法很容易操作,但是比较耗费时间。为了减少要检查的规则数量,Snort建立了一个名为“规则树”的树结构来储存并组织所有的规则,见图1。对于每一个规则,必要字段存储在规则树节点(RTN),可选字段存储在可选树节点(OTN)。OTN与相应的RTN相关联。如果多个规则具有相同的必要字段,则仅创建单个RTN,多个OTN会共享该单个RTN。Snort的检测引擎构建了用于源端口字段和目的端口字段的索引,以便快速访问TCP和UDP的规则。然后使用每个输入数据包的源端口号和目标端口号来搜索其索引,以便识别匹配规则。如果在索引结构中找到了匹配规则,则Snort在所匹配的规则与输入数据包的有效负荷之间执行字符串模式匹配。如果字符串模式匹配成功,则检查在规则树中存储的所有剩余的必要字段(协议类型,例如TCP,UDP,源/目的IP地址)和可选条件。然而,针对有效载荷的字符串模式匹配会花费更多的时间和资源。因此,为了减少针对有效载荷的字符串模式匹配的数量,本发明将检查所有协议字段,而不仅仅是端口号,这样的话Snort就可以拒绝更多的数据包不进入字符串模式匹配阶段。由于当前索引是基于对数据包报头中所有必要字段进行检查的,检测引擎仅对全部数据包中很少数据的数据包执行字符串模式匹配,这对于以线性速度来检测数据包的NIDS而言是至关重要的。正则表达式匹配的相关工作本发明的快速正则表达式匹配算法,专注于对数据包的有效负荷执行模式匹配。当一种规则与数据包报头中的全部必要字段皆匹配时,本发明的模式匹配引擎针对有效负荷执行字符串模式匹配,并将密钥存储在相应的OTN集合中。传统的基于NIDS的DFA有三个主要的限制首先,有一个事实他们没有充分利用,那就是正常的数据流几乎与任何病毒签名皆不匹配;第二,DFA对于很多部分匹配签名而言是极其不充分的;第三,当规则集更新时,DFA需要长时间去重建。本发明提出的机制能够解决这些弊端,可以更有效率地执行NIDS。当需要对有效负荷的字符串模式匹配时,仅需要检查少量的密码。最典型的是在微处理器上,通过以下来执行密码匹配首先要把给定的密钥转换成相应的NFA或者DFA,NFA或DFA然后会被用来搜索输入文本字符。当一个DFA可以在一个恒定时间内对每一个字符进行处理时(即,其需要的时间为0(1)),对于一个η字符密钥来说,DFA状态的数量可以达到0(2η),这在某些情况下会显著地降低计算机的性能。一些新方法用所有的密钥来建构大的DFA,以便并行地检查全部密钥;这些新方法能够每次检查一个字符,但却几乎每次都需要访问内容,这将会增加搜索的等待时间。不幸的是,绝大多数数据包几乎不与任何密钥匹配,因此我们希望能够尽快地排除那些不匹配的数据包,并且能够并行地检查一个数据包的有效负荷,而不是每次检查一个字符。快速正则表达式匹配方法以下参考图2-3给出根据本发明的实施例的快速正则表达式匹配方法。首先,考虑精确的字符串匹配。我们把数据包的有效负荷划分成相同大小的块,假定每一块的长度是L字节,而且需要3个长度为L-比特的窗来记录暂时的结果。用来记录正在被检查的块的结果的窗被称为CW(Currentwindows),用来记录前一个块所产生的结果的窗被称为PW(Previ0uSwindows),用来记录由当前块产生并用于下一个块匹配的结果的窗被称作NW(Nextwindows)。在图2中示出了根据本发明的一个实施例的字符串匹配引擎的结构。根据一个实施例,图2所示的引擎通过逐步地执行以下步骤来对各个块进行检查(1)对于第一个块,将这三个窗中的比特全部设定成0,并且将一个计数器“CNT”初始化为L。(2)如果CNT是L,将当前块与密钥的第一个字符的L个副本进行NX0R(异或非)运算,并将该L-比特的结果存储至CW中;如果不是,将当前块与密钥的下一个字符的L个副本进行NXOR运算,随后与CW进行AND运算,并将结果存储至CW。(3)如果这是密钥中的最后一个字符,且新的CW不是0,则就找到了匹配;如果不是,则进入第四步。(4)如果PW和CW都是0,则将组合{CW,NW}向右移CNT个比特,然后将NW复制至PW,设置CNT为L并移动至下一个块并进行至步骤2以进行进一步的检查。(5)如果PW全部是0,且CW除了最低有效比特之外也全是0,则将组合{CW,NW}向右移CNT个比特,然后将NW复制至PW,将CNT设置成L并移动至下一个块并进行至步骤2以进行进一步的检查。(6)如果PW不是0,或者CW不是0或1,则将组合{PW,Cff,NW}向右移1个比特,并将CNT数减1。(7)回到步骤2。在图3中给出了使用以上各个步骤的一个具体实例。在实例中,1^=8,密钥=“key”,块1和块2包含字符串“Tmnorrkeyinokruk”。从(b)至(c),移动至一个新的块,并且{CW.NW}向右移7个比特(CNT=7)。在图3中省略了一些窗。如果窗的内容是“00000000”,则在(e)中找到了匹配。上述各步骤仅是本发明的方法一个子集,因为我们不考虑正则表达式中的通配符,而且我们假定密钥的长度小于或等于块的长度。这两个问题将会在以下内容中得到进一步论述。从理论和实践的基础上,我们可以得出下列结论a.如果一个块不包含密钥的第一个字符,则对于这个块仅需要执行一次检查,并且实验结果表明,当L=8的时候,大约83%的块只需要执行1到3次检查。b.块的长度越长,就会得到越好的性能,因为一个块的比较次数只取决于在这个块和前一个块中的最长的匹配。因此,在一个较大的组合块中的比较次数大致等同于在那些较小块的最长次数中的比较次数。c.该方法不需要预处理,并且由于不需要保存或恢复太多的数据而很少访问内存。d.我们可以同时检查多个密钥。逐个地用密钥匹配一个块,并且只需要保存每个密钥的临时结果,这些临时结果可以存储在寄存器或高速缓存中以避免耗时的内存访问。这也可以减少在单个密钥的指令执行过程中的数据相关性。我们需要考虑最坏的情况,尽管它看起来不可能发生。在最坏的情况下,每一块都需要和一个密钥进行L次比较,但是只有一个特定的密钥能和这种最坏的情况相匹配。即使是需要更多次比较,本发明的方法仍然可以达到很高的数据包吞吐量,因为与内存访问相比(其往往需要几十个CPU时钟周期),这些简单的指令有着更短的等待时间(最多十几个CPU时钟周期)。我们在之后将对这种最坏的情况进行探讨。特殊情况以上方法是基于一定的假设的,但是在实践中需要考虑到所有情况,因此我们来讨论这些特殊情况。1.长密钥问题如果一个密钥的长度大于块的长度,则可以使用双窗(或多窗),用类似的方法进行处理和运算。对于本领域技术人员而言,很容易将上述单个CW的实施例扩展至双窗或多窗的设计。实际上,我们将一长密钥分割成长度为L字节的几段,并分别将它们和一个块进行比较,然后将所得到的多个结果传递至下一个块的比较。2.不精确字符在近来的规则集中,一些字符是不“精确”的,但是这些字符的长度是精确的,例如“!a”和“a|b”,其分别表示“不是字符a”和“字符a或者字符b”。对于这些字符,我们仅需要修改在比较中使用的运算。例如,我们可以使用M)R(异或)运算代替NXOR运算来表示“!a”,使用(NXORa)|(NXORb)来表示“ab”。3.变长密钥一些正则表达式中具有可变的长度,例如克林星(KleeneMar)(*),其是一个通配符,常常用来表示匹配正则表达式中的零或更多次出现。因此,当密钥中有随机数量的字符时,我们有两种方法来处理。第一种方法,我们可以寻找密钥的固定长度的前缀作为一个哈希值,用这个哈希值作为一个新的密钥,一些数据包就会被排除。这是因为如果一个数据包的有效负荷与密钥的一部分不匹配,则一定与整个密钥不匹配。并且我们也可以证明在任何正则表达式中都可以找到至少一个字符长度的准确前缀,因为在每个正则表达式的第一个字符一定不能以克林星来标记。例如,正则表达式“a*bc+d”等价于“bc+d”,因为“a*”是无意义的,而且我们只需检查“be”(其是最大的准确前缀)作为哈希值,来执行对数据包的有效负荷的字符串匹配。当找到第一个匹配后,就需要进行更近一步的匹配检查。不过,我们不需要检查全部的正则表达式,只需检查其剩余部分,这样就减少了DFA的状态。因此我们为正则表达式中的剩余部分构造简单的DFA,并使用由该哈希值产生的结果进行进一步的检查。仅需进一步检查在所匹配的哈希值之后的字符串,并在DFA中的状态为有效时完成该可能的匹配检查。因此当数据包的有效负荷需要进一步检查时,只有其一小部分进入DFA。我们可以不建立几个小的DFA,而是可以选择建立一个较大的DFA引擎来合并所有这些变长密钥。但实验结果表明,这种方法不如前者,这是因为(1)建立几个小的DFA比建立一个大的组合DFA更快;(在检查了前缀之后,仅需要进一步检查数据包有效负荷的一小部分,并且仅有数据包有效负荷的一小部分进入DFA;(3)一些小的DFA可以被其他数据包重复使用,也易于被存入缓存中。第二种方法,使用计数器而不是DFA。这种方法避免了使用DFA但是需要对正则表达式进行预处理。预处理器将正则表达式分割成几个部分,用来区分长度确定的部分和长度可变的部分。例如,“abc+d”可以被分成三个部分“abc”,“c*”和“d”。在检查“abc”和“d”时使用的方法与之前讨论的相同,唯一的区别是如何检查W在检查了字符串“abc”后,我们的匹配引擎检查“c*”的匹配,不同之处是NXOR操作的结果被存储在一个临时窗(Tff)中,而不是更新当前窗(CW),且三个窗(PW,CW和NW)在本次匹配过程中保持不变。随后,匹配引擎使用NXOR运算来比较字符“d”,其结果记为T。CW中的第i个字节可利用下列等式更新Cff(i)=T(i)&(CW(i)I(TW(i+l)&CW(i+l))|(TW(i+2)&TW(i+l)&CW(i+2))|···(Tff(L-I)&...&TW(i+l)&CW(L-I)))(1)如果正则表达式对字符“C”的长度有要求,则我们需要使用计数器来记录在"abc"和“d”之间的“C”的长度。例如对字符“C”匹配N次或更多次匹配。与Boyer-Moore字符串搜索法的比较Boyer-Moore字符串查找法是一种特别有效的字符串搜索算法,它是针对实际字符串搜索方法的一个标准基准。通常,Snort使用Boyer-Moore字符串搜索法来完成模式匹配,但是这种算法需要对每一个密钥进行预处理并且每次仅检查一个字符,即使可以跳过有效负荷中的一些字符。此外,此算法随着所搜索的密钥的长度的变长而变得更快,但是在Snort的规则中,大部分的密钥都很短。与Boyer-Moore串查找法相比,我们的算法有以下优势1.该算法不需要对每一个密钥预处理。2.数据包有效负荷移动的长度是固定的(一个块),但是在Boyer-Moore算法中,数据包有效负荷移动的长度取决于之前的检查结果。.3.以上两个“静态”特性使本发明的方法更容易应用于硬件开发,例如FPGA。4.数据包移动长度固定而非取决于之前检验结果的特点,使得本发明的方法更容易并行地检查多个密钥。5.该算法使用并行方式检查多个字符,而不是逐个检验。6.该算法更易于扩展。对于Boyer-Moore算法来说,寻找有效负荷中所有匹配的最坏情况需要大约3*N次比较,其中N为有效负荷中字符的数量。在本发明的方法中,最坏的情况需要大约N次比较。在最坏情况下,密钥的长度与块的长度相等。尽管前述公开文件论述了示例性方案和/或实施例,但应注意,在不背离由权利要求书定义的描述的方案和/或实施例的范围的情况下,可以在此做出许多变化和修改。而且,尽管以单数形式描述或要求的所述方案和/或实施例的要素,但也可以设想复数的情况,除非明确表示了限于单数。另外,任意方案和/或实施例的全部或部分都可以与任意其它方案和/或实施例的全部或部分结合使用,除非表明了有所不同。权利要求1.一种基于Snort网络入侵检测系统的快速字符串匹配方法,其中,把数据包的有效负荷划分成多个相同大小的块,每一块的长度是L字节,而且需要3个长度为L-比特的窗来记录暂时的结果。用来记录正在被检查的块的结果的窗被称为CW,用来记录前一个块所产生的结果的窗称为PW,用来记录由当前块产生并用于下一个块匹配的结果的窗被称作NW,该方法包括以下步骤(1)对于第一个块,将这三个窗中的比特全部设定成0,并且将一个计数器“CNT”初始化为L;(2)如果CNT是L,将当前块与密钥的第一个字符的L个副本进行NXOR(异或非)运算,并将该L-比特的结果存储至CW中;如果不是,将当前块与密钥的下一个字符的L个副本进行NXOR运算,随后与CW进行AND运算,并将结果存储至CW;(3)如果这是密钥中的最后一个字符,且新的CW不是0,则就找到了匹配;如果不是,则进入第四步;(4)如果Pff和Cff都是0,则将{CW,NW}向右移CNT个比特,然后将Nff复制至Pff,设置CNT为L并移动至下一个块并进行至步骤2以进行进一步的检查;(5)如果PW全部是0,且CW除了最低有效比特之外也全是0,则将{CW,NW}向右移CNT个比特,然后将NW复制至PWJfCNT设置成L并移动至下一个块并进行至步骤2以进行进一步的检查;(6)如果PW不是0,或者CW不是0或1,则将{PW,CW,NW}向右移1个比特,并将CNT数减1;(7)回到步骤2。2.如权利要求1所述的方法,其中,使用双窗(或多窗)来替代所述的CW、PW和NW。3.如权利要求1所述的方法,其中,对于包含不精确字符的密钥,可以使用XOR(异或)运算代替NXOR运算。4.如权利要求1所述的方法,其中,对于变长密钥,寻找密钥的固定长度的前缀作为一个哈希值,用这个哈希值作为一个新的密钥,对该密钥的剩余部分进行进一步检查。5.一种现场可编程门阵列,其包含用于实现基于Snort入侵检测系统的快速字符串匹配的逻辑,其中,把数据包的有效负荷划分成多个相同大小的块,每一块的长度是L字节,而且需要3个长度为L-比特的窗来记录暂时的结果。用来记录正在被检查的块的结果的窗被称为CW,用来记录前一个块所产生的结果的窗称为PW,用来记录由当前块产生并用于下一个块匹配的结果的窗被称作NW,所述逻辑用以实现以下步骤(1)对于第一个块,将这三个窗中的比特全部设定成0,并且将一个计数器“CNT”初始化为L;(2)如果CNT是L,将当前块与密钥的第一个字符的L个副本进行NXOR(异或非)运算,并将该L-比特的结果存储至CW中;如果不是,将当前块与密钥的下一个字符的L个副本进行NXOR运算,随后与CW进行AND运算,并将结果存储至CW;(3)如果这是密钥中的最后一个字符,且新的CW不是0,则就找到了匹配;如果不是,则进入第四步;(4)如果PW和CW都是0,则将{CW,NW}向右移CNT个比特,然后将NW复制至PW,设置CNT为L并移动至下一个块并进行至步骤2以进行进一步的检查;(5)如果PW全部是0,且CW除了最低有效比特之外也全是0,则将{CW,NW}向右移CNT个比特,然后将NW复制至PWJfCNT设置成L并移动至下一个块并进行至步骤2以进行进一步的检查;(6)如果PW不是0,或者CW不是0或1,则将{PW,Cff,NW}向右移1个比特,并将CNT数减1;(7)回到步骤2。6.一种网络入侵检测系统,其使用了一种快速字符串匹配方法,其中,把数据包的有效负荷划分成多个相同大小的块,每一块的长度是L字节,而且需要3个长度为L-比特的窗来记录暂时的结果。用来记录正在被检查的块的结果的窗被称为CW,用来记录前一个块所产生的结果的窗称为PW,用来记录由当前块产生并用于下一个块匹配的结果的窗被称作NW,该方法包括以下步骤(1)对于第一个块,将这三个窗中的比特全部设定成0,并且将一个计数器“CNT”初始化为L;(2)如果CNT是L,将当前块与密钥的第一个字符的L个副本进行NXOR(异或非)运算,并将该L-比特的结果存储至CW中;如果不是,将当前块与密钥的下一个字符的L个副本进行NXOR运算,随后与CW进行AND运算,并将结果存储至CW;(3)如果这是密钥中的最后一个字符,且新的CW不是0,则就找到了匹配;如果不是,则进入第四步;(4)如果PW和CW都是0,则将{CW,NW}向右移CNT个比特,然后将NW复制至PW,设置CNT为L并移动至下一个块并进行至步骤2以进行进一步的检查;(5)如果PW全部是0,且CW除了最低有效比特之外也全是0,则将{CW,NW}向右移CNT个比特,然后将NW复制至PWJfCNT设置成L并移动至下一个块并进行至步骤2以进行进一步的检查;(6)如果PW不是0,或者CW不是0或1,则将{PW,Cff,NW}向右移1个比特,并将CNT数减1;(7)回到步骤2。全文摘要本文提出一个创新的、不同的模式匹配方法我们把数据包的有效载荷划分成多个固定长度的块,逐个地对每一块执行模式匹配。对于每一个块仅需要较少数量的比较,这是基于这样一个事实网络入侵检测系统中正常的数据流几乎不与任何病毒签名相匹配,而且我们需要比较的大部分密钥都很短。对多个密钥的并行检查加快了处理速度,减少指令间数据相关性。对于非固定长度的正则表达式密钥,我们的算法被用作一个哈希表来尽可能避免对大部分数据包的进一步检查。我们的算法只需要少量的内存来存储经常使用的数据,这些数据存储在高速缓存(Cache)中,因此CPU绝大部分时间并不需要访问主内存。内存访问延迟的时间通常是数百倍于CPU时钟周期,由于需要很少的内存访问,我们的算法加快了模式匹配的速度。文档编号H04L29/06GK102201948SQ20111013954公开日2011年9月28日申请日期2011年5月27日优先权日2011年5月27日发明者张萌萌申请人:北方工业大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1