哈希指针是一种数据结构,确切地说,是一个指向数据存储位置的指针,同时也是位置数据的哈希值。哈希指针除了包含通常的指针外,还包含一些数据信息以及与这些信息相关的密码哈希值,这就使得正常的指针可用于取回信息,哈希指针用于验证信息是否发生改变。哈希指针不但可以告诉你存储的位置,并且还可以验证数据没有被篡改过。
区块链可以看作一类使用哈希指针的链表(如下图所示)。 这个链表连接一系列的区块,每个区块包含数据和指向表中前一个区块的指针。区块链中,前一个区块指针由哈希指针所替换,因此每个区块不仅仅告知前一个区块的位置,也提供一个哈希值去验证这个区块所包含的数据是否发生改变。
使用区块链技术可以构造一个防篡改的日志系统,在系统中,日志节点链表用来储存数据,链表节点通过哈希指针来连接,新节点则追加在该日志链表的尾部。并且,日志链表的头部和哈希指针指向的头部的节点内容不可改变。如果日志中的某个数据被篡改,那么篡改后的数据与后一个区块的哈希指针不匹配,系统可以检测出。因此,只要我们保存好链表最后的那个哈希指针,就一定能发现是否有人篡改了区块数据。(如下图)
假定攻击者改变了节点k的数据,由于其后继节点k+1存储了节点k的哈希值,密码哈希函数的抗碰撞性,使其通过简单计算节点k数据的哈希值,就能发现计算结果与节点k+1的哈希指针值不一致,因此可断定节点k或节点k+1的信息被篡改。当然也存在一种可能性,攻击者连续改变前一个节点的哈希值来掩盖不同。但这个策略在处理日志链表的头节点时将会失败,尤其是一旦将链表头部的哈希指针存储在不能改变的地方,攻击者将不可能改变任何节点而不被发现。
因此,若攻击者想在日志链表中的任意位置改变数据,为保持一致性,他必须沿链表头部方向修改所有的哈希指针,最终会因无法改变链表头部而失败。因此,只需单个哈希指针,基本上就能保证整个链表的哈希值的一致性,从而达到防篡改的目的。
领取专属 10元无门槛券
私享最新 技术干货