在本节中,我们将讨论哈希指针及其应用。哈希指针是在许多系统中我们都将讨论到的一种数据结构,哈希指针指示某些信息存储在何处,我们将这个指针与这些信息的密码学哈希值存储在一起。哈希指针不仅是一种检索信息的方法,同时它也是一种检查信息是否被修改过的方法。
图1.4哈希指针。哈希指针是一个指向存储地点的指针,加上一个针对存储时信息的哈希值。
我们可以用哈希指针搭建各种数据结构。我们可以简单的例举些使用指针的数据结构,例如我们熟悉的串联列表,或是二歧搜索树。核心思想是,要使用哈希指针而不是我们通常采用的指针。
区块链。在图1.5中,我们用哈希指针构建了一个串联列表,我们将这个数据结构称作区块链。在一个有一连串块的常规串联列表里,每一个块都包含有数据,以及一个指向上一个块的指针。在一个区块链中,前一个块的指针会被哈希指针代替。所以每一个块不仅能告诉我们前一个块的值在哪,同时它也包含该值的摘要,这允许我们去验证这个值是否被篡改过。我们存储列表的开头,这是一个指向最近数据块的常规哈希指针。
图1.5区块链。一个区块链就是一个由哈希指针建立的串联列表。
区块链的一个实用案例是防篡改日志。也就是说,我们想要建一个存储一堆数据的日志数据结构,它允许我们在日志的最后加上新的数据。但是一旦有人想要篡改之前的数据,我们就能检查到。
要理解为何一个区块链能够实现这种防篡改属性,让我们来看看如果一个人试图去篡改链条中间的数据,那会发生什么?具体而言,攻击者的目标是在我们只记得哈希指针开头时,就无法检查到篡改的情况下修改数据。为了实现这一目标,攻击者修改了某个块K。由于数据被修改,作为整个块K的哈希,块K+1的哈希将不再匹配。请记住,我们有统计数据保证,新的哈希是不会匹配修改过的内容的,因为哈希函数是免碰撞的,不可能同时匹配修改前后的内容。因此,我们将会检查到在块K中的新数据和块K+1中的哈希值的不一致。当然,攻击者也可以通过继续修改块K+1的哈希去掩盖K中的篡改。然后攻击者可以继续这样做,直到他到达列表开头,这个策略就会失败,因为只要我们将哈希指针的头储存在攻击者无法修改的地方,攻击者就无法在不被检查到的情况下修改任何块。这样的结果是,如果攻击者想要篡改整条链的任何一个地方的数据,为了保持一致性,他将沿着哈希指针一路修改到区块链的开头。他最终将撞上南墙,因为他无法修改列表的开头。因此仅仅通过记住单独这个哈希指针,我们基本就记住了整列防篡改哈希。所以我们可以建立一个包含尽我们需求块数的区块链,而且回到列表的开头,我们称第一个特殊的块叫做创世块。
你可能已经注意到了,区块链结构其实类似于我们之前提到过的Merkle-Damgard结构。的确,它们是相当类似的,并且相同的安全认证同时适用于它们。
图1.6防篡改日志。如果一个攻击者修改了区块链中任何一个地方的数据,这将导致接下来的哈希指针都出现错误。如果我们储存好了列表的开头,即使攻击者修改了所有指针以求与修改的数据一致,开头的指针也会是错误的,那么我们将会检查到恶意篡改。
本文由维优咨询翻译自普林斯顿比特币公开课,如欲转载本账号文章,请注明作者译者及内容来源于维优咨询