在讨论最大密码长度时,一位发帖人发表了以下评论:
允许的输入越长,提供可能导致哈希冲突的输入就越容易
为了解释(因为缺乏上下文可能会使声明不清楚),发帖者说,对于较长的密码比较短的密码更容易找到哈希冲突。我以前没听说过,现在我很好奇。我自己(诚然天真)的期望是碰撞概率应该与消息大小完全无关,因为碰撞发生在摘要空间中,并且摘要是固定长度的。
我错过了哪些拼图?发现碰撞的难易程度是否取决于输入长度?
在讨论最大密码长度时,一位发帖人发表了以下评论:
允许的输入越长,提供可能导致哈希冲突的输入就越容易
为了解释(因为缺乏上下文可能会使声明不清楚),发帖者说,对于较长的密码比较短的密码更容易找到哈希冲突。我以前没听说过,现在我很好奇。我自己(诚然天真)的期望是碰撞概率应该与消息大小完全无关,因为碰撞发生在摘要空间中,并且摘要是固定长度的。
我错过了哪些拼图?发现碰撞的难易程度是否取决于输入长度?
我错过了哪些拼图?发现碰撞的难易程度是否取决于输入长度?
对于查找冲突,字符串的长度无关紧要(除了计算哈希所需的时间 - 对于长字符串来说实际上更长),但您尝试了多少不同的字符串。因为您拥有的不同输入越多,其中任何一个导致相同(固定长度)哈希值的机会就越高,即冲突。而且长字符串比短字符串有更多不同。
例如:有 10^3 = 1000 个 3 位数的字符串,但已经有 10^6 = 1000000 个 6 位数的字符串。如果您想象一个由 4 位数字组成的哈希,那么可能会与 3 位字符串发生冲突,但在 6 位字符串中肯定会有很多冲突,因为字符串值比哈希值多得多。
允许的输入越长,提供可能导致哈希冲突的输入就越容易
您引用的陈述在当前形式中是错误的。确实,您找到的字符串很长的可能性更高。但是由于长字符串比短字符串多得多,这并不能使查找碰撞变得更容易。同样,重要的是您拥有的不同输入的数量而不是长度。
我认为评论的发布者指的是以下内容:
随着输入空间(所有可能的输入字符串)大小的增加,当输入空间大小大于所有可能的哈希值大小时,在耗尽空间时发现冲突的概率增加并最终达到 100%。
例子:
假设一个 32 位表现良好的散列函数。如果只允许字符串“0”和“1”作为输入,则哈希冲突的概率很低,因为输入值 (2) 的数量远远小于哈希值的数量 (2^32 = 4,294,967,296) . 碰撞的机会实际上是 1 / 2^32。
但是,如果您允许所有可能的正好是 8 个小写字母字符的字符串,则可以保证最终找到哈希冲突,因为现在有 26^8 = 208,827,064,576 个输入值,比 2^32 大得多。
编辑:我打算将此作为评论发布,但还不能发表评论......