[algorithm][security] 模糊哈希(转)
modsecurity中用到: http://ssdeep.sourceforge.net/
原文:http://www.xuebuyuan.com/1536438.html
最近看一篇paper,无意中看见了一种模糊哈希算法——fuzzy hash算法。于是立刻去翻阅相关资料,整理出如下文章。
首先说说哈希算法。
大家都知道函数实际上就是一种映射,本质是将一个集合通过对应法则f映射到另一个集合。 而哈希算法是一个特殊的函数,他具有的特点是,定义域是一个不确定的无限集合而值域是一个有限集合。简单来说,哈希算法就是将一个任意大的数据项(如计算机文件)映射为固定长度(比原数据短的多)的二进制位串,也就是哈希值。就目前而言,哈希算法依然能够确保它是原始数据的唯一标识,就像人的指纹可以唯一地标识一个人,因此哈希算法还具有精确匹配的特性。
常见的哈希算法包括:MD5、sha1、sha256、crc32等等。就不多说了
好了,对哈希算法有了基本概念,就来谈谈由此发展而来的fuzzy hash(模糊哈希)算法。
上文提及了哈希算法具有精确匹配的特性,具体来说就是,原文件哪怕仅仅只是一个字节的变化也会导致最后的哈希值发生明显的变化。这个特性使得哈希算法能够确定一个文件是否被修改过,然而这也带来了很大的局限性,那就是无法分辨内容稍有不同的同类文件。这对我们的反病毒过程来说是很不利的,因为一个样本的变种是数量最多的。
于是我们为了解决这个问题,发明了模糊哈希算法。该模糊哈希的算法与模糊逻辑搜索很像,它可以寻找相似但不完全相同的文档,即所谓的同源性文件。模糊哈希算法是基于哈希算法的,和哈希算法的不同点在于,哈希算法是将整个文件作为定义域来求算结果,而模糊哈希算法则是先对文件进行分块,计算每一块的哈希值,然后将得到的一系列哈希值利用比较函数于其他哈希值进行比较,来确定相似程度。
简而言之就是:分块——》对每个分块分别计算哈希——》结果比较
分析一下这样的算法有什么优势:比如我把一个文件的某一小部分进行了修改,如果是传统哈希由于是对整个文件进行计算,因此这一点改变就导致了结果的不同。而模糊哈希由于先对文件进行了分块,因此仅仅对某一部分进行修改只会导致某一或某几个分块的哈希值发生变化,而其他分块的哈希值并不变化,通过对比就可以很容易发现相似性。
目前模糊哈希算法,有开源研究项目
ssdeep:http://ssdeep.sourceforge.net/
原版研究在这里,Identifying almost identical files using context triggered piecewise hashing
然后我们来看看金山的微特征,通过对国家专利局的检索,我们发现了金山的微特征提取专利,
摘要如下:本发明涉及计算机杀毒软件领域,尤其涉及一种对病毒文件自动提取特征的方法和装置。对病毒文件自动提取特征的方法,在病毒文件中选取N个适合提取病毒特征的固定位置,每个固定位置分配一个位置ID号,以其中M个固定位置的位置ID号和这M个固定位置所对应的特征值作为病毒特征;所述特征值是指以某个所述固定位置为起点,取长度为L的一段二进制数据来计算的HASH值;其中N≥2,M≥2且M≤N,L>0。本发明方法和装置所提取的病毒特征大大提高了文件扫描的速度;而且可以用一个病毒特征匹配大量的相似或者相同的病毒文件。
从摘要就能总结出金山微特征具有如下特点:首先它是基于hash值的,并且是取固定长度的文件块来计算哈希值,且对一个文件提取了多个分块。
简而言之就是:确定分块位置并记录——》分块——》对每个分块计算哈希值——》结果比较
和模糊哈希的理论基础以及整个流程如出一辙,我不说你懂得!
[algorithm][security] 模糊哈希(转)的更多相关文章
- 转:MD5(Message-Digest Algorithm 一种哈希算法)
什么是MD5算法 MD5讯息摘要演算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码杂凑函数,可以产生出一个128位元(16位元组)的散列值(hash val ...
- [Algorithm] 局部敏感哈希算法(Locality Sensitive Hashing)
局部敏感哈希(Locality Sensitive Hashing,LSH)算法是我在前一段时间找工作时接触到的一种衡量文本相似度的算法.局部敏感哈希是近似最近邻搜索算法中最流行的一种,它有坚实的理论 ...
- 从NLP任务中文本向量的降维问题,引出LSH(Locality Sensitive Hash 局部敏感哈希)算法及其思想的讨论
1. 引言 - 近似近邻搜索被提出所在的时代背景和挑战 0x1:从NN(Neighbor Search)说起 ANN的前身技术是NN(Neighbor Search),简单地说,最近邻检索就是根据数据 ...
- [Algorithm] 使用SimHash进行海量文本去重
在之前的两篇博文分别介绍了常用的hash方法([Data Structure & Algorithm] Hash那点事儿)以及局部敏感hash算法([Algorithm] 局部敏感哈希算法(L ...
- .NET Core加解密实战系列之——消息摘要与数字签名算法
目录 简介 功能依赖 消息摘要算法 MD算法 家族发展史 应用场景 代码实现 MD5 示例代码 SHA算法 应用场景 代码实现 SHA1 SHA256 示例代码 MAC算法 HMAC算法的典型应用 H ...
- SpringBoot - 集成Auth0 JWT
目录 前言 session认证与Token认证 session认证 Token认证 JWT简介 JWT定义 JWT数据结构 JWT的类库 具体实现 JWT配置 JWT工具类 测试接口 前言 说说JWT ...
- Atitit 判断判断一张图片是否包含另一张小图片
Atitit 判断判断一张图片是否包含另一张小图片 1. keyword1 2. 模板匹配是在图像中寻找目标的方法之一(切割+图像相似度计算)1 3. 匹配效果2 4. 图片相似度的算法(感知哈希算 ...
- SK-Learn使用NMF(非负矩阵分解)和LDA(隐含狄利克雷分布)进行话题抽取
英文链接:http://scikit-learn.org/stable/auto_examples/applications/topics_extraction_with_nmf_lda.html 这 ...
- 第25章 项目6:使用CGI进行远程编辑
初次实现 25-1 simple_edit.cgi --简单的网页编辑器 #!D:\Program Files\python27\python.exeimport cgiform = cgi.Fiel ...
随机推荐
- Socket网络编程--简单Web服务器(5)
这一小节我们将实现服务器对get和post的请求进行对cgi程序的调用.对于web服务器以前的章节已经实现了对get和post请求的调用接口,接下来给出对应接口的实现. int WebServer:: ...
- C++ 重载(overload)、重写(overrride)、重定义(redefine)总结
引自:http://www.189works.com/article-42111-1.html 先来看几个概念: 重载(overload),重写(override,也称覆盖), 重定义(redefin ...
- Ramda函数式编程之PHP
0x00 何为函数式编程 网上已经有好多详细的接受了,我认为比较重要的有: 函数是"第一等公民",即函数和其它数据类型一样处于平等地位 使用"表达式"(指一个单 ...
- Centos 7 查看电池电量信息
而不像 ubuntu 在 /proc/acpi/battery/BAT 中. 其中 capacity 参数就是当前电脑的剩余电量的百分比信息了
- 和我一起学《HTTP权威指南》——安全HTTP与HTTPS
安全HTTP HTTPS是最流行的HTTP安全形式. HTTPS方案的URL以https://开头 使用HTTPS时,所有的HTTP请求和响应数据在发送到网络之前,都要进行加密.HTTPS在HTTP传 ...
- cookie是如何保存到客户端,又是如何发送到服务端
Cookie相关的Http头 有 两个Http头部和Cookie有关:Set-Cookie和Cookie. Set-Cookie由服务器发送,它包含在响应请求的头部中.它用于在客户端创 ...
- JSESSIONID、SESSION、cookie .
所谓session可以这样理解:当与服务端进行会话时,比如说登陆成功后,服务端会为用户开壁一块内存区间,用以存放用户这次会话的一些内容,比如说用户名之类的.那么就需要一个东西来标志这个内存区间是你的而 ...
- Nginx-配置https虚拟服务(访问http时自动跳转https)
https口令文件和nginx配置文件位置关系: nginx配置文件内容如下: #user nobody; worker_processes 1; #设置工作进程数 pid logs/nginx.pi ...
- findpanel 的相关代码
https://blog.csdn.net/zengcong2013/article/details/43118189 In addition to this method, you can use ...
- mdadm命令详解
创建阵列(-C或--create) --raid-devices(-n) 功能:指定阵列中成员盘个数. 举例:mdadm --create /dev/md0 -l5 -n2 /dev/sdb /dev ...