Cryptography 为什么在某些情况下只使用md5哈希的前x个字符,而不使用所有字符?

Cryptography 为什么在某些情况下只使用md5哈希的前x个字符,而不使用所有字符?,cryptography,md5,hash,Cryptography,Md5,Hash,例如,GitHub上的提交列表只显示前10行,或者TornadowWeb中的这一行只使用5行 return static_url_prefix + path + "?v=" + hashes[abs_path][:5] 仅前5个字符就足以确保2个不同文件的2个不同哈希不会冲突吗 LE:上面来自TornadowWeb的示例使用md5哈希为静态文件缓存生成查询sting。一般来说,没有 事实上,即使给出了完整的MD5哈希,也不足以防止恶意用户生成冲突——MD5已被破坏。即使使用更好的散列函数,五个

例如,GitHub上的提交列表只显示前10行,或者TornadowWeb中的这一行只使用5行

return static_url_prefix + path + "?v=" + hashes[abs_path][:5]
仅前5个字符就足以确保2个不同文件的2个不同哈希不会冲突吗

LE:上面来自TornadowWeb的示例使用md5哈希为静态文件缓存生成查询sting。

一般来说,没有

事实上,即使给出了完整的MD5哈希,也不足以防止恶意用户生成冲突——MD5已被破坏。即使使用更好的散列函数,五个字符也不够

但有时你可以侥幸逃脱

我不确定您提供的具体示例的上下文是什么。然而,为了回答您更一般的问题,如果没有坏人积极地试图引起冲突,那么使用部分散列可能是可以的。特别是,给定5个20位的十六进制字符,在对大约2^20/2=2^10~1000个值进行散列之前,不会发生冲突。这是经济衰退的结果

上一段假设哈希函数本质上是随机的。这不是任何试图建立一个加密安全系统的人应该做的假设。但只要没有人故意制造碰撞,这就是合理的启发。

一般来说,没有

事实上,即使给出了完整的MD5哈希,也不足以防止恶意用户生成冲突——MD5已被破坏。即使使用更好的散列函数,五个字符也不够

但有时你可以侥幸逃脱

我不确定您提供的具体示例的上下文是什么。然而,为了回答您更一般的问题,如果没有坏人积极地试图引起冲突,那么使用部分散列可能是可以的。特别是,给定5个20位的十六进制字符,在对大约2^20/2=2^10~1000个值进行散列之前,不会发生冲突。这是经济衰退的结果


上一段假设哈希函数本质上是随机的。这不是任何试图建立一个加密安全系统的人应该做的假设。但只要没有人故意制造碰撞,这就是一个合理的启发。

s/get-a-way/get-away/-完全不同的含义:另外,5个十六进制数字是2.5字节20位。@NickJohnson:谢谢你的更正。好像我也写了它而不是。。。是时候进行seppuku了:Git使用SHA-1而不是MD5,这使得您的第一句话不那么相关SHA-1尚未被打破。s/get a way/get away/-完全不同的含义:另外,5个十六进制数字是2.5字节20位。@NickJohnson:谢谢你的更正。好像我也写了它而不是。。。是时候进行seppuku了:Git使用SHA-1而不是MD5,这使得你的第一句话不那么相关SHA-1还没有被打破。答案很大一部分取决于你的应用程序在出现部分哈希冲突时会做什么。在git的情况下,它将拒绝做任何事情,并列出与该前缀匹配的完整哈希值-这是一种很好的失败模式。实际上,git使用SHA-1,而不是MD5作为提交、树和blob的哈希值。答案的很大一部分取决于在出现部分哈希冲突的情况下应用程序将做什么。在git的情况下,它将拒绝做任何事情,并列出与该前缀匹配的完整哈希值——这是一种很好的失败模式。