局部敏感哈希LSH

一、局部敏感哈希函数

python_mmdt:ssdeep、tlsh、vhash、mmdthash对比 : https://www.freebuf.com/sectool/321011.html

局部敏感哈希(Locality Sensitive Hashing,LSH)总结:http://yangyi-bupt.github.io/ml/2015/08/28/lsh.html

1.1 局部敏感哈希的基本概念

局部敏感哈希(Locality Sensitive Hashing,LSH)的基本思想类似于一种空间域转换思想,LSH算法基于一个假设,如果两个文本在原有的数据空间是相似的,那么分别经过哈希函数转换以后的它们也具有很高的相似度;相反,如果它们本身是不相似的,那么经过转换后它们应仍不具有相似性。

1.2 hash方法

CTPH(ssdeep):Context Triggered Piecewise Hashes(CTPH),又叫模糊哈希,最早由Jesse Kornblum博士在2006年提出,论文地址点击这里。CTPH可用于文件/数据的同源性判定。据官方文档介绍,其计算速度是tlsh的两倍(测试了一下,好像并没有)。

当使用传统的加密散列时,会为整个文件创建一个散列。单个位的变化会对输出哈希值产生雪崩效应。另一方面,CTPH 为文件的多个固定大小段计算多个传统加密哈希。它使用滚动哈希

tlsh:是趋势科技开源的一款模糊哈希计算工具,将50字节以上的数据计算生成一个哈希值,通过计算哈希值之间的相似度,从而得到原始文件之间的同源性关联。据官方文档介绍,tlshssdeepsdhash等其他模糊哈希算法更难攻击和绕过。

vhash:(翻遍了整个virustotal的文档,就找到这么一句话)“an in-house similarity clustering algorithm value, based on a simple structural feature hash allows you to find similar files”,大概就是说是个内部相似性聚类算法,允许你通过这个简单的值,找到相似的样本。

mmdthash:是开源的一款模糊哈希计算工具,将任意数据计算生成一个模糊哈希值,通过计算模糊哈希值之间的相似度,从而判断两个数据之间的关联性。详情前文1-5篇。

#### mmdthash:

通过重采样之后的数据,我们假设其满足独立同分布。同时,我们将重采样的数据,平均分成N块,每块之间的数据进行累计求和,和值分布近似服从正态分布,我们取和值高x位的一个byte做为本块数据的敏感哈希值。

51030000:D6E26822530202020202020202020202:

  • 51030000是4字节索引敏感哈希
  • D6E26822530202020202020202020202是16字节敏感哈希

1.3 应用

简单应用如,索引敏感哈希可以转成一个int32的数字,当索引敏感哈希相等时,再比较敏感哈希的距离(如曼哈顿距离,将敏感哈希转成N个unsigned char类型计算敏感哈希,此时00FF之间的距离可算作1,也可算作255,具体看实现)。

由于特征向量的维度是固定的,因此可以很方便的使用其他数学方法,进行大规模计算。

  • 如结合矩阵运算,快速得到上万特征向量(样本)的相似度矩阵,
  • 如用于机器学习的分类(KNN)、聚类(Kmeans)等