是否有可以识别相似文件或字符串的哈希算法?

信息安全 哈希 病毒 杀毒软件
2021-08-31 03:26:57

是否有哈希算法可以帮助您识别相似的文件或字符串?例如,ABC 和 XBC 的哈希值将是相似的,而不是通常情况下的根本不同。我知道一种相似性度量,即编辑距离(http://en.wikipedia.org/wiki/Edit_distance)。但这并没有为您提供要比较的每个输入的哈希值,而只是任何两个输入之间的分数。

更新

Andan 的评论(局部敏感散列,LSH)是我正在寻找的。我提出这个问题的动机是想知道如何使用 LSH 扫描恶意软件。它是否用于识别恶意软件?为什么或者为什么不?

更新

根据汤姆·李克的回答,我自己做了一些调查。我写了一个程序,它可以用预先确定的“随机”模式(种子没有改变)对文件的字节进行异或。然后它将总和 1 位。这将产生从随机模式到文件的汉明距离。确实,这不是一个非常有用的指标,因为它基本上(平均而言)只是将文件大小减半以得出一个数字。

一些例子:

我扫描的两个相关可执行文件得分为 2684964 和 2738772,差异为 53808。它们肯定是相关的(我编写的程序的不同版本),但 53k 的值接近文件大小差异的一半(以位为单位):~128k。因此,它不是确定相似性的有用指标。

我扫描了两个大小相似的 JPEG,它们绝对是不同的图像。他们扫描为 3124915 和 3110981 的差异为 13934。因此它们的差异“小于”相关可执行文件之间的差异,即使它们不相关。因此,它也不是确定差异的有用指标。

结论:

正如 Tom Leek 所说,这是一个悬而未决的问题是有原因的。

4个回答

“近似匹配算法”(仍然是 NIST 草案)或“相似性保留哈希函数”可能会引起您的兴趣。这些算法专门用于确定两个数字对象之间的相似性。到目前为止(并且有用的)一些提议的算法是(按时间顺序):ssdeepsdhashmrsh-v2

为了确定对象之间的相似性,这些算法需要最少的数据块。Mrsh-v2 在所需的最小尺寸方面表现最佳。

Mrsh-v2 在性能和所需的最小块大小方面似乎非常有前途,但仍在开发中。我希望它可能解决您处理类似文件的问题。

为什么这样的散列不存在,或者不能是术语密码意义上的“散列”,有充分的理论理由。简而言之,如果两个“相似”输入的哈希值本身彼此“相似”,那么您可以使用它来有效地从给定输出中恢复输入,这与原像电阻相矛盾。

从您的标签中,我想您正在尝试设计一个防病毒软件,该软件知道N 个病毒“签名”以及检测与这些N值中的任何一个“相似”(出于某种相似性概念)的任何病毒,但具有计算成本大大低于N 次比较(因为N可能非常高)。当相似性的概念是“完全相等”时,您可以对签名进行排序并使用成本O(log N)进行二进制搜索(然后使用散列函数通过确保所有“签名”具有固定的大小不变)。然而,对于不那么尖锐的相似性概念,问题就变得困难了。

数据库相似性搜索是生物信息学的一个已知问题,它用于核苷酸序列和类似对象的序列,尽管偶尔存在差异,但必须在巨大的数据库中进行匹配。底线是:

  • 有可能的解决方案,但它们依赖于可能遇到的实际差异的概率模型。
  • 几十年来,人们一直在寻找一个好的解决方案,并且仍在寻找。

防病毒软件在不让机器慢下来的情况下检查签名的实际方法是他们业务的核心,因此他们不太健谈是可以理解的。我们可以推测,他们提出的任何解决方案都可能涉及对在野外观察到的实际病毒变异进行大量调整和假设。

散列专门用于使输入看起来尽可能不同。您想要的是一种聚类算法,旨在将“相似”项目分类到相同或相邻的 bin 中。相似性不是一个定义明确的概念,您需要一个特定于域的定义。

就像一个思想实验一样,假设您想检测通过从其他文档中剪切和粘贴来完成的学期论文欺诈行为。您可能会执行以下操作:

  1. 散列每个 4 字序列并计算每个散列的出现次数。
  2. 丢弃出现在大型通用文档字典中的所有哈希值。
  3. 对剩下n 个最常见的哈希值进行分类。

要比较两个文档的相似性,请计算它们共有多少个分箱哈希。

您指的是局部敏感散列: https ://en.wikipedia.org/wiki/Locality-sensitive_hashing

旁注:散列并不像某些人所建议的那样本质上是分散的。这是加密哈希的显式属性。散列本身只是从变量到固定大小值的映射(实际上并不完全正确,参见例如 ssdeep)。在现实世界的散列函数中,它们是非内射满射函数,这基本上意味着它们可以发生冲突。