哈希函数如何像MD5一样独特?
我知道MD5有一些碰撞,但这更多的是关于散列函数的高级问题。
如果MD5将任意string散列成一个32位的hex值,那么根据Pigeonhole原则,这肯定不是唯一的,因为唯一的任意string比唯一的32位hex值多。
你是正确的,它不能保证唯一性,但是在32位hex值(16 ^ 32)中大约有3.402823669209387e + 38个不同的值。 这意味着,假设algorithm背后的algorithm给出了一个很好的分布,那么你的可能性就显得很小,将会有重复。 你必须记住,当你正在考虑如何使用它的时候可能会重复。 通常使用MD5来确定是否有东西被改变(即它是校验和)。 如果修改某些内容并导致相同的MD5校验和是不可能的。
编辑:(给最近的新闻:SHA1哈希)上面的答案仍然成立,但你不应该期望一个MD5哈希作为任何forms的安全检查对操纵。 SHA-1哈希值相差2 ^ 32(超过40亿)次,发生碰撞的可能性较小,已经certificate有可能devise一个input来产生相同的值。 (相当一段时间,这是针对MD5的certificate)。 如果您希望确保没有人恶意修改某些内容以产生相同的哈希值,那么现在您需要在SHA-2上有一个坚实的保证。
另一方面,如果不在安全检查环境中,MD5仍然有用。
有人可能会说,SHA-2散列的价格足够便宜,无论如何你都应该使用它。
你是完全正确的。 但是哈希不是“独特的”,而是“足够独特”的。
正如其他人所指出的那样,像MD5这样的散列函数的目标是提供一种轻松检查两个对象是否相同的方法,而不知道它们原来是什么(密码)或者将它们全部(大文件)进行比较。
假设你有一个对象O
和它的散列h O。 你获得另一个对象P
并希望检查它是否等于O
这可能是一个密码,或者是你下载的一个文件(在这种情况下,你将不会有O
,而是最有可能的P
的散列)。 首先,你散列P
来获得h P。
现在有两种可能性:
- h O和h P是不同的。 这意味着
O
和P
是不同的,因为在2个值/对象上使用相同的散列必须产生相同的值。 哈希是确定性的。 没有错误的否定。 -
h O和h P相等。 正如你所说,由于鸽子原理,这可能意味着不同的对象散列到相同的价值,并可能需要采取进一步的行动。
一个。 因为可能性的数量是如此之高,所以如果你对哈希函数有信心,那么可以说“好吧,碰撞的概率是1/2(理想情况),所以我们可以假设
O
=P
如果你限制字符的长度和复杂度,那么你可以使用密码工作,这就是为什么你会看到密码存储在数据库中而不是密码本身b。你可能认为只是因为哈希值相等并不意味着对象是平等的,做O
和P
的直接比较, 你可能有误报。
所以虽然你可能有错误的肯定匹配,你不会有错误的否定。 根据您的应用程序,以及您是否期望对象始终相同或始终不同,哈希可能是一个多余的步骤。
根据定义的本质,密码单向散列函数不是内射的 。 就散列函数而言,“unique”是相当无意义的。 这些函数是通过其他属性来度量的,这些属性通过使得难以创build给定散列的前映像来影响其强度。 例如,我们可能会关心通过改变预映像中的一个位来影响多less图像位。 我们可能会关心进行暴力攻击有多困难(为给定的哈希图像find一个prie-image)。 我们可能在意如何find一个碰撞:find两个具有相同哈希图像的前置图像,以用于生日攻击 。
尽pipe如果要散列的值比生成的散列长得多,碰撞的可能性仍然很大,但对于大多数目的来说,碰撞的数量仍然足够低(总共有2 128个可能的散列,所以两个随机串产生理论上相同的哈希值接近1的10 38 )。
MD5主要是为了完成完整性检查而创build的,所以它对最小的变化非常敏感。 input中的小修改将导致完全不同的输出。 这就是为什么单独根据散列值难以猜测密码的原因。
虽然哈希本身是不可逆的,但仍然有可能通过纯粹的powershellfind一个可能的input值。 这就是为什么如果你使用MD5来存储密码哈希,你应该总是确保添加一个salt:如果你在inputstring中包含salt,匹配的inputstring必须包含完全相同的盐,以便得到相同的结果输出string,因为否则匹配输出的原始inputstring将无法匹配后,自动salting(即你不能只是“颠倒”的MD5,并使用它login,因为反转的MD5哈希很可能不会被盐渍最初导致哈希创build的string)。
所以哈希不是唯一的,但是可以使validation机制具有足够的独特性(这是用密码限制代替腌制的一个有点合理的参数:导致相同哈希的string集合可能包含许多string不遵守密码限制,所以通过暴力破解哈希更加困难 – 不过,显然盐仍然是一个好主意)。
更大的散列意味着相同input集可能有更大的散列集合,所以重叠的机会更小,但是直到处理能力进步到足以使暴力破解MD5琐碎的程度,对于大多数目的而言,它仍然是一个不错的select。
(星期天好像是哈希函数。)
encryption哈希函数的devise具有非常非常低的重复率。 由于你明显的原因,这个比率不能为零。
维基百科页面是信息。
正如迈克(基本上每一个人)所说的那样,它并不完美,但它确实是工作的,碰撞performance实际上取决于algorithm(实际上是相当不错的)。
真正感兴趣的是自动处理文件或数据以保持与不同数据相同的散列,请参阅此演示
正如其他人所回答的那样,散列函数根据定义不能保证返回唯一值,因为对于无限数量的input有一个固定数量的散列。 他们的关键质量是他们的碰撞是不可预测的 。
换句话说,它们不容易逆转 – 所以虽然可能有许多不同的input会产生相同的哈希结果(“碰撞”),但是发现其中任何两个在计算上是不可行的。