8

假设您想创建一个文件托管站点供人们上传他们的文件并将链接发送给他们的朋友以便稍后检索它,并且您想确保文件在我们存储它们的位置重复,那么 PHP 的 sha1_file 是否足以胜任这项任务?有什么理由不使用 md5_file 吗?

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

此外,由于彩虹表攻击的安全性对此毫无意义,并且哈希值以后可以用作校验和,因此使用盐是轻率的吗?

最后一件事,可扩展性?最初,它只会用于几兆大的小文件,但最终......

编辑1:哈希的重点主要是避免文件重复,而不是造成晦涩难懂。

4

4 回答 4

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;
}

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

可扩展性?

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

1-直接文件比较:

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

2- Sha1_file

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

3- md5_file

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

结果: 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

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

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

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

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

于 2015-11-08T20:52:13.530 回答
4

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

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

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

于 2010-02-19T13:14:12.040 回答
2

SHA should do just fine in any "normal" environment. Although this is what Ben Lynn - the author of "Git Magic" has to say:

A.1. SHA1 Weaknesses As time passes, cryptographers discover more and more SHA1 weaknesses. Already, finding hash collisions is feasible for well-funded organizations. Within years, perhaps even a typical PC will have enough computing power to silently corrupt a Git repository. Hopefully Git will migrate to a better hash function before further research destroys SHA1.

You can always check SHA256, or others which are even longer. Finding MD5 collision is easier than with SHA1.

于 2010-02-19T04:01:39.377 回答
0

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

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

于 2010-02-19T03:52:01.990 回答