我正在构建一个用户可以上传内容的网站。一如既往,我的目标是世界优势,所以我想避免两次存储相同的文件。 例如,如果用户尝试两次上传同一个文件(通过重命名或者忘记过去曾做过的事情)。
我目前的做法是让跟踪每个上传文件的数据库存储有关每个文件的以下信息:
然后是这三列的唯一索引。使用两个哈希来最小化误报的风险。
所以,我的问题是:具有相同MD5 和 SHA1哈希的相同大小的两个不同(“真实世界”)文件的概率是多少?
或者:是否存在类似(非)复杂性的更智能方法?
(据我所知,概率可能取决于文件大小)。
谢谢!
答案 0 :(得分:6)
对于所有实际目的,具有相同SHA1散列的两个相同大小的真实文件的概率为零。已经找到SHA1中的一些弱点,但是在计算能力方面,从SHA1散列和大小(1)创建文件是incredibly expensive,(2)生成垃圾或原始文件。
将MD5添加到混音中是一种过度杀伤力。如果您不信任SHA-1,那么更好的选择是切换到SHA-2。
如果您真的很偏执,请尝试比较具有相同(大小,SHA1)签名的文件。但是,如果文件 相等,则必须完全读取这两个文件。
答案 1 :(得分:2)
我认为存储MD5 和 SHA1哈希值会增加不必要的复杂性而不是好的设计。我想说存储(SHA1,文件大小)的元组将是足够好的。特别是如果你正在开始一个新的社区网站,我会安全地使用该解决方案,只有在问题出现后才能创建更聪明的东西。俗话说,过早优化是所有邪恶的根源,如果它是“优化”则是有争议的。
编辑:我没有量化你获得MD5 + SHA1碰撞的几率。我会说它是零。通过粗略的信封计算,两个具有相同(SHA1,MD5)元组的任意文件大小的不同文件的几率为2 ^ -288,就我而言为零。必须要求相同的文件大小才能进一步降低。
答案 2 :(得分:0)
您可以使用Broders实现Rabin指纹识别算法。 它的计算速度比sha1和md5快,并且经证明是抗冲击的。 但是,它不被认为是安全的,以防止恶意攻击,有人可能会故意改变有问题的文件而不改变指纹本身。 如果你只想检查文件的相似性,这是一个很好的解决方案。
C#实现,未经测试: