你能通过比较两个哈希来找出变化有多大吗?

信息安全 哈希
2021-08-21 14:08:30

我意识到散列函数是单向函数,散列的变化应该告诉我们原始数据已经改变(即使数据发生最轻微的变化,整个散列也会发生变化)。

但是,当两个哈希值不同时,有没有办法找出原始数据的变化程度?

4个回答

不,至少具有良好的哈希函数。

您可以通过在特定数据集上创建散列,然后在不同数据集上创建修改后的散列来自行测试。您将看到生成的哈希函数的每一位都有大约 50% 的翻转机会。

我将通过创建字符串的 SHA-256 哈希来证明这一点MechMK1

$ echo -n "MechMK1" | sha256sum
2c31be311a0deeab37245d9a98219521fb36edd8bcd305e9de8b31da76e1ddd9

将其转换为二进制时,您会得到以下结果:

00101100 00110001 10111110 00110001 00011010 00001101 11101110 10101011
00110111 00100100 01011101 10011010 10011000 00100001 10010101 00100001
11111011 00110110 11101101 11011000 10111100 11010011 00000101 11101001
11011110 10001011 00110001 11011010 01110110 11100001 11011101 11011001

现在我计算字符串的 SHA-256 哈希MechMK3,它改变了输入的一位:

$ echo -n "MechMK3" | sha256sum
3797dec3453ee07e60f8cf343edb7643cecffcf0af847a73ff2a1912535433cd

再次转换为二进制时,您会得到以下结果:

00110111 10010111 11011110 11000011 01000101 00111110 11100000 01111110
01100000 11111000 11001111 00110100 00111110 11011011 01110110 01000011
11001110 11001111 11111100 11110000 10101111 10000100 01111010 01110011
11111111 00101010 00011001 00010010 01010011 01010100 00110011 11001101

我比较了这两个结果,并检查了两个哈希值的差异频率,恰好有 128 位或所有位的 50% 不同。如果您想自己尝试一下,看看会得到什么样的结果,我创建了一个简单的 C 程序来完成这个任务。

TL:博士;在加密哈希函数中;任何两条不同消息的哈希值应该在统计上是独立的。$


我意识到散列是一种单向函数,散列的变化应该告诉我们原始数据发生了变化(即使数据发生最轻微的变化,整个散列也会发生变化)。

Avalanche Criteria除了是单向的,也是我们想要的好的 Cryptographic 散列函数;

  • 输入中的单个位变化导致每个输出位的变化有 50% 的概率。

  • 多位变化:这有点棘手,如果我们考虑哈希函数存档以根据随机预言模型对伪随机函数进行建模,那么我们可以考虑每个输入位平均变化 50%,这没关系改变了多少位。

    人们可以通过考虑一点来看到这一点,如果 Head 出现翻转,而 Tail 出现时翻转硬币,则不要翻转 50% 的翻转。现在,扔另一个硬币并做同样的事情。结果是一样的(简单的数学)。

    当然,我们无法实现随机预言机模型。因此,输出位不是相互独立的。它们似乎只要可以找到一个区分符,就会构成对哈希函数的密码分析攻击。一旦找到一个好的密码散列函数,你就会在新闻中看到它。

证明散列函数具有 Avalanche Criteria 是一个统计过程,您需要测试许多随机输入值。并非所有输入和位补码都会导致一半位发生变化,这不是预期的行为您还需要证明输出位是随机更改的。

如果不满足此哈希函数,则可能无法满足原像抗性、第二原像抗性和碰撞抗性*

  • preimage-resistance - 对于基本上所有预先指定的输出,在计算上找到任何散列到该输出的输入是不可行的,即,找到任何原像x',使得h(x') = y当给定任何对应输入未知的 y 时。
  • 2nd-preimage resistance,weak-collision——在计算上找到与任何指定输入具有相同输出的任何第二个输入是不可行的,即给定x,找到一个 2nd-preimagex' != x使得h(x) = h(x')
  • 抗碰撞,强碰撞——在计算上找到任何两个不同的输入是不可行的xx'它们散列到相同的输出,即这样h(x) = h(x')

每个失败都可能导致攻击,如果成功,那么这可能是毁灭性的。一个例子; 考虑有人找到与您的原始消息相同的具有相同价值的第二条消息(或 Linux CD ISO 的哈希);

This is a signed message representing the payment is $1.00, have a nice day
I will pay you $1,000,000.00 have a nice day

希望即使是 SHA-1 和 MD5 也能抵抗这种攻击。因此,您可以假设如果哈希值发生变化,数据也会发生变化。随机文本与您的值具有相同哈希值的概率可以忽略不计。

但是,当两个哈希值不同时,有没有办法找出原始数据的变化程度?

希望不是如果有一个单一的偏见可以提供有关聪明的攻击者可以使用的更改的信息。


* 这是正式定义,取自 rom Rogaway 和 Shrimpton 开创性论文Cryptographic Hash-Function Basics:...

$ 感谢 FutureSecurity 的简化

正如其他答案已经指出的那样,密码散列函数的答案是“否” 。这些通常被设计为尽可能像一个完全随机的函数,并且为类似输入生成的哈希输出中任何可检测的相似性也将允许将哈希与随机函数区分开来。 *

但是,还有其他类型的散列函数,例如局部敏感散列,其答案至少可以是“是的,有时”。

特别是,局部敏感散列通常具有诸如“根据某个相似性度量,任何两个输入最多相差 δ 的任何两个输入,在概率p > 0情况下,具有与其他一些(可能相同的)相似性度量。” 通常,散列的距离度量可能类似于汉明距离,而输入的相应度量可能是例如编辑距离选择合适的局部敏感哈希函数主要取决于您感兴趣的特定距离度量。


*) 从技术上讲,安全密码散列的经典定义只需要抗冲突性和第一和第二原像抗性我没有看到任何明显的方法来证明散列函数不能具有这些属性,同时在某种程度上也对局部性敏感,尽管它们确实施加了一些相当重要的约束。特别是,对于任何合理的 δ 值,距离任何给定哈希输出H ( x ) ε ( δ ) 内的哈希输出的数量必须比在相应输入x的距离δ内的其他输入的数量增长得更快。,否则简单地测试一堆类似的输入很可能会产生冲突。无论如何,我不知道有任何局部敏感的散列函数可以满足这种较弱的加密安全定义,而且我不知道如果存在这样的散列会是什么样子。

我确信存在一种可能的哈希类型,但加密安全哈希的目的是确保不会发生这种情况。人们不应该能够根据散列输出的变化对消息的变化做出任何猜测或推断。

密码分析师通过雪崩效应来衡量这一点。即使对输入进行了微小的更改,强哈希也应该对输出进行重大更改。