SHA是否足以检查文件重复? (PHP中的sha1_file)

时间:2010-02-19 03:34:57

标签: php md5 sha1 duplication

假设您想创建一个文件托管站点供人们上传文件并发送链接给他们的朋友以便以后检索它,并且您希望确保文件在我们存储它们的地方重复,PHP的sha1_file是否足以完成任务?有没有理由不使用md5_file?

对于前端,它将使用数据库中的原始文件名存储进行模糊处理,但如果这会显示有关原始海报的任何内容,则会有一些其他问题。文件是否继承了上次修改过的任何元信息,或者是谁发布了这些信息,还是基于文件系统的这些东西?

另外,使用salt轻浮,因为关于彩虹表攻击的安全性对此没有任何意义,哈希以后可以用作校验和?

最后一点,可扩展性?最初,它只会被用于小文件,而不是最终...

编辑1:哈希的主要目的是避免文件重复,而不是创建模糊。

4 个答案:

答案 0 :(得分:4)

sha1_file足够好吗?

使用sha1_file已经足够了,碰撞的可能性非常小,但这几乎不会发生。为了减少几乎0比较文件大小的几率:

!varname!

md5比sha1快,但它产生的独特输出较少,使用md5时发生碰撞的可能性仍然很小。

<强>可伸缩性吗

有几种比较文件的方法,使用哪种方法取决于你的性能问题,我对不同的方法进行了小测试:

1-直接文件比较:

function is_duplicate_file( $file1, $file2)
{   
    if(filesize($file1) !== filesize($file2)) return false;

    if( sha1_file($file1) == sha1_file($file2) ) return true;

    return false;
}

2- Sha1_file

if( file_get_contents($file1) != file_get_contents($file2) )

3- md5_file

if( sha1_file($file1) != sha1_file($file2) )

结果: 2个文件每个1.2MB进行100次比较,得到以下结果:

if( md5_file($file1) != md5_file($file2) )

file_get_contents比sha1快3.7,但它不是内存效率。

Sha1_file和md5_file是内存有效的,它们使用了file_get_contents使用的内存的大约5%。

md5_file可能是更好的选择,因为它比sha1快一点。

所以结论是,如果你想要更快的比较或更少的内存使用,它取决于它。

答案 1 :(得分:3)

根据我对@ ykaganovich的回答的评论,SHA1(令人惊讶地)比MD5略快。

根据您对问题的描述,您不是要尝试创建安全哈希 - 只是将文件隐藏在大型命名空间中 - 在这种情况下,使用salt / rainbow表是无关紧要的 - 唯一的考虑因素是错误冲突(其中2个不同的文件给出相同的哈希值)。使用md5发生这种情况的可能性非常非常小。 sha1更加偏远。但是,您需要考虑当2个独立用户将相同的warez上传到您的站点时会发生什么。谁拥有该文件?

事实上,似乎没有任何理由使用哈希 - 只需生成足够长的随机值。

答案 2 :(得分:2)

SHA应该在任何“正常”环境中都可以。虽然这就是“Git Magic”的作者Ben Lynn所说的:

  

A.1。 SHA1弱点         随着时间的推移,密码学家发现了越来越多的SHA1   弱点。已经找到了哈希         对资金充足的组织来说,碰撞是可行的。内   多年,甚至可能是典型的PC   有         足够的计算能力,可以无声地破坏Git存储库。         希望Git会在进一步迁移之前迁移到更好的哈希函数   研究破坏了SHA1。

您可以随时查看SHA256或其他更长的内容。查找MD5碰撞比使用SHA1更容易。

答案 3 :(得分:0)

两者都应该没问题。 sha1是比md5更安全的哈希函数,这也意味着它更慢,这可能意味着你应该使用md5 :)。如果文件非常小,您仍然希望使用salt来防止明文/彩虹攻击(不要假设人们决定上传到您的网站)。性能差异可以忽略不计。只要你知道盐,你仍然可以将它用作校验和。

关于可伸缩性,我猜你可能会受IO限制,而不受CPU限制,所以我不认为计算校验和会给你带来很大的开销,尤其是。如果您在上传时在流上执行此操作。