我想计算文件的 MD5 哈希
文件由我的客户端上传到我的网络服务器 文件分段上传(称为块) 客户端还发送文件的 md5 哈希,以便验证文件完整性
块可以以任何随机顺序出现。(第一个块并不总是首先出现)我的 Web 服务器将这些块存储在持久性存储中。
我是否可以计算各个块的散列(或任何摘要)并得出文件的散列?
我想计算文件的 MD5 哈希
文件由我的客户端上传到我的网络服务器 文件分段上传(称为块) 客户端还发送文件的 md5 哈希,以便验证文件完整性
块可以以任何随机顺序出现。(第一个块并不总是首先出现)我的 Web 服务器将这些块存储在持久性存储中。
我是否可以计算各个块的散列(或任何摘要)并得出文件的散列?
经典的解决方案是使用Merkle-Tree。为了使用 Merkle-Tree 进行上传,客户端形成 Merkle-Tree 并计算哈希值,并预先在带有数字签名的安全通道中向您发送根哈希值。
在 Merkle Tree 中,数据(块)可以随同从数据到根的路径的兄弟散列随机顺序到达服务器。服务器可以使用根哈希以及数据和兄弟哈希来检查数据是否有效。
这将增加带宽,O(log n)
其中n
零件的数量是多少。使用 MD5 它将是128*log n
(log n
用于树的高度)。
例如,对于一个1GB
文件,每个部分都1MB
使用32B
哈希函数,如 SHA256,为此客户端需要存储 64KB 哈希值,并且发送1MB
具有 320KB 哈希数据的块将被传输,传输的开销将是0.031%
验证每个块的成本将是O(log n)
,并且记住密码散列函数非常快。
并且不要使用 MD5 它不再被认为是安全的加密哈希函数,而是至少更喜欢 SHA256 或使用具有速度记录的Blake2 。还有并行哈希,例如SHA3 的ParallelHash和Blake3。每当并行化提供好处时,这可以加快计算速度。
有关 Merkle-Tree 如何工作的完整指南,请参阅 Squeamish Ossifrage在 Cryptography.SE 上的回答