这是一个组合学问题,需要哈希算法的一些理论。
假设输入可以是30 kB到5 MB大小的任意字节随机序列(我想这会产生很多输入值的组合:))
从字节序列计算的MD5哈希的前4个字节(或前n个字节)对不同文件的相同概率是多少?
如果不能专门针对MD5哈希计算,那么生成均匀分布的m字节哈希值的任何哈希函数在给定输入范围的前n个字节上计算哈希与冲突的概率是多少?
答案 0 :(得分:9)
在没有关于字节值概率的更多信息的情况下,我希望它在2 ^ 32中为1。
修改即可。实际上,如果您使用的是十六进制字符而不是纯字节,那么1 ^ 2 ^ 16。
根据评论编辑:
MD5可以被认为是统一的 计算值是 绝对随机?
设计MD5哈希算法,以便输入中的微小变化导致完全不同的哈希值,因此我会说MD5哈希字节以相同的概率分布(我不会在其上打赌任何东西)。无论如何,您可以对哈希应用后处理(例如,您可以使用keyed MD5)来增加其随机性(并使其更安全,顺便说一句,因为plain MD5 hashes have been proved to be insecure)。
答案 1 :(得分:4)
对于理想的散列函数,输出均匀分布,因此两次碰撞的机会是2 ^ 32中的一个。然而,生日悖论告诉我们,如果我们比较所有的哈希值,我们应该期望看到一次碰撞,一旦我们有2 ^ 16个哈希值,平均而言 - 所以不要只依赖于4个字节的基础上“我的价值低于40亿美元。”
MD5不是理想的哈希函数,正如我们所知,但这里的弱点有些偶然:在4个字节上发现碰撞完全属于合理的暴力攻击范围,所以没有必要诉诸加密的弱点。如果您只关心随机选择的数据,那么您将不会看到与随机性有显着的统计偏差。
答案 2 :(得分:3)
如果您对具有相同4字节散列的两个特定输入的几率感兴趣,那么它只是1/2 ^ 32。如果您对具有相同赔率的一组X总输入中的两个输入的几率感兴趣,那么这将保持相当低,直到您开始接近您的集合中的2 ^ 16 = 65536个不同输入,其中它达到接近50%(这种现象被称为生日悖论。)
通常,哈希函数在加密方面有用的标准之一是所有位的一致性。
答案 3 :(得分:3)
由于birthday paradox,n位散列中发生碰撞的几率约为1 ^ 2 ^(n / 2) - 因此在这种情况下大约为1 ^ 2 ^ 16。如果由于某种原因你指的是使用32位的十六进制编码,当然那只是前16个实际位,那么碰撞的几率大概是1 ^ 2 ^ 8。
给定一个特定的固定文件,随机选择的任何其他文件与该文件具有相同散列的几率约为2 ^ n。在密码哈希方面,这些差异首先是碰撞,另一个是原像。
在这个散列大小的情况下,MD5中的弱点非常不相关,因为对MD5的最着名的攻击大约需要2 ^ 32次计算,而在大约2 ^ 16次计算中,即使是理想安全的32位散列也会产生冲突(因为仅通过选择随机输入,你有1到2 ^ 16的碰撞几率,所以在大约2 ^ 16个随机猜测之后你可能会发现一对碰撞的输入)。
答案 4 :(得分:0)
MD5哈希值通常是十六进制,因此每个字节有16个可能的值。因此,对于四个字节,存在16 * 16 * 16 * 16 = 65536种可能的组合,使得哈希冲突的概率为1:65536。
答案 5 :(得分:-1)
md5是十六进制的,因此每个字符可以是16个等位基因中的任何一个。
这样就可以16^n
对于4个字符,这会产生65536种不同的可能组合。