【问题标题】:combining file chunk hash value to file fingerprint将文件块哈希值结合到文件指纹
【发布时间】:2017-12-17 22:40:27
【问题描述】:

我们需要服务器中所有上传文件的文件指纹。现在选择 sha256 作为哈希函数。

对于大文件,每个文件被分成几个大小相等的文件块(最后一个除外)进行传输。每个文件块的 sha256 值由客户端提供。它们由服务器重新计算和检查。

但是,这些 sha256 值不能组合成整个文件的 sha256 值。

所以我考虑改变文件指纹的定义:

对于小于 1GB 的文件,sha256 值就是指纹。

对于大于 1GB 的文件,它被分割成 1GB 的块。每个chunk都有自己的sha256值,记为s0,s1,s2(都是整数值)。

当收到第一个块时:

h0 = s0

收到第二个块时

h1 = SHA256(h0 << 256 + s1)

这实质上是连接两个哈希值并再次对其进行哈希处理。重复此过程,直到收到所有块。而最终值hn作为文件指纹。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我用谷歌搜索了很多。并阅读一些关于各种语言或框架的 combine_hash 函数的文章。不同的作者选择了不同的位重整散列函数,据说大部分都运行良好。

然而,就我而言,效率不是问题。但指纹被存储并用作系统范围内的文件内容标识符。

我主要关心的是上面列出的幼稚方法是否会比 sha256 本身引入更多的冲突?

如果在我们的案例中 sha256 不是组合哈希值的好选择,有什么建议吗?

【问题讨论】:

    标签: hash sha256


    【解决方案1】:

    您实际上是在重新发明Merkle tree

    您需要做的是将您的大文件分成大小相等的块(没有最后一个片段),计算每个块的哈希值,然后将它们成对组合,直到有一个最终的哈希值。请注意,“根”哈希不会等于原始文件的哈希,但这不是验证整个文件完整性所必需的。

    【讨论】:

    • 我了解最终的哈希值不等于整个文件的 sha256 值。但我担心的是它是否会作为文件指纹引入更多冲突?
    • @matianfu 我不是数学家/密码​​学家,但 Git、Mercurial、BitTorrent 和其他应用程序和协议都建立在 Merkle 树上这一事实证明了它们确实可靠地工作。
    • 是的,你提出了强有力的证明。现在我认为该方法对我们的应用程序来说足够安全。谢谢。
    猜你喜欢
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 2020-01-24
    相关资源
    最近更新 更多