如何结合sha哈希?

时间:2019-10-21 15:15:52

标签: go cryptography

我对数据块进行了排序,每个数据块分别用sha256进行哈希处理。我想将这些散列合并为一个sha256散列。我应该只是将哈希作为数据输入到sha256中,还是从数学/密码的角度来看还有另一种更好的方法?这似乎是一个琐碎的问题,但是在加密方面,直觉常常是错误的。

edit :这样做的目的是形成一种区块链,尽管如今该术语已经非常繁重。这是出于完整性目的,而不是工作证明。想法是在跟随者节点上对块进行哈希处理,将哈希值组合到集群领导者上,使哈希表代表整个链,然后将其添加到要哈希的新块上。

有点奇怪,因为它是一个分布式系统,所以“全链哈希”通常有点陈旧,所以我知道在该节点上创建块时,代表该节点的链代表的哈希是什么,但是在该特定哈希中可能有几个“挂在链上”的块,然后将它们排序并组合到系统哈希中,该哈希最终会添加到新块中。

如果要这么做,我正在使用Go。

3 个答案:

答案 0 :(得分:4)

  

edit:尽管它的目的是形成一种区块链   这些天来,这个词已经超载了。为了诚信   目的,而不是工作证明。这个想法是在   跟随者节点,将哈希值组合到集群领导者上,以   有一个代表整个链的哈希,然后加上   到要散列的新块。

这看起来像merkle tree

https://brilliant.org/wiki/merkle-tree/

  

Merkle树是基于哈希的数据结构,是一种概括   哈希列表。它是一个树结构,其中每个叶节点都是一个   数据块的哈希,每个非叶子节点为其数据的哈希   孩子们。通常,默克尔树的分支因子为2,   表示每个节点最多可以有2个孩子。

     

Merkle树用于分布式系统中以获取有效数据   验证。它们之所以有效是因为它们使用哈希代替   完整文件。散列是编码小得多的文件的方法   比实际文件本身。目前,它们的主要用途是   对等网络,例如Tor,比特币和Git。

看看该实现https://github.com/cbergoon/merkletree

答案 1 :(得分:3)

尝试使用已经拥有的SHA256哈希并将它们放入字符串中。然后使用SHA256或您选择的算法对该字符串进行哈希处理。或者,您可以将原始数据块串在一起,然后对其进行哈希处理。但是我认为它只是“散列散列”,更快,更清洁。

答案 2 :(得分:3)

如果您尝试重新创建已分割为大块(例如大小为10MB)的大型有效负载(例如1GB文件)的哈希,则需要在磁盘上计算哈希(MD5,SHA-256等)整个收藏。因此,使用此示例,您不能添加 100个分块的哈希值以重新创建原始文件的哈希。但是...

您可以为每个块发送2个值:

  • 单个块的哈希(就像您现在正在做的那样)
  • 中间哈希值 state ,当您的服务扫描文件以创建每个块有效载荷时:在块的开头和结尾

在流传输块时,可以验证块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。对于大块数据,这应该不是问题。