Go 如何组合sha哈希?

Go 如何组合sha哈希?,go,cryptography,Go,Cryptography,我已经对数据块进行了排序,每个数据块分别用sha256散列。我想把这些散列合并成一个sha256散列。我应该将散列作为数据输入sha256,还是从数学/加密的角度来看,有其他更好的方法?这似乎是一个微不足道的问题,但在加密方面直觉往往是错误的 编辑:这个词的目的是形成一种区块链,尽管这个词现在已经超载了。这是为了诚信,而不是工作证明。其思想是对跟随节点上的块进行散列,将散列组合成集群前导节点上的一个散列,以获得一个表示整个链的散列,然后将该散列前置到要散列的新块 这有点奇怪,因为它是一个分布式系

我已经对数据块进行了排序,每个数据块分别用sha256散列。我想把这些散列合并成一个sha256散列。我应该将散列作为数据输入sha256,还是从数学/加密的角度来看,有其他更好的方法?这似乎是一个微不足道的问题,但在加密方面直觉往往是错误的

编辑:这个词的目的是形成一种区块链,尽管这个词现在已经超载了。这是为了诚信,而不是工作证明。其思想是对跟随节点上的块进行散列,将散列组合成集群前导节点上的一个散列,以获得一个表示整个链的散列,然后将该散列前置到要散列的新块

这有点奇怪,因为它是一个分布式系统,所以“整链散列”通常有点过时,所以我知道当在该节点创建块时,该节点知道代表链的散列是什么,但可能有几个块在该特定散列处“钩住链”,然后这些被排序并组合到系统哈希中,系统哈希最终被预先添加到新的块中


如果有必要的话,我正在使用Go。

尝试使用您已有的SHA256哈希值,并将它们放入字符串中。然后使用SHA256或您选择的算法对该字符串进行散列。或者,您可以将原始数据串在一起,然后将其散列。但我认为“散列”更快捷、更干净

如果您试图重新创建已拆分为块(例如10MB大小)的大型有效负载(例如1GB文件)的散列,则需要对整个集合计算散列(MD5、SHA-256等)。因此,使用这个示例,您不能添加100个分块哈希来重新创建原始文件的哈希。然而

每个区块可以发送2个值:

  • 单个块的散列(就像您现在所做的那样)
  • 中间散列状态,当您的服务扫描文件以创建每个区块负载时:在区块的开头和结尾
当区块流入时,可以验证区块
N
末尾的散列状态接缝是否与区块
N+1
开头的散列状态接缝匹配

最终区块的最终哈希状态将是整个有效负载的哈希

为什么会这样?因为在接收到所有文件块之后,可以在接收文件块时实时计算哈希值,而不是作为一个单独的耗时过程


编辑:基于评论:

下面是一个粗略的状态哈希状态解决方案:

创建一个大的随机文件(100MB):

使用外部工具验证哈希:

$ shasum -a 256 large.bin 
4cc76e41bbd82a05f97fc03c7eb3d1f5d98f4e7e24248d7944f8caaf8dc55c5c  large.bin
在上面的文件上运行这个

...
...
...
offset: 102760448   hash: 8ae7928735716a60ae0c4e923b8f0db8f33a5b89f6b697093ea97f003c85bb56  state: 736861032a24f8927fc4aa17527e1919aba8ea40c0407d5452c752a82a99c06149fd8d35000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006200000
offset: 103809024   hash: fbbfd2794cd944b276a04a89b49a5e2c8006ced9ff710cc044bed949fee5899f  state: 73686103bdde167db6a5b09ebc69a5abce51176e635add81e190aa64edceb280f82d6c08000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006300000
offset: 104857600   hash: 4cc76e41bbd82a05f97fc03c7eb3d1f5d98f4e7e24248d7944f8caaf8dc55c5c  state: 73686103c29dbc4aaaa7aa1ce65b9dfccbf0e3a18a89c95fd50c1e02ac1c73271cfdc3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000
最后的散列匹配

正在尝试使用偏移量和中间哈希状态。文件将
查找到此偏移量,从该点开始恢复哈希计算:

$ ./hash -o 102760448 -s "736861032a24f8927fc4aa17527e1919aba8ea40c0407d5452c752a82a99c06149fd8d35000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006200000"
offset:  103809024  hash: fbbfd2794cd944b276a04a89b49a5e2c8006ced9ff710cc044bed949fee5899f  state: 73686103bdde167db6a5b09ebc69a5abce51176e635add81e190aa64edceb280f82d6c08000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006300000
offset:  104857600  hash: 4cc76e41bbd82a05f97fc03c7eb3d1f5d98f4e7e24248d7944f8caaf8dc55c5c  state: 73686103c29dbc4aaaa7aa1ce65b9dfccbf0e3a18a89c95fd50c1e02ac1c73271cfdc3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000
我们得到的最终哈希值与以前相同

注意:这会暴露散列的内部状态,所以请注意这可能会导致。对于较大的块大小,这不应该是一个问题

编辑:其目的是形成一种区块链 这个术语现在已经超负荷了。这是为了正直 目的,而不是工作证明。这个想法是在最后一刻将块散列 follower节点,将散列合并到集群前导节点上的一个散列中,以 有一个表示整个链的散列,然后在其前面加上前缀 到要散列的新块

这看起来像一棵
merkle树

Merkle树是一种基于哈希的数据结构,是一种泛化 散列列表的一部分。它是一种树结构,其中每个叶节点都是一个 数据块的散列,每个非叶节点是其 儿童通常,Merkle树的分支因子为2, 这意味着每个节点最多有2个子节点

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


看看这个实现

问题是:做什么?换句话说,你是仅仅因为想要组合这些哈希值就想要组合哈希值,还是有一个特定的用例需要组合哈希值。您应该做什么取决于您的特定(未知)用例。特别是当您询问如何以正确的加密方式处理它时,有关用例的详细信息非常重要。请记住,许多哈希库不支持捕获或恢复中间状态,因此您可能必须修改现有代码或手动实现哈希算法。(答案很好,读者可能会认为这很简单。)32字节(对于SHA-256来说,这恰好与最终的散列大小相同,但这不是通用的)我将在午餐后更新关于如何恢复散列求和的答案……实际上看起来比这更容易,我又看了一眼,您需要做的是将返回的hash.hash接口强制转换为
encoding.BinaryMarshaler
encoding.BinaryUnmarshaler
,这对于stdlib哈希器是允许的,根据:@Eloff interest!我已经用一个工作示例更新了答案,包括这个发现。
$ ./hash -o 102760448 -s "736861032a24f8927fc4aa17527e1919aba8ea40c0407d5452c752a82a99c06149fd8d35000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006200000"
offset:  103809024  hash: fbbfd2794cd944b276a04a89b49a5e2c8006ced9ff710cc044bed949fee5899f  state: 73686103bdde167db6a5b09ebc69a5abce51176e635add81e190aa64edceb280f82d6c08000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006300000
offset:  104857600  hash: 4cc76e41bbd82a05f97fc03c7eb3d1f5d98f4e7e24248d7944f8caaf8dc55c5c  state: 73686103c29dbc4aaaa7aa1ce65b9dfccbf0e3a18a89c95fd50c1e02ac1c73271cfdc3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000