wag*_*639 6 php md5 sha1 duplication
假设你想使托管网站供人上传自己的文件,并把链接发给自己的朋友再取回文件,要确保文件被复制我们存储他们,是PHP的sha1_file的任务不够好?有没有理由不使用md5_file?
对于前端,它将使用数据库中的原始文件名存储来模糊,但是如果这将揭示有关原始海报的任何内容,则会有一些额外的问题.文件是否继承了上次修改过的任何元信息,或者是谁发布过的,或者是基于文件系统的东西?
另外,使用盐轻浮,因为彩虹表攻击的安全性对此没有任何意义,哈希以后可以用作校验和?
最后一点,可伸缩性?最初,它只会用于几个megs的小文件,但最终...
编辑1:哈希的主要目的是避免文件重复,而不是创建模糊.
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 快一点。
所以结论是,这取决于你是想要更快的比较还是更少的内存使用。
两者都应该没问题。sha1 是比 md5 更安全的哈希函数,这也意味着它更慢,这可能意味着您应该使用 md5 :)。如果文件非常小,您仍然希望使用 salt 来防止明文/彩虹攻击(不要假设人们决定上传到您的网站的内容)。性能差异可以忽略不计。只要您知道盐,您仍然可以将其用作校验和。
关于可扩展性,我猜你可能会受到 IO 限制,而不是 CPU 限制,所以我不认为计算校验和会给你带来很大的开销,尤其是。如果您在上传时在流上执行此操作。