[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 ...
随机推荐
- Fluent动网格【5】:部件变形
在动网格中关于部件运动除了指定刚体运动外,有时还需要指定某些边界的变形,这种情况经常会遇到,尤其是与运动部件存在相连接边界的情况下,如下图中边界1运动导致与之相连的边界2和边界3发生变形. Fluen ...
- lua -- 生成协议
这是爬塔的协议 <?xml version="1.0" encoding="utf-8" ?> <coder name="Tower ...
- Java知多少(85)文本框和文本区
在图形界面中,文本框和文本区是用于信息输入输出的组件. 文本框 文本框(JTextField)是界面中用于输入和输出一行文本的框.JTextField类用来建立文本框.与文本框相关的接口是Action ...
- java-信息安全(十六)-双向认证
原文地址 http://snowolf.iteye.com/blog/510985 对于双向认证,做一个简单的描述. 服务器端下发证书,客户端接受证书.证书带有公钥信息,用于验证服务器端.对数据加密/ ...
- 用Physijs在场景中添加物理效果
1.创建可用Physijs的基本Three.js场景 创建一个可用Physijs的Three.js场景非常简单,只要几个步骤即可.首先我们要包含正确的文件, 需要引入physi.js文件.实际模拟物理 ...
- python中,numeric(数字类型)和integer(整型)的区别
说明: 在今天做int实现的过程中,官方函数的解释是将numeric转换为integer,就突然不明白,两个有啥区别. numeric-数字类型包括: int,float,bool,complex i ...
- Hibernate常见面试题(转)
在Java J2EE方面进行面试时,常被问起的Hibernate面试问题,大多都是针对基于Web的企业级应用开发者的角色的.Hibernate框架在Java界的成功和高度的可接受性使得它成为了Java ...
- 使用 wondershaper 在 Linux 中限制网络带宽使用
wondershaper 实际上是一个 shell 脚本,它使用 tc 来定义流量调整命令,使用 QoS 来处理特定的网络接口.外发流量通过放在不同优先级的队列中,达到限制传出流量速率的目的:而传入流 ...
- iOS开发-- Xcode 6单元测试
占坑 http://m.oschina.net/blog/377800 http://www.cnblogs.com/sunshine-anycall/p/4155649.html http://ob ...
- Win7/Win8安装"我们无法创建新的分区,也找不到现有的分区"的解决方法
如果你用pe启动光盘和pe启动盘.加载iso安装时遇到"我们无法创建新的分区,也找不到现有的分区"的情况.. 把iso里的boot和bootgmr以及sources复制到c盘,pe ...