代码之家  ›  专栏  ›  技术社区  ›  Ákos Nikházy

哈希的md5哈希

  •  0
  • Ákos Nikházy  · 技术社区  · 14 年前

    这是一个理论问题,但我对此很好奇。如果我这样做(用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;    
    }
    

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

    我的问题是:有关于这个“问题”的文章吗?可能发生的情况是,我在一个系统中得到了相同的值,例如,当我散列文件以检查它们是否有效时?这会在任何系统中的任何地方造成问题吗?

    2 回复  |  直到 14 年前
        1
  •  3
  •   CodesInChaos    14 年前

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

    当使用安全散列函数时,128个散列的冲突非常难以找到,我的意思是,我不知道它发生在哪里。但是,如果您想避免这种机会,只需使用256位散列即可。那么,用蛮力寻找碰撞就超出了全人类目前的计算能力。特别是没有已知的消息对 SHA-256(m1) == SHA-256(m2) 具有 m1 != m2 。

    你说得对,hashed不可能是唯一的(请参阅 Pidgeonhole principle ),但你真正发现这种情况的几率极低。所以不要麻烦处理那个案子。

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


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

        2
  •  -3
  •   devWaleed    14 年前

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