[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 ...
随机推荐
- Fiddler插件开发 - 实现网站离线浏览功能
有这么一种应用场景: 你是做前端或APP开发的,需要调用服务端提供的接口,接口只能在公司内网访问:在公司外就无法调试代码了. 想在公司外访问怎么办呢? 如果在公司的时候将所有接口的响应内容都保存起来, ...
- lua -- 物品的配置文件,表的形式保存
do local goodsprop= { RECORDS={ []={ BuyGold= , RecoverPrice= , Value= , Param2= , UseTimesPerDay= , ...
- .NET+MVC+ORACLE存储分页查询一前端实现
MemberList.cshtml @{ ViewBag.Title = "用户列表"; Layout = null;} <!DOCTYPE html> & ...
- ES6,Array.copyWithin()函数的用法
ES6为Array增加了copyWithin函数,用于操作当前数组自身,用来把某些个位置的元素复制并覆盖到其他位置上去. Array.prototype.copyWithin(target, star ...
- C++复数运算 重载
近期整理下很久前写的程序,这里就把它放在博文中了,有些比较简单,但是很有学习价值. 下面就是自己很久前实现的复数重载代码,这里没有考虑特殊情况,像除法中,分母不为零情况. #include <i ...
- linux(mac) 编译安装MySQL
Reference: https://blog.csdn.net/Tzhennan/article/details/80565235 官方下载地址: https://dev.mysql.com/do ...
- Ruby学习小记
ruby安装 方法一:使用apt-get安装 可以直接使用两个命令完成Ruby的安装. # sudo apt-get update # sudo apt-get install ruby 或者 # s ...
- Unity场景渲染相关实现的猜想
如下,很简单的一个场景,一个Panel,二个Cube,一个camera,一个方向光,其中为了避免灯光阴影的影响,关掉阴影,而Panel和二个Cube都是默认的材质,没做修改,我原猜,这三个模型应该都动 ...
- python安装模块
pychram安装模块,非常简单!
- Java如何使服务器允许连接到套接字端口?
在Java编程中,如何使服务器允许连接到套接字端口? 以下示例显示如何使服务器通过使用ServerSocket类的server.accept()方法和Socket类的sock.getInetAddre ...