我对数据块进行了排序,每个数据块分别用sha256进行哈希处理。我想将这些散列合并为一个sha256散列。我应该只是将哈希作为数据输入到sha256中,还是从数学/密码的角度来看还有另一种更好的方法?这似乎是一个琐碎的问题,但是在加密方面,直觉常常是错误的。
edit :这样做的目的是形成一种区块链,尽管如今该术语已经非常繁重。这是出于完整性目的,而不是工作证明。想法是在跟随者节点上对块进行哈希处理,将哈希值组合到集群领导者上,使哈希表代表整个链,然后将其添加到要哈希的新块上。
有点奇怪,因为它是一个分布式系统,所以“全链哈希”通常有点陈旧,所以我知道在该节点上创建块时,代表该节点的链代表的哈希是什么,但是在该特定哈希中可能有几个“挂在链上”的块,然后将它们排序并组合到系统哈希中,该哈希最终会添加到新块中。
如果要这么做,我正在使用Go。
答案 0 :(得分:4)
edit:尽管它的目的是形成一种区块链 这些天来,这个词已经超载了。为了诚信 目的,而不是工作证明。这个想法是在 跟随者节点,将哈希值组合到集群领导者上,以 有一个代表整个链的哈希,然后加上 到要散列的新块。
这看起来像merkle tree
https://brilliant.org/wiki/merkle-tree/
Merkle树是基于哈希的数据结构,是一种概括 哈希列表。它是一个树结构,其中每个叶节点都是一个 数据块的哈希,每个非叶子节点为其数据的哈希 孩子们。通常,默克尔树的分支因子为2, 表示每个节点最多可以有2个孩子。
Merkle树用于分布式系统中以获取有效数据 验证。它们之所以有效是因为它们使用哈希代替 完整文件。散列是编码小得多的文件的方法 比实际文件本身。目前,它们的主要用途是 对等网络,例如Tor,比特币和Git。
答案 1 :(得分:3)
尝试使用已经拥有的SHA256哈希并将它们放入字符串中。然后使用SHA256或您选择的算法对该字符串进行哈希处理。或者,您可以将原始数据块串在一起,然后对其进行哈希处理。但是我认为它只是“散列散列”,更快,更清洁。
答案 2 :(得分:3)
如果您尝试重新创建已分割为大块(例如大小为10MB)的大型有效负载(例如1GB文件)的哈希,则需要在磁盘上计算哈希(MD5,SHA-256等)整个收藏。因此,使用此示例,您不能添加 100个分块的哈希值以重新创建原始文件的哈希。但是...
您可以为每个块发送2个值:
在流传输块时,可以验证块N
末尾的哈希状态的接缝与块N+1
开头的哈希状态的接缝相匹配。
最终块的最终哈希状态将是整个有效负载的哈希。
为什么会这样?因为在接收到所有文件块之后,可以在接收文件块时实时计算哈希值,而不是一个单独的耗时过程。
编辑:基于评论:
这是一个原始的哈希状态解决方案:
创建一个较大的随机文件(100MB):
dd if=/dev/urandom of=large.bin bs=1048576 count=100
使用外部工具来验证哈希:
$ shasum -a 256 large.bin
4cc76e41bbd82a05f97fc03c7eb3d1f5d98f4e7e24248d7944f8caaf8dc55c5c large.bin
在上面的文件中运行此playground code。
...
...
...
offset: 102760448 hash: 8ae7928735716a60ae0c4e923b8f0db8f33a5b89f6b697093ea97f003c85bb56 state: 736861032a24f8927fc4aa17527e1919aba8ea40c0407d5452c752a82a99c06149fd8d35000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006200000
offset: 103809024 hash: fbbfd2794cd944b276a04a89b49a5e2c8006ced9ff710cc044bed949fee5899f state: 73686103bdde167db6a5b09ebc69a5abce51176e635add81e190aa64edceb280f82d6c08000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006300000
offset: 104857600 hash: 4cc76e41bbd82a05f97fc03c7eb3d1f5d98f4e7e24248d7944f8caaf8dc55c5c state: 73686103c29dbc4aaaa7aa1ce65b9dfccbf0e3a18a89c95fd50c1e02ac1c73271cfdc3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000
最终的哈希匹配。
尝试使用偏移量和中间哈希状态。该文件将seeked
移至此偏移量,从该点恢复哈希计算:
$ ./hash -o 102760448 -s "736861032a24f8927fc4aa17527e1919aba8ea40c0407d5452c752a82a99c06149fd8d35000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006200000"
offset: 103809024 hash: fbbfd2794cd944b276a04a89b49a5e2c8006ced9ff710cc044bed949fee5899f state: 73686103bdde167db6a5b09ebc69a5abce51176e635add81e190aa64edceb280f82d6c08000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006300000
offset: 104857600 hash: 4cc76e41bbd82a05f97fc03c7eb3d1f5d98f4e7e24248d7944f8caaf8dc55c5c state: 73686103c29dbc4aaaa7aa1ce65b9dfccbf0e3a18a89c95fd50c1e02ac1c73271cfdc3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000
我们得到的最终哈希与以前相同。
注意:这确实暴露了哈希的内部状态,因此请注意可能需要的security implications。对于大块数据,这应该不是问题。