【问题标题】:Is SHA sufficient for checking file duplication? (sha1_file in PHP)SHA 是否足以检查文件重复? (PHP 中的 sha1_file)
【发布时间】:2011-01-18 15:08:28
【问题描述】:

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

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

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

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

编辑 1:散列的重点主要是避免文件重复,而不是造成晦涩。

【问题讨论】:

    标签: php md5 sha1 duplication


    【解决方案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;
    }
    

    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 快一点。

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我假设校验和的额外好处保证了哈希?
      • +1 好点,只是做一个随机值 :) 如果你想要一个校验和,使用 CRC,虽然不清楚为什么需要校验和。
      • 我想避免重复文件。我将有一个 sql 表来将所有者与文件相关联。
      【解决方案3】:

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

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

      您可以随时检查 SHA256 或其他更长的时间。发现 MD5 冲突比使用 SHA1 更容易。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 否 - 尽管 sha1 算法更复杂/具有更高的阶数,但 PHP 中的实际实现创建 sha1 哈希的速度比 md5 略快(至少上次我检查 PHP 5.1 或其他东西时)
        猜你喜欢
        • 2013-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-13
        • 2023-04-10
        • 2015-11-06
        • 1970-01-01
        相关资源
        最近更新 更多