......如果没有,为什么不呢?
所以这是问题背后的问题。
据我所知,MD5和SHA1中意外碰撞的可能性很小(虽然SHA1中的可能性比MD5中的可能性小)。我也明白故意碰撞在理论上是可行的。它几乎可能吗?在这些算法中,我是否可以通过某个过程故意生成具有相同散列的两条消息?我会经历什么过程?
答案 0 :(得分:10)
在数学意义上,给定哈希函数必然存在冲突:可能的输入多于可能的输出,因此必须有两个输入映射到相同的输出。现在证明碰撞的存在,实际上找到一个,是两件不同的事情。如果我在海洋中间放下一颗钻石,我肯定知道现在海洋中有一颗钻石 - 但如果我想恢复它,我会感到很茫然。
对于输出为 n 位的“通用”散列函数,有一些查找碰撞的通用方法,平均成本 2 n / 2 对函数的评估(参见this page)。根据 n ,这可以从简单到完全不可行。 MD5的输出为128位, 2 64 为“非常高”:您可以这样做,但需要几千台机器和数月的计算。
现在MD5中存在已知的弱点,即可以利用一些内部结构来更容易地产生碰撞。到目前为止,对MD5的最佳攻击需要a bit less than 221 function invocations,因此这在基本PC上只需几秒钟(最多)。 @Omri指出他对MD5碰撞的一个很好的例子的回应,其中碰撞消息实际上是具有不同行为的可执行文件。
对于SHA-1,输出的大小为160位。这意味着一般的碰撞攻击花费大约 2 80 ,这是现有技术无法实现的(嗯,Mankind 可以做到这一点,但是当然不谨慎:它应该可以用,比如相当于整个美国陆军的一年预算)。然而,与MD5一样,SHA-1也存在已知的弱点。现在,这些弱点仍然是理论上的,因为它们会导致成本 2 61 的碰撞攻击,这对于任何单个加密研究实验室而言都太昂贵了,因此尚未完全进行(已宣布的攻击成本 2 51 但似乎这是一个哑弹 - 分析存在缺陷)。因此,没有实际的碰撞显示(但研究人员非常确定 2 61 攻击是正确的,如果有人找到了预算,它会起作用。)
对于SHA-256,没有已知的弱点,256位输出大小意味着 2 128 的通用成本,远远超出今天的可撤销成本和明天的技术。