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

wag*_*639 6 php md5 sha1 duplication

假设你想使托管网站供人上传自己的文件,并把链接发给自己的朋友再取回文件,要确保文件被复制我们存储他们,是PHP的sha1_file的任务不够好?有没有理由不使用md5_file?

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

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

最后一点,可伸缩性?最初,它只会用于几个megs的小文件,但最终...

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

Dee*_*lue 6

sha1_file 够好吗?

使用 sha1_file 基本上就足够了,碰撞的可能性很小,但这几乎永远不会发生。为了减少几乎 0 比较文件大小的机会:

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

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

    return false;
}
Run Code Online (Sandbox Code Playgroud)

md5 比 sha1 快,但它产生的唯一输出较少,使用 md5 时发生碰撞的机会仍然很小。

可扩展性?

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

1-直接文件比较:

if( file_get_contents($file1) != file_get_contents($file2) )
Run Code Online (Sandbox Code Playgroud)

2- Sha1_file

if( sha1_file($file1) != sha1_file($file2) )
Run Code Online (Sandbox Code Playgroud)

3- md5_file

if( md5_file($file1) != md5_file($file2) )
Run Code Online (Sandbox Code Playgroud)

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

--------------------------------------------------------
 method                  time(s)           peak memory
--------------------------------------------------------
file_get_contents          0.5              2,721,576
sha1_file                  1.86               142,960
mdf5_file                  1.6                142,848
Run Code Online (Sandbox Code Playgroud)

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

Sha1_file 和 md5_file 是内存高效的,它们使用了 file_get_contents 使用的内存的 5% 左右。

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

所以结论是,这取决于你是想要更快的比较还是更少的内存使用。


yka*_*ich 0

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

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