入侵检测规则匹配算法,分为单模式匹配算法和多模式匹配算法。

1. 单模式匹配

单模式匹配,就是一个串跟一个串进行匹配,常见算法有:BM算法和KMP算法。

1.1 BF (Brute Force)暴力匹配算法

作为最简单、最暴力的字符串匹配算法,BF 算法的思想可以用一句话来概括,那就是,我们在主串中,检查起始位置分别是 0、1、2…n-m 且长度为 m 的 n-m+1 个子串,看有没有跟模式串匹配的。

  • 理论上的最坏情况时间复杂度是 O(n*m),但是,统计意义上,大部分情况下,算法执行效率要比这个高很多。
  • 朴素字符串匹配算法思想简单,代码实现也非常简单。简单意味着不容易出错,如果有 bug 也容易暴露和修复。

2.2 RK(Rabin-Karp) 算法

BF算法每次检查主串与子串是否匹配,需要依次比对每个字符,所以 BF 算法的时间复杂度就比较高,是 O(n*m)。

RK 算法的思路是这样的:
我们通过哈希算法对主串中的 n-m+1 个子串分别求哈希值,然后逐个与模式串的哈希值比较大小。如果某个子串的哈希值与模式串相等,那就说明对应的子串和模式串匹配了。


模式串哈希值与每个子串哈希值之间的比较的时间复杂度是 O(1),总共需要比较 n-m+1 个子串的哈希值,所以,这部分的时间复杂度也是 O(n)。所以,RK 算法整体的时间复杂度就是 O(n)。

跟 BF 算法相比,效率提高了很多。不过这样的效率取决于哈希算法的设计方法,如果存在冲突的情况下,时间复杂度可能会退化。极端情况下,哈希算法大量冲突,时间复杂度就退化为 O(n*m)。

2.3 BM(Boyer-Moore)算法

参考:http://www.cs.jhu.edu/~langmea/resources/lecture_notes/boyer_moore.pdf

我们把模式串和主串的匹配过程,看作模式串在主串中不停地往后滑动。当遇到不匹配的字符时,BF 算法和 RK 算法的做法是,模式串往后滑动一位,然后从模式串的第一个字符开始重新匹配。

如果我们可以一次性往后滑动好几位,那匹配的效率岂不是就提高了?

BM 算法,本质上其实就是在寻找这种规律,当模式串和主串某个字符不匹配的时候,能够跳过一些肯定不会匹配的情况,将模式串往后多滑动几位。

BM 算法构建的规则有两类,坏字符规则和好后缀规则

  • 坏字符规则:If we mismatch, use knowledge of the mismatched text character to skip alignments
  • 好后缀规则:If we match some characters, use knowledge of the matched characters to skip alignments

2.4 KMP算法

KMP 算法的核心思想,跟上一节讲的 BM 算法非常相近。我们假设主串是 a,模式串是 b。在模式串与主串匹配的过程中,当遇到不可匹配的字符的时候,我们希望找到一些规律,可以将模式串往后多滑动几位,跳过那些肯定不会匹配的情况

2. 多模式匹配

多模式匹配,在一个串中同时查找多个串,常见算法有:AC自动机算法和Trie树算法。

2.1 Trie树

Trie 树,也叫“字典树”。顾名思义,它是一个树形结构。它是一种专门处理字符串匹配的数据结构,用来解决在一组字符串集合中快速查找某个字符串的问题。

举个简单的例子来说明一下。我们有 6 个字符串,它们分别是:how,hi,her,hello,so,see。我们希望在里面多次查找某个字符串是否存在。如果每次查找,都是拿要查找的字符串跟这 6 个字符串依次进行字符串匹配,那效率就比较低,有没有更高效的方法呢?这个时候,我们就可以先对这 6 个字符串做一下预处理,组织成 Trie 树的结构,之后每次查找,都是在 Trie 树中进行匹配查找。

Trie 树的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起。


如果要在一组字符串中,频繁地查询某些字符串,用 Trie 树会非常高效。

构建 Trie 树的过程,需要扫描所有的字符串,时间复杂度是 O(n)(n 表示所有字符串的长度和)。

但是一旦构建成功之后,后续的查询操作会非常高效。如果要查询的字符串长度是 k,那我们只需要比对大约 k 个节点,就能完成查询操作。跟原本那组字符串的长度和个数没有任何关系。所以说,构建好 Trie 树后,在其中查找字符串的时间复杂度是 O(k),k 表示要查找的字符串的长度。

字符串中包含的字符集不能太大,要求字符串的前缀重合比较多,如果字符集太大,那存储空间可能就会浪费很多。即便可以优化,但也要付出牺牲查询、插入效率的代价。

2.2 AC( Aho-Corasick)自动机

假设需要模式串有上万个,通过单模式串匹配算法(比如 KMP 算法),需要扫描几千遍。很显然,这种处理思路比较低效。

Trie 树就是一种多模式串匹配算法。我们用Trie树可以对上千个模式串字典进行预处理,构建成 Trie 树结构。这个预处理的操作只需要做一次,如果字典动态更新了,比如删除、添加了一个模式串,那我们只需要动态更新一下 Trie 树就可以了。

AC 自动机算法,全称是 Aho-Corasick 算法。其实,Trie 树跟 AC 自动机之间的关系,就像单串匹配中朴素的串匹配算法,跟 KMP 算法之间的关系一样,只不过前者针对的是多模式串而已。所以,AC 自动机实际上就是在 Trie 树之上,加了类似 KMP 的 next 数组,只不过此处的 next 数组是构建在树上罢了。

3. Hyperscan

Hyperscan是一款来自于Intel的高性能的正则表达式匹配库。它是基于X86平台以PCRE为原型而开发的,并以BSD许可开源在https://01.org/hyperscan。在支持PCRE的大部分语法的前提下,Hyperscan增加了特定的语法和工作模式来保证其在真实网络场景下的实用性。与此同时,大量高效算法及IntelSIMD*指令的使用实现了Hyperscan的高性能匹配。Hyperscan适用于部署在诸如DPI/IPS/IDS/FW等场景中,目前已经在全球多个客户网络安全方案中得到实际的应用。此外,Hyperscan还支持和开源IDS/IPS产品Snort(https://www.snort.org)和Suricata (https://suricata-ids.org)集成,使其应用更加广泛。

3.1 功能

功能多样

作为纯软件产品,Hyperscan支持Intel处理器多平台的交叉编译,且对操作系统无特殊限定,同时支持虚拟机和容器场景。Hyperscan 实现了对PCRE语法的基本涵盖,对复杂的表达式例如”.”和”[^>]”不会有任何支持问题。在此基础上,Hyperscan增加了不同的匹配模式(流模式和块模式)来满足不同的使用场景。通过指定参数,Hyperscan能找到匹配的数据在输入流中的起始和结束位置。更多功能信息请参考http://01org.github.io/hyperscan/dev-reference/。

大规模匹配

根据规则复杂度的不同,Hyperscan能支持几万到几十万的规则的匹配。与传统正则匹配引擎不同,Hyperscan支持多规则的同步匹配。在用户为每条规则指定独有的编号后,Hypercan可以将所有规则编译成一个数据库并在匹配过程中输出所有当前匹配到的规则信息。

流模式(streaming mode)

Hyperscan主要分为两种模式:块模式 (blockmode)和流模式 (streaming mode). 其中块模式为状态正则匹配引擎具有的模式,即对一段现成的完整数据进行匹配,匹配结束即返回结果。流模式是Hyperscan为网络场景下跨报文匹配设计的特殊匹配模式。在真实网络场景下,数据是分散在多报文中。若有数据在尚未到达的报文中时,传统匹配模式将无法适用。在流模式下,Hyperscan可以保存当前数据匹配的状态,并以其作为接收到新数据时的初始匹配状态。如图3所示,不管数据”xxxxabcxxxxxxxxdefx”以怎样的形式被分散在以时间顺序到达的报块中,流模式保证了最后匹配结果的一致性。另外,Hyperscan对保存的匹配状态进行了压缩以减少流模式对内存的占用。Hyperscan流模式解决了数据完整性问题,极大地简化用户网络流处理的过程。

3.2 原理

Hyperscan以自动机理论为基础,其工作流程主要分成两个部分:编译期(compiletime)和运行期(run-time)。

编译期
Hyperscan 自带C++编写的正则表达式编译器。如图1所示,它将正则表达式作为输入,针对不同的IA平台,用户定义的模式及特殊语法,经过复杂的图分析及优化过程,生成对应的数据库。另外,生成的数据库可以被序列化后保存在内存中,以供运行期提取使用。
运行期
Hyperscan的运行期是通过C语言来开发的。
用户需要预先分配一段内存来存储临时匹配状态信息,之后利用编译生成的数据库调用Hyperscan内部的匹配引擎(NFA, DFA等)来对输入进行模式匹配。Hyperscan在引擎中使用Intel处理器所具有的SIMD指令进行加速。同时,用户可以通过回调函数来自定义匹配发生后采取的行为。由于生成的数据库是只读的,用户可以在多个CPU核或多线程场景下共享数据库来提升匹配扩展性。

参考

数据结构与算法之美 王争
Intel高性能正则表达式匹配库——Hyperscan

入侵检测规则匹配算法--单模匹配算法、多模匹配算法、hyperscan相关推荐

  1. 基于Snort的入侵检测系统

    基于Snort的入侵检测系统 用Snort,Apache,MySQL,PHP及ACID构建高级IDS 第一章 入侵检测系统及Snort介绍 在当今的企业应用环境中,安全是所有网络面临的大问题.黑客和入 ...

  2. 信息安全-入侵检测技术原理与应用

    一.入侵检测概述 1.1 入侵检测概念 入侵应与受害目标相关联,该受害目标可以是一个大的系统或单个对象 判断与目标相关的操作是否为入侵的依据:对目标的操作是否超出了目标的安全策略范围 入侵:指违背访问 ...

  3. [ 笔记 ] 计算机网络安全_6_入侵检测系统

    [笔记] 计算机网络安全:(6)入侵检测系统 网络安全基础 internet协议的安全性 Web安全 网络扫描和网络监听 防火墙原理与设计 入侵检测系统 VPN技术 目录 [笔记] 计算机网络安全:( ...

  4. 信息安全软考 第十章 入侵检测技术原理应用

    入侵检测概述 入侵检测技术 ※ 入侵检测系统组成与分类 ※ 入侵检测系统主要产品与技术指标 入侵检测应用 ※ ※    命题规则:上午选择题2分左右,下午案例题结合其他知识考5-8分    入侵检测是 ...

  5. [转]多模匹配算法与dictmatch实现

    来源:http://stblog.baidu-tech.com/?p=418 多模式匹配在这里指的是在一个字符串中寻找多个模式字符字串的问题.一般来说,给出一个长字符串和很多短模式字符串,如何最快最省 ...

  6. 多模匹配算法与dictmatch实现

    多模式匹配在这里指的是在一个字符串中寻找多个模式字符字串的问题.一般来说,给出一个长字符串和很多短模式字符串,如何最快最省的求出哪些模式字符串出现在长字符串中是我们所要思考的.该算法广泛应用于关键字过 ...

  7. AC多模匹配算法小结

    AC 多模匹配算法小结 1.AC算法的原理 本程序采用了AC的多模匹配方法.Aho_Corasick自动机匹配算法是最著名的多模匹配算法之一.该算法在1975年产生于贝尔实验室. AC自动机匹配算法基 ...

  8. 双向最大匹配算法(含完整代码实现,ui界面)正向最大匹配算法,逆向最大匹配算法

    双向最大匹配算法(含完整代码实现,ui界面)正向最大匹配算法,逆向最大匹配算法 一.理论描述 中文分词(Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词 ...

  9. 网络入侵检测--Snort软件规则编写

    Snort规则编写 今天主要来讲一下Snort中的规则编写规则,还有些绕口,就是编写他们的rules的方法,可以帮助我们理解他们提供的rules和定义我们自己的rules. 首先我们来看一条规则 al ...

最新文章

  1. 英文VS2010安装中文版MSDN文档方法
  2. python报错输出到日志_Python日志记录和子进程输出和错误流
  3. stm32l0的停止模式怎么唤醒_最强家庭娱乐系统+儿童模式,小度在家智能屏X8开售抢先体验...
  4. On Comparing Side-Channel Preprocessing Techniques for Attacking RFID Devices
  5. 区块链六-Merkle Tree
  6. 一文掌握Python集合的语法与应用
  7. 10-C++实现栈的常见操作
  8. ant design vue table 高度自适应_Vue.JS 实现拼拼乐小游戏项目
  9. linux ip命令dhcp,嵌入式linux通过DHCP自动获取IP地址实现获取
  10. 使用DNSObserver检测DNS安全漏洞
  11. android下最强的3款pdf阅读器测评
  12. zen服务器芯片,Intel颤抖!AMD 32核心终极版Zen亮相:媲美人脑
  13. python图像量化及采样处理
  14. 三、单因素方差分析例题(R语言)
  15. 考研408.计算机网络.特殊IP地址的记忆方法
  16. 第一章 绪论 思维导图
  17. 如何利用word制作三线表
  18. Ubuntu下flash运行方法(2020.12后可用)
  19. 环迅支付深耕跨境支付,为跨境电商崛起添翼
  20. SpringBoot+Schedule 定时任务的配置开关

热门文章

  1. 14Linux远程登录And15Linux远程文件传输
  2. c语言编写图形登录窗口,「分享」C语言如何编写图形界面
  3. uboot阶段flash分区_1.12.uboot的烧写和flash分区1
  4. 装Oracle10时报错,win10系统安装oracle10g时出现未知错误的详细教程
  5. linux 主机名修改日志,Linux:修改主机名【Centos7】
  6. java对焦_相机的对焦与合焦
  7. java中常见的包类接口_Java中一些常用的类,包,接口
  8. Python报错'builtin_function_or_method' object is not iterable
  9. 天津农学院计算机考研专业,2021年天津农学院计算机与信息工程学院考研专业目录_研究生考试范围 - 学途吧...
  10. python获取命令行参数,使用getopt获取命令行执行时指定的参数