【问题标题】:md5 hash of hash哈希的 md5 哈希
【发布时间】:2012-08-17 13:48:04
【问题描述】:

这是理论上的问题,但我很好奇。如果我这样做(PHP 中的代码,但在这种情况下语言并不重要)怎么办:

$value  = ''; //starting value
$repeat = false;

while(true)
{

     $value = md5($value);

     /*Save values in database, one row per value*/

     /*Check for repeated hash value in db, and set $repeat flag true if there is one*/

     if($repeat)break;    
}

如您所见,我怀疑会有重复的哈希值。我认为不可能每个现有文本都有自己的值,因为这应该意味着每个哈希值都有自己的值,这是没有意义的。

我的问题是:有没有关于这个“问题”的文章?例如,当我对文件进行哈希处理以检查它们是否有效时,我可能会在一个系统中获得相同的值?这会在任何系统的任何地方引起问题吗?

【问题讨论】:

  • md5 由于碰撞和速度而完全损坏。至少如果您将它用于密码散列或者您试图“保护”其他东西。
  • 有点不清楚您要做什么。你为什么要在这样的链中散列?一方面你使用这个链,另一方面你谈论文件散列。这些是完全不同的场景。
  • @CodesInChaos 代码只是为了说明,关键是有碰撞的机会。文件散列也只是一个例子。我接受了一个真正回答了我想要的答案,而且上面的维基百科文章也很有帮助。

标签: php security hash md5 md5-file


【解决方案1】:

如果您关心多个文本散列到相同的值,请不要使用 MD5。 MD5 有快速的碰撞攻击,这违反了你想要的属性。请改用 SHA-2。

使用安全散列函数时,128 个散列的冲突极难找到,我的意思是我不知道它发生的情况。但是,如果您想避免这种机会,只需使用 256 位哈希。然后使用蛮力找到碰撞现在超出了全人类的计算能力。特别是没有已知的消息对,SHA-256(m1) == SHA-256(m2)m1 != m2

您说得对,哈希值不能是唯一的(请参阅Pidgeonhole principle),但是您实际找到这种情况的机会非常低。所以不要费心处理那个案子。

我通常以 128 位安全级别为目标,因此当我需要无冲突哈希函数时,我会使用 256 位哈希函数,例如 SHA-256。


使用您的哈希链,您不会发现冲突,除非您愿意等待 长时间 时间。一旦你有大约 2^(n/2) 次,就可能发生冲突,对于 128 位散列(例如 md5),这是 2^64。我知道没有针对 128 位哈希的暴力冲突。我所知道的唯一冲突是精心设计的消息,这些消息利用了您使用的散列方案中的弱点(那些针对 md5 存在的)。

【讨论】:

  • 谢谢。我接受这一点,因为它向我指出了皮江洞原理。和真正翔实的答案。当然我知道我不能通过这个小代码找到碰撞,我只是为了说明而写的。 (说实话,几年前我开始学习编程时,我想了很多,但现在它又出现了,想把这些东西从我的脑海中清除掉……我也学到了一些新东西:))跨度>
  • 应该是“改用 scrypt/pkdf2”。
  • @BillyONEal 为什么?我没有看到任何迹象表明 OP 需要加强键。
  • @CodesInChaos:只要有人关心哈希的“速度”有多快,他们通常会处理密码存储。 (鉴于 OP 代码中的 cmets,这似乎就是他正在做的事情)不应使用消息摘要算法来存储密码。
【解决方案2】:

通过相同的方法或不同的方法对其进行多次哈希,然后几乎不可能重复它自己,还要检查它们是否重复然后重复哈希函数直到值不同,然后保存在数据库中或在任何地方使用它你喜欢...

【讨论】:

  • 完全错误。如果散列中的压缩函数易受攻击(这使得散列在 MD5 和类似的散列(如 SHA-1 和 SHA-2)中易受攻击),那么多次运行相同的散列不会提供额外的保护。此外,如果第一个哈希值相同,则再次对其进行哈希处理将产生第二个哈希值,该哈希值实际上是相同的。
  • 不,不是,例如:散列这个“名字”,你会得到“b068931cc450442b63f5b3d276ea4297”,现在散列这个结果“b068931cc450442b63f5b3d276ea4297”,你会得到“eb8342ec6933b49dc8e9fe786”与您看到的不一样,这适用于 MD5 和 SHA-1 以及所有其他。
  • 如果我能找到与第一个哈希“b068931cc450442b63f5b3d276ea4297”的冲突,它可能是也可能不是“名称”,那么再次对其进行哈希不会改变任何事情。第一个哈希已经产生了相同的输出。 MD5 的第二次传递将为导致第一次冲突的两个输入生成“eb8342ec6933b9dc8e9fe7e86d476f21”。
  • 使用多种方法不清楚您的意思。你是连接它们的输出,还是链接它们?
  • 如果值重复,只需对哈希的答案进行哈希处理,如果没有,则用 1 个哈希处理。这就是我的意思
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 2012-05-28
  • 1970-01-01
  • 2019-10-10
  • 2014-05-19
  • 2019-12-20
相关资源
最近更新 更多