[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 ...
随机推荐
- 【Spark 深入学习 04】再说Spark底层运行机制
本节内容 · spark底层执行机制 · 细说RDD构建过程 · Job Stage的划分算法 · Task最佳计算位置算法 一.spark底层执行机制 对于Spark底层的运行原理,找到了一副很好的 ...
- Roller5.0.3安装配置部署 step by step
一.下载roller 下载地址:http://roller.apache.org/downloads/downloads.html下载下来之后,解压包含两部份doc.webapps 二.准备环境 1. ...
- 解决Redis之MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist o...
解决Redis之MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist o... ...
- 使用自定义的 Manager
class CategoryManager(models.Manager): """ A manager that adds an "active()" ...
- Linux查看文件总的数据行数,并按行拆分
先利用 wc -l BLM.txt 读出 BLM.txt 文件一共有多少行. 再 1. 以行数拆分 -l 参数: split –l 50 原始文件 拆分后文件名前缀 例:以50行对文件进行 ...
- Spring Security 之Http Basic认证
使用Spring Security进行http Basic认证非常简单,直接配置即可使用,如下: <security:http> <security:http-basic>&l ...
- Vue获取DOM元素的属性值
项目中需要做一个小弹层,如下图: 我需要知道点击元素距离顶部的值,再计算弹层的top值,如下图: 在vue中如何获取到DOM元素距离窗口顶部的值呢? 1.通过$event获取 html: <di ...
- elasticsearch client 为空 错误信息:java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava/util/concurrent/Executor
错误信息:java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.directExecutor() ...
- [UFLDL] *Sparse Representation
Deep learning:二十九(Sparse coding练习) Deep learning:二十八(使用BP算法思想求解Sparse coding中矩阵范数导数) Deep learning:二 ...
- Maven & Gradle 如何从中央仓库下载Jar包
https://mvnrepository.com/ maven 中央仓库 gradle可以轻松的完成Android项目对第三方jar包文件的依赖下载,再也不需要我们手动下载jar包,然后拷贝到 ...