MD5这样的哈希函数如何独特?

时间:2010-03-14 23:44:09

标签: hash theory md5 uniqueidentifier

我知道MD5遇到了一些冲突,但这更像是关于散列函数的高级问题。

如果MD5将任意字符串散列为32位十六进制值,那么根据Pigeonhole Principle肯定这不是唯一的,因为存在比唯一的32位十六进制值更多的唯一任意字符串。

8 个答案:

答案 0 :(得分:92)

你是正确的,它不能保证唯一性,但在32位十六进制值(16 ^ 32)中大约有3.402823669209387e + 38个不同的值。这意味着,假设算法背后的数学分布很好,你的几率非常小,以至于会出现重复。您必须记住,当您考虑如何使用它时,可以复制。 MD5通常用于确定某些内容是否已更改(即,它是校验和)。非常不可能修改某些内容并导致相同的MD5校验和。

编辑:(鉴于最新消息:SHA1哈希) 上面的答案仍然存在,但您不应期望MD5哈希作为任何类型的安全检查来防止操作。 SHA-1哈希值碰撞的可能性为2 ^ 32(超过40亿),并且已经证明可以设计输入以产生相同的值。 (很久以前就证明这是针对MD5的)。如果您希望确保没有人恶意修改某些内容以产生相同的哈希值,那么现在您需要在SHA-2上获得可靠的保证。

另一方面,如果它不在安全检查上下文中,MD5仍然具有它的用处。

可以认为SHA-2哈希值足以计算,你应该只使用它。

答案 1 :(得分:36)

你是完全正确的。但是哈希并不是“独特的”,它们是“足够独特的”。

答案 2 :(得分:9)

正如其他人所指出的,像MD5这样的哈希函数的目标是提供一种方法,可以轻松检查两个对象是否等效,而不知道它们原来是什么(密码)还是完整地比较它们(大文件)

假设您有一个对象O及其散列h O 。您获得另一个对象P,并希望检查它是否等于O。这可以是密码,也可以是您下载的文件(在这种情况下,您不会有O,而是P附带的h O 的哈希值可能)。首先,您将P哈希以获得h P

现在有两种可能性:

  1. h O 和h P 不同。这必须意味着OP不同,因为在2个值/对象上使用相同的哈希必须产生相同的值。哈希是确定性的。 没有误报。
  2. h O 且h P 相等。正如你所说,由于Pigeonhole原则,这个可以意味着不同的对象被散列到相同的值,并且可能需要采取进一步的行动。

    一个。因为可能性的数量如此之高,如果你对你的哈希函数有信心,那么就可以说“好吧,有两个 128 碰撞的机会(理想情况),所以我们可以假设O = P。例如,如果限制字符的长度和复杂性,这可能适用于密码。这就是为什么你看到密码存储在数据库中而不是密码本身的原因。 湾您可能认为仅仅因为哈希值相等并不意味着对象是相等的,并且直接比较OP您可能有误报。

  3. 因此,虽然您可能有误报,但您不会有误报。根据您的应用程序,以及您是否希望对象始终相同或始终不同,散列可能是一个多余的步骤。

答案 3 :(得分:5)

加密单向散列函数,就定义而言,不是Injective。 在散列函数方面,“唯一”是没有意义的。这些函数由其他属性测量,这些属性通过使得难以创建给定散列的预映像来影响它们的强度。例如,我们可能会关心通过更改前映像中的单个位来影响多少图像位。我们可能会关心进行暴力攻击的难度(找到给定散列图像的prie-image)。我们可能会关心找到碰撞的难度:找到两个具有相同散列图像的预映像,以便在birthday attack中使用。

答案 4 :(得分:3)

如果要散列的值比生成的散列长得多,则可能会发生冲突,但对于大多数用途,碰撞次数仍然足够低( 2 128 可能的散列总数,因此两个随机字符串产生相同散列的几率在理论上接近1 <10> 38 )。

MD5主要用于执行完整性检查,因此它对最小的更改非常敏感。输入中的微小修改将导致输出完全不同。这就是为什么很难仅根据哈希值猜测密码的原因。

虽然散列本身不可逆,但仍然可以通过纯粹的暴力找到可能的输入值。这就是为什么你应该总是确保添加一个盐,如果你使用MD5存储密码哈希:如果你在输入字符串中包含一个盐,匹配的输入字符串必须包含完全相同的盐,以便产生相同的输出字符串,因为否则匹配输出的原始输入字符串将在自动salting后无法匹配(即,您不能只是“反转”MD5并使用它来登录,因为反向MD5哈希很可能不会被腌制最初导致创建哈希的字符串。)

因此哈希不是唯一的,但可以使身份验证机制足够独特(这是密码限制的一个有点可信的参数,而不是salting:导致相同哈希的字符串集可能包含许多不遵守密码限制的字符串,因此通过暴力破解哈希更加困难 - 尽管如此,盐仍然是一个好主意。

较大的散列意味着相同输入集的更大可能哈希值,因此重叠的可能性较低,但在处理能力充分提升以使暴力破坏MD5变得微不足道之前,它仍然是大多数用途的不错选择。

答案 5 :(得分:2)

(似乎是Hash Function Sunday。)

加密哈希函数旨在具有非常非常非常低的重复率。由于您说明的明显原因,费率永远不会为零。

Wikipedia page提供了丰富的信息。

答案 6 :(得分:2)

正如Mike(以及其他所有人)所说的那样,它并不完美,但它确实起作用,碰撞性能真的取决于算法(实际上非​​常好)。

真正感兴趣的是自动处理文件或数据以使用不同的数据保持相同的哈希值,请参阅Demo

答案 7 :(得分:1)

正如其他人已经回答的那样,根据定义,散列函数不能保证返回唯一值,因为对于无限数量的输入存在固定数量的散列。他们的关键质量是他们的碰撞不可预测

换句话说,它们不容易逆转 - 因此虽然可能有许多不同的输入会产生相同的散列结果(“碰撞”),但找到它们中的任何两个在计算上是不可行的。