关于快速高效的模式匹配算法的剖析与改进
摘要:模式匹配算法是现代化网络入侵检测中的关键环节,本文主要介绍了几种常用的模式匹配算法,并在此基础上,提出一种更快捷、更高效的改进方法,以提高模式匹配的效率与质量,确保网络安全。
关键词:模式匹配入侵检测改进
随着我国计算机与网络技术的飞速发展,网络应用已涉及到人们生产、生活的各个领域,其重要性日益凸显。
随之而来的网络攻击问题也备受关注,给网络安全性带来挑战。
传统的网络防御模式,主要采取身份认证、防火墙、数据加密等技术,但是与当前网络发展不适应。
在此背景下,入侵检测技术营运而生,并建立在模式匹配基础上,确保检测的快捷性、准确性,应用越来越广泛。
1、模式匹配原理概述
模式匹配是入侵检测领域的重要概念,源自入侵信号的层次性。
结合网络入侵检测的底层审计事件,从中提取更高层次的内容。
通过高层事件形成的入侵信号,遵循一定的结构关系,将入侵信号的抽象层次进行具体划分。
入侵领域大师kumar将这种入侵信号划分为四大层次,并将每一个层次与匹配模式相对应。
以下将分别对四大层次进行分析:
(1)存在。
只要存在审计事项,就可以证明入侵行为的发生,并深层次挖掘入侵企图。
存在主要对应的匹配模式就是“存在模式”。
可以说,存在模式就是在固定的时间内,检查系统中的特定状态,
同时判断系统状态。
(2)序列。
一些入侵的发生,是遵循一定的顺序,而组成的各种行为。
具体表现在一组事件的秩序上。
序列对应的是“序列模式”,在应用序列模式检测入侵时,主要关注间隔的时间与持续的时间。
(3)规则。
规则表示的是一种可以扩展的表达方式,主要通过and 逻辑表达来连接一系列的描述事件规则。
一般适用于这种模式的攻击信号由相关活动组成,这些活动之间往往不存在事件的顺序关系。
(4)其他。
其他模式是不包含前面几种方法的攻击,在具体应用过程中,难以与其他入侵信号进行模式匹配,大多为部分实现方式。
2、几种常用的模式匹配算法
2.1 ac算法
ac算法(aho-corasick)是一种可以同时搜索若干个模式的匹配算法,最早时期在图书馆书目查询系统中应用,效果良好。
通过使用ac算法,实现了利用有限状态自动机结构对所有字符串的接收过程。
自动机具有结构性特征,且每一个前缀都利用唯一状态显示,甚至可同时应用于多个模式的前缀中。
如果文本中的某一个字符不属于模式中预期的下一个字符范围内,或者可能出现错误链接的指向状态等,那么最长模式的前缀同时也可作为当前状态相对应的后缀。
ac算法的复杂性在于o(n),预处理阶段的复杂性则在于o(m)。
在采取ac算法的有限状态自动机中,应该在每一个字符的模式串中分别建立节点,提高该算法的使用效率与质量。
目前,应用有限
自动计算法是一种较为典型与常用的方法,如果模式集比较大,可能引发空间膨胀问题。
在使用ac算法时,搜索输入串过程中没有跳跃,直接根据顺序输入,因此在规则较少的情况下,ac算法的搜索性能并不理想。
2.2 kmp算法
kmps算法与简单的算法有所不同,如果某一次的匹配失败,那么模式串不一定是向右移动一格,即使向右移动,也未必从模式的起点位置开始匹配。
kmp的具体计算方法为:
当某次试匹配成功之后,如果tx≠px,那么即使在模式之前j-1个字符全部匹配,而实现已经获知子模式p1p2……px-1,且最常的首子串与尾子串同等,即:p1p2……pk-1=px-k+1pjxk+2……pj-k,那么在下一次的匹配过程中,就可以将模式串向右移动,表示为next[x],代表当模式串中的第x个字符和主串中的相应字符出现“失配”现象,那么模式中就需要重新与主串中的字符位置进行比较,在预处理时就可以完成next[x]的计算工作。
为了能完整体现完全匹配的各种情况,以上各首子串必须保证为最长。
因此,对于任何一个子模式来说(p1p2……px,其中1≤x
≤n),“自匹配”中的首子串都是唯一的,仅能与模式的自身结构相关。
通过应用kmp算法,采取一次将模式向右移动若干位置的方式,确保匹配过程中不需要任何回溯。
在相对较好的情况下,使用kmp算法的时间复杂度是0(m+n),next[x]的计算时间复杂度是0(m)。
2.3 bm算法
bm算法是单模式匹配算法的其中一种,属于精确的字符串匹配算法,采取从右向左的比较方式,应用了“坏字符”与“好后缀”两种启发原则。
bm算法与kmp算法具有一定区别,主要是对模式串的扫描方式相反,即由从左向右改为从右向左。
采用bm算法采用这种扫描方式的优势在于:如果在正文中出现了个别模式没有的字符,那么可以将此模式迅速掠过正文。
应用bm算法,关键在于如何提高正文的匹配速度,尤其是字符在该模式中的具体位置。
假设模式为w[1,n],同时定义函数x,函数x明确了正文中可能产生字符的模式位置:x>(1,2,3,4,……n),且x∈。
函数x的定义如下:对于每一个x∈来说,假设在执行正文的位置j起“返前”一段以及模式从左向右的匹配检查过程中,无论在哪一位置,如果存在不匹配现象,就开始执行从wn和tj+x的从右向左的匹配检查。
这种检查的效果相当于将模式向右侧滑动一段距离。
很明显,tj不会在模式中出现或者仅在模式的末端存在,向右侧滑动的最大距离为n。
3、一种新的模式匹配算法
随着计算机与网络的不断应用与拓展,网络流量迅速增加,各种匹配原则与匹配效率逐渐落后,无法满足现代化高速网络的发展需要。
尤其随着各种检测规则的不断提出,各种数据包匹配的次数也有所改变,因此很难完全满足性能。
针对这一情况,在各种基本算
法的基础上,充分利用“本次匹配不成功”原则,在匹配失败的情况下,尽量跳过多个字符,实现迅速匹配目标。
实际上,本文介绍的快速高效的全新模式匹配算法qs,是bm的简化算法形式,具体描述如下:当p[1,2......n]和t[i,i+1, (i)
+n-1]对齐的情况下,就可以实现匹配。
如果匹配失败,就分析t[i +n]个字符,以此判断右移p[1,2……n]的距离。
由于某一次匹配失败之后,模式会至少向右侧移动一格位置,那么一般情况下,t[i +n]字符就会在下一次匹配中出现。
因此,匹配失败后,就可以综合考虑t[i+n]而非t[i,i+1,……i+n-1]中的某个字符,这样模式最大右移的距离是n+1,在bm算法中则是n。
以下将对两种改进方法分别进行论述:
(1)经过改进的算法,如果文本和模式的某次匹配失败,那么对于t[i,i+1,……i+n-1]左边的字符t[i-1]就可以采取坏字符移动的方式,而t[i,i+1,……i+n-1]则采取好前缀移动。
在文本中,应该取指针移动距离最大的一个,即minlength+1(minlength)是模式集合中的最短模式长度。
针对文本中的所有字符(w)来说,可将坏字符的移动函数定义为:
如果w出现在p中,那么执行公式(1),否则执行公式(2)。
(2)在传统的匹配算法中,当匹配失败之后,就会分别计算坏字符启发函数或者好前缀启发函数,然后取其中最大值,作为移动量。
但是每次计算的时间比较长,因此需要改进坏字符优先策略。
如果利用坏字符启发可以实现n或者n+1的量,就不需要再计算前缀
启发函数,最大限度地缩短模式匹配算法时间。
经过改进的算法,预处理时间复杂度是0(││+│p│),此处││代表字符集的大小,│p│则是模式集中所有的模式长度综合。
这种算法的最佳情况为:
在每次模式树的第一个字符和文本比较不匹配,而且存在偏移量的最大值minlength+1,改进算法的最佳性能,那么比较的次数为:在每次进行模式树中的最长模式,最后一个字符和文本比较时匹配失败,那么最小偏移量是1,改进之后的算法也具备最差性能,这种情况下的比较次数为:minlength+[n-2
(minlength-1)]maxlength,时间复杂度是0(n maxlength)。
在平均情况下,时间复杂度和字符出现概率相关,可以通过概率模型计算。
由上可见,随着各种网络应用的不断完善,网络入侵检测计算日益发展,逐渐无法适应网络环境的要求,必须加快改进与优化策略,将改进的算法应用于入侵检测系统中,提高检测效率,确保网络安全运行。
参考文献
[1] 陈围.采用集合切分编码的大容量模式匹配算法[j].计算机应用研究,2011(6).
[2] 王烁.字符串模式匹配的硬件加速研究[j].中国科学技术大学:通信与信息系统.2008.
[3] 孙伟.基于模式匹配和协议分析的入侵检测技术研究[j].湖
南大学:计算机应用技术,2006.
[4] 鲁宏伟,魏凯,孔华锋.一种改进的kmp高效模式匹配算法[j].华中科技大学学报,2006(10).
[5] 张航,王宏志,李建中,高宏.基于2-hop优化的子图模式匹配算法[j].黑龙江大学自然科学学报,2010
(1).
[6] 陶世群,富丽贞.一种高效非归并的xml小枝模式匹配算法[j].软件学报,2009(4).
[7] 郑海涛.基于网络信息内容的dns检测系统的设计与实现[j].北京交通大学:通信与信息系统,2009.
[8] 谷晓刚,江荣安,赵铭伟.snort的高效规则匹配算法[j].计
算机工程,2006(18).。