自学内容网 自学内容网

哈希树全文及翻译

哈希树

概念

哈希树(hash tree;Merkle tree),由瑞夫·墨克于 1979 年申请专利,故亦称墨克树(Merkle tree)。
在密码学及计算机科学中是一种树形数据结构,每个叶节点均以数据块的哈希作为标签,
而除了叶节点以外的节点则以其子节点标签的加密哈希作为标签 。

哈希树能够高效、安全地验证大型数据结构的内容,是哈希链的推广形式。

定义、性质及实现

哈希树是一种典型的二叉树结构,由根节点、一组中间节点和一组叶节点组成。

其主要特点为:

  • 最下面的叶节点包含存储数据或其哈希值;
  • 非叶子节点(包括中间节点和根节点)都是它的两个孩子节点内容的哈希值。

进一步,默克尔树可以推广到多叉树的情形,此时非叶子节点的内容为它所有的孩子节点的内容的哈希值。

哈希树逐层记录哈希值的特点,让它具有了一些独特的性质。例如,底层数据的任何变动,都会传递到其父节点,一层层沿着路径一直到树根。
这意味树根的值实际上代表了对底层所有数据的“数字摘要”。

其主要特点为:

最下面的叶节点包含存储数据或其哈希值;
非叶子节点(包括中间节点和根节点)都是它的两个孩子节点内容的哈希值。
进一步地,默克尔树可以推广到多叉树的情形,此时非叶子节点的内容为它所有的孩子节点的内容的哈希值。

大多数哈希树实现都是二叉树,也可多叉。

哈希树中哈希值的求取通常使用如 SHA-2 的加密哈希函数,但若只防止非故意的数据损坏,也可用不安全的校验,比如CRC。

常见Merkle Tree

  • Balanced Merkle Tree是所有Block数据只存储在叶子节点,且所有叶子到根距离相等的一种Merkle Tree。
  • IPFS存储(分布式存储)会将文件切割为Block并将这些Block构建为一棵Merkle Tree存储。IPFS实现了两种Merkle Tree:
    • Balanced Merkle Tree
    • Trickle Merkle Tree

应用

哈希树可验证计算机内部和计算机之间存储、处理和传输的任何类型的数据。 可确保从 P2P 网络中的其他节点接收到的数据块未损坏、未更改,可以检查其他节点是否发送假块。

哈希树用于基于哈希的密码学场景。此外还有很多应用场景,如:

  • 文件系统,如星际文件系统 (IPFS)、Btrfs 和 ZFS 文件系统,可对抗数据退化。
  • Dat protocol。
  • Apache Wave protocol。
  • Git 和 Mercurial 分布式版本控制系统。
  • Tahoe-LAFS 备份系统。
  • Zeronet。
  • 比特币和以太坊对等网络。
  • 证书透明度框架。
  • Nix 包管理器以及其后代如 GNU Guix。
  • NoSQL 系统,如 Apache Cassandra、Riak 和 Dynamo。

有人建议在可信计算系统中使用散列树。
最初的比特币 Merkle 树实现过度应用哈希函数的压缩步骤,使用 Fast Merkle Trees 可以缓解这种情况。

证明某个集合中存在或不存在某个元素

通过构建集合的默克尔树,并提供该元素各级兄弟节点中的 Hash 值,可以不暴露集合完整内容而证明某元素存在。

另外,对于可以进行排序的集合,可以将不存在元素的位置用空值代替,以此构建稀疏默克尔树(Sparse Merkle Tree)。
该结构可以证明某个集合中不包括指定元素。

快速比较大量数据

对每组数据排序后构建默克尔树结构。当两个默克尔树根相同时,则意味着所代表的两组数据必然相同。否则,必然不同。

由于 Hash 计算的过程可以十分快速,预处理可以在短时间内完成。利用默克尔树结构能带来巨大的比较性能优势。

快速定位修改

以下图为例,基于数据 D0……D3 构造哈希树,如果 D1 中数据被修改,会影响到 N1,N4 和 Root。

root = hash:n4,n5
n4 = hash:n0,n1
n5 = hash:n2,n3
n0 = hash:d0
n1 = hash:d1
n2 = hash:d2
n3 = hash:d3
d0
d1
d3
d4

一旦发现某个节点如 Root 的数值发生变化,沿着 Root --> N4 --> N1,最多通过 O(lgN) 时间即可快速定位到实际发生改变的数据块
D1。

零知识证明

仍以上图为例,如何向他人证明拥有某个数据 D0 而不暴露其它信息。挑战者提供随机数据 D1,D2 和 D3,或由证明人生成(需要加入特定信息避免被人复用证明过程)。

证明人构造如图所示的默克尔树,公布 N1,N5,Root。验证者自行计算 Root 值,是否跟提供值一致,即可检测 D0 存在。
整个过程中验证者无法获知与 D0 相关的额外信息。

p2p下载

  • 通常先从可信的来源获取顶部哈希,如朋友告知、网站分享等。
  • 得到顶部哈希后,则整棵哈希树就可以通过 P2P 网络中的非受信来源获取。
  • 下载得到哈希树后,即可根据可信的顶部哈希对其进行校验,验证是否完整未破坏。
  • 如果哈希树损坏或伪造,则将尝试来自另一个来源的另一棵哈希树,
  • 直到程序找到与顶部哈希匹配的哈希树。

详见:
分布式和存储的那些事
哈希树简介

声明:本文使用八爪鱼rpa工具从gitee自动搬运本人原创(或摘录,会备注出处)博客,如版式错乱请评论私信,如情况紧急或久未回复请致邮 xkm.0jiejie0@qq.com 并备注原委;引用本人笔记的链接正常情况下均可访问,如打不开请查看该链接末尾的笔记标题(右击链接文本,点击 复制链接地址,在文本编辑工具粘贴查看,也可在搜索框粘贴后直接编辑然后搜索),在本人博客手动搜索该标题即可;如遇任何问题,或有更佳方案,欢迎与我沟通!


原文地址:https://blog.csdn.net/qq_41623592/article/details/143060726

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!