我有一个客户端在内部分发大型二进制文件。他们还传递文件的md5校验和,并在使用之前显然根据校验和验证文件,作为其工作流程的一部分。
然而,他们声称“经常”他们在md5仍然说文件很好的文件中遇到了损坏。
我读过的所有内容都表明这应该是非常不可能的。
这听起来有可能吗?另一种哈希算法会提供更好的结果吗?我是否应该真正关注流程问题,例如他们声称要检查校验和,但实际上并没有这样做?
注意,我还不知道在这种情况下“经常”意味着什么。他们每天处理数百个文件。我不知道这是每天,每月还是每年发生。
答案 0 :(得分:10)
MD5是128位加密散列函数,因此不同的消息应该在128位空间上很好地分发。这意味着两个文件(不包括专门用于击败MD5的文件)应该有1到2 ^ 128的碰撞几率。换句话说,如果每纳秒比较一对文件,那么它就不会发生。
答案 1 :(得分:5)
如果文件已损坏,则损坏的文件与未损坏的文件具有相同的md5校验和的概率为1:2 ^ 128。换句话说,它几乎就像“经常”一样永远发生。天文数据更可能是您的客户误报了实际发生的事情(比如他们正在计算错误的哈希值)
答案 2 :(得分:5)
听起来像是他们使用MD5的一个错误(可能是MD5错误的文件),或者是他们正在使用的库中的错误。例如,我曾经使用的旧MD5程序没有处理超过2GB的文件。
This question表明,如果每秒产生60亿个文件,平均每100年就会发生一次冲突,所以这是不太可能的。
答案 3 :(得分:4)
这听起来有可能吗?
不,随机损坏导致相同校验和的可能性 1 in 2 128 或 3.40× 10 38 即可。这个数字使 1十亿(10 9 )的机会 羞耻。
另一种哈希算法会提供更好的结果吗?
可能不是。虽然MD5已经因为抵御攻击而受到打击,但它可以防止随机损坏和使用的流行标准。
我是否应该真正关注流程问题,例如他们声称要检查校验和,但实际上并没有这样做?
可能,但考虑所有可能的问题点:
如果它是最后一个,那么最后一个想法是以包装器格式分发文件,迫使操作员解包文件,但解包在提取过程中进行验证。我想像Gzip或7-Zip这样的东西支持大文件并可能关闭压缩(我不知道那些)。
答案 4 :(得分:0)
存在二进制文件无法分发的各种原因,或者如果它们存在,则存在损坏(防火墙,大小限制,病毒插入等)。在发送二进制文件以帮助保护数据完整性时,您应始终对文件进行加密(即使是低级加密也优于无)。
答案 5 :(得分:0)
无法抵御封底计算:
可能有2 ^ 128个MD5哈希值或c。 3.4 x 10 ^ 38(即3,400亿,十亿,十亿,十亿,十亿,十亿,十亿,十亿,十亿,十亿,十对一的赔率)。让我们将此数字称为“ M”
如果第1到第(K-1)个不匹配,则第K个哈希匹配的概率为(1-(K-1)/ M),因为我们已经有M个K-1个唯一的哈希。< / p>
并且P(N个文件哈希中没有重复项)=乘积[k = 1 ... N](1-(k-1)/ M)。当N ^ 2 <<< M时,则近似为1-1/2 N ^ 2 / M,当1/2 N ^ 2为近似值时,P(一个或多个重复项)= 1/2 N ^ 2 / M。必须进行的散列配对配对的数量
因此,可以说我们为每个人拍照(78亿,或2 ^ 33以下的一点),然后有304.0十亿的成对比较(略低于2 ^ 65)。
>这意味着匹配MD5哈希(假设分布完全均匀)的机会仍然是2 ^ 65/2 ^ 128 = 2 ^ -63或10,000,000,000,000,000,000中的1。
MD5是用于非敌对环境的相当不错的哈希函数,这意味着您的客户错配的机会比说他们的首席执行官发疯并烧毁数据中心的机会要少得多,更不用说这些了他们实际上担心。