将文件块哈希值与文件指纹

时间:2017-07-13 08:46:59

标签: hash sha256

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

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

但是,这些sha256值不能合并到整个文件的sha256值中。

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

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

对于大于1GB的文件,它被切成1GB的块。每个块都有自己的sha256值,表示为s0,s1,s2(均为整数值)。

收到第一块时:

h0 = s0

收到第二块时

h1 = SHA256(h0 << 256 + s1)

这基本上是连接两个哈希值并再次哈希。重复该过程直到收到所有块。最终值hn用作文件指纹。

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

我搜索了很多。并阅读有关各种语言或框架的combine_hash函数的一些文章。不同的作者选择不同的位修改哈希函数,并且据说其中大多数都运行良好。

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

我主要担心的是,如果上面列出的天真方法会比sha256本身引入更多冲突?

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

1 个答案:

答案 0 :(得分:1)

你实质上正在重塑Merkle tree

您需要做的是将大文件拆分为大小相等的块(没有最后一个片段),为每个块计算散列,然后成对组合它们,直到有一个最终散列值。请注意&#34; root&#34; hash 不会等于原始文件的哈希值,但不需要验证整个文件的完整性。