0
点赞
收藏
分享

微信扫一扫

幸运哈希DAPP游戏开发丨幸运哈希数字盲盒游戏系统开发(案例版)丨幸运哈希游戏源码设计

  

  Hash,一般翻译做散列,也有直接音译为哈希,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。

  这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。

  1)什么是哈希运算

  哈希算法(Hash Algorithm)即散列算法的直接音译。

  它的基本功能概括来说,就是把任意长度的输入(例如文本等信息)通过一定的计算,生成一个固定长度的字符串,输出的字符串称为该输入的哈希值。

  2)哈希运算的特性

  一个优秀的哈希算法要具备正向快速、输入敏感、逆向困难、强抗碰撞等特征。

  •正向快速:

  正向即由输入计算输出的过程,对给定数据,可以在极短时间内快速得到哈希值。如当前常用的SHA256算法在普通计算机上一秒钟能做2000万次哈希运算。

  •输入敏感:

  输入信息发生任何微小变化,哪怕仅仅是一个字符的更改,重新生成的哈希值与原哈希值也会有天壤之别。

  同时完全无法通过对比新旧哈希值的差异推测数据内容发生了什么变化。

  因此,通过哈希值可以很容易地验证两个文件内容是否相同。

  该特性广泛应用于错误校验。

  在网络传输中,发送方在发送数据的同时,发送该内容的哈希值。

  接收方收到数据后,只需要将数据再次进行哈希运算,对比输出与接收的哈希值,就可以判断数据是否损坏。

  •逆向困难:

  要求无法在较短时间内根据哈希值计算出原始输入信息。

  该特性是哈希算法安全性的基础,也因此是现代密码学的重要组成。

  哈希算法在密码学中的应用很多,此处仅以哈希密码举例进行说明。

  当前生活离不开各种账户和密码,但并不是每个人都有为每个账户单独设置密码的好习惯,为了记忆方便,很多人的多个账户均采用同一套密码。

  如果这些密码原封不动地保存在数据库中,一旦数据泄露,则该用户所有其他账户的密码都可能暴露,造成极大风险。

  所以在后台数据库仅会保存密码的哈希值,每次登录时,计算用户输入的密码的哈希值,并将计算得到的哈希值与数据库中保存的哈希值进行比对。

  由于相同输入在哈希算法固定时,一定会得到相同的哈希值,因此只要用户输入密码的哈希值能通过校验,用户密码即得到了校验。

  在这种方案下,即使数据泄露,黑客也无法根据密码的哈希值得到密码原文,从而保证了密码的安全性。

  •强抗碰撞性:

  即不同的输入很难可以产生相同的哈希输出。

  当然,由于哈希算法输出位数是有限的,即哈希输出数量是有限的,而输入却是无限的,所以不存在永远不发生碰撞的哈希算法。

  但是哈希算法仍然被广泛使用,只要算法保证发生碰撞的概率够小,通过暴力枚举获取哈希值对应输入的概率就更小,代价也相应更大。

  只要能保证破解的代价足够大,那么破解就没有意义。

  就像我们购买双色球时,虽然我们可以通过购买所有组合保证一定中奖,但是付出的代价远大于收益。

  优秀的哈希算法即需要保证找到碰撞输入的代价远大于收益。

  3)通过哈希构建区块链的链式结构,实现防篡改

  每个区块头包含了上一个区块数据的哈希值,这些哈希层层嵌套,最终将所有区块串联起来,形成区块链。

  区块链里包含了自该链诞生以来发生的所有交易,因此,要篡改一笔交易,意味着它之后的所有区块的父区块哈希全部要篡改一遍,这需要进行大量的运算。

  如果想要篡改数据,必须靠伪造交易链实现,即保证在正确的区块产生之前能快速地运算出伪造的区块。

  同时在以比特币为代表的区块链系统要求连续产生一定数量的区块之后,交易才会得到确认,即需要保证连续伪造多个区块。

  只要网络中节点足够多,连续伪造的区块运算速度都超过其他节点几乎是不可能实现的。

  另一种可行的篡改区块链的方式是,某一利益方拥有全网超过50%的算力,利用区块链中少数服从多数的特点,篡改历史交易。

  然而在区块链网络中,只要有足够多的节点参与,控制网络中50%的算力也是不可能做到的。

  即使某一利益方拥有了全网超过50%的算力,那已经是既得利益者,肯定会更坚定地维护区块链网络的稳定性。

  4)通过哈希构建默克尔树,实现内容改变的快速检测

  除上述防篡改特性,基于哈希算法组装出的默克尔树也在区块链中发挥了重要作用。

  默克尔树本质上是一种哈希树,1979年瑞夫·默克尔申请了该专利,故此得名。

  前面已经介绍了哈希算法,在区块链中默克尔树就是当前区块所有交易信息的一个哈希值。

  但是这个哈希值并不是直接将所有交易内容计算得到的哈希,而是一个哈希二叉树。

  首先对每笔交易计算哈希值;然后进行两两分组,对这两个哈希值再计算得到一个新的哈希值,两个旧的哈希值就作为新哈希值的叶子节点,如果哈希值数量为单数,则对最后一哈希值再次计算哈希值即可;

  然后重复上述计算,直至最后只剩一个哈希值,作为默克尔树的根,最终形成一个二叉树的结构。

  在区块链中,我们只需要保留对自己有用的交易信息,删除或者在其他设备备份其余交易信息。

  如果需要验证交易内容,只需验证默克尔树即可。

  若根哈希验证不通过,则验证两个叶子节点,再验证其中哈希验证不通过的节点的叶子节点,最终可以准确识别被篡改的交易。

 

举报

相关推荐

0 条评论