揭秘区块链的核心技术之「哈希与加密算法 」
大家都知道,区块链的关键技术组成主要为:P2P网络协议、共识机制、密码学技术、账户与存储模型。而这些技术中,又以 密码学与共识机制 这两点为最核心。那么今天我们来详细的聊一聊密码学,看一看密码学技术是如何在区块链中应用的。
首先,我们需知道区块链中用到的密码学算法有哪些?其实就两大类:
哈希算法
非对称加密算法
一、区块链中的哈希算法
哈希算法是区块链中用的最多的一种算法,它被广泛的使用在构建区块和确认交易的完整性上。
它是一类数学函数算法,又被称为散列算法,需具备三个基本特性:
1、其输入可为任意大小的字符串
2、它产生固定大小的输出
3、它能进行有效计算,也就是能在合理的时间内就能算出输出值
如果要求哈希算法达到密码学安全的话,我们还要求它具备以下三个附加特性:
1、碰撞阻力:
是指对于两个不同的输入,必须产生两个不同的输出。如果对于两个不同的输入产生了相同的输出,那么就说明不具备碰撞阻力,或是弱碰撞阻力。
2、隐秘性:
也被称为不可逆性,是指 y = HASH(x)中,通过输入值x,可以计算出输出值y,但是无法通过y值去反推计算出x值。为了保证不可逆,就得让x的取值来自一个非常广泛的集合,使之很难通过计算反推出x值。
3、谜题友好:
这个特性可以理解为,谜题是公平友好的,例如算法中 y = HASH(x),如果已知y值,想去得到x值,那就必须暴力枚举,不断的尝试才能做到,并且没有比这更好的办法,没有捷径。
哈希算法有很多,比特币主要使用的哈希算法是 SHA-256 算法。
除此之外,还有其他一些哈希算法也很流行,例如 MD5、SHA-1、SHA-2(SHA-224、SHA-256、SHA-384、SHA-512)、SHA-3 等,其中 MD5、SHA-1 已被证明了不具备 强碰撞阻力,安全性不够高,因此市场上不再推荐使用。
我们以比特币为例,来看一下哈希算法的具体应用:
在比特币中,使用哈希算法把交易生成数据摘要,当前区块里面包含上一个区块的哈希值,后面一个区块又包含当前区块的哈希值,就这样一个接一个的连接起来,形成一个哈希指针链表,如下图:
上面只是示意图,那么在实际比特币系统中,每个区块包含哪些内容呢:
重点关注一下上图中的:
Prev Block:记录签一个区块的hash地址,32字节
Merkle Root:是一个记录当前块内的所有交易信息的数据摘要hash值,32字节
Nonce:一个随机值,需要通过这个随机值去找到满足某个条件的hash值(挖矿),4字节
上面只是解释了几个重点的字段,其它字段通过字面应该容易理解就不一一解释了。
这所有的字段一起就组成了 block header(区块头),然后需要对 block header 进行2次hash计算,计算完成的值就是当前比特币区块的hash值。因为比特币系统要求计算出来的这个hash值满足一定的条件(小于某个数值),因此需要我们不断的遍历Nonce值去计算新的hash值以满足要求,只有找到了满足要求的hash值,那么这就是一个合法区块了(这一系列动作也叫作挖矿)
python 示例: SHA-256(SHA-256 (Block Header)
我们再看一下上面的另一个重要字段: Merkle tree 字段。
Merkle tree 被称为 默克尔树,它也是哈希算法的一个重要应用。
它其实是一个用哈希指针建立的二叉树或多叉树。
Merkle tree 如图:
其树的顶端叫做 默克尔根(Merkle Root),Merkle Root 也是一个hash值,它是怎么计算出来的呢?
比特币中对每一笔交易做一个hash计算,然后把每2个交易的hash再进行合并做hash,如图中的 交易A的hash值是 H(A),交易B的hash值是H(B),再对这2个交易合并hash后就是H(hA|hb),就这样一直往上合并计算,算到最后的根部就是 Merkle Root 了。
在比特币和以太坊中都是使用的默克尔树结构,但是以太坊为了实现更多复杂的功能,所以有三个默克尔树。
至此,区块链中的哈希算法应用就介绍完了,接下来我们看一下非对称加密算法。
二、区块链中的非对称加密算法
区块链中有一个很关键的点就是账户问题,但比特币中是没有账户概念的,那大家是怎么进行转账交易的呢?
这里就得先介绍区块链中的非对称加密技术了。
非对称加密技术有很多种,如:RSA、ECC、ECDSA 等,比特币中是使用的 ECDSA 算法。
ECDSA 是美国政府的标准,是利用了椭圆曲线的升级版,这个算法经过了数年的细致密码分析,被广泛认为是安全可靠的。
所谓非对称加密是指我们在对数据进行加密和解密的时候,需使用2个不同的密钥。比如,我们可以用A密钥将数据进行加密,然后用B密钥来解密,相反,也可以用B来加密,然后使用A来解密。那么如果我想给某个人传递信息,那我可以先用A加密后,将密文传给她,她拿到密文之后,用手上的B密钥去解开。这2个密钥,一个被成为公钥、一个是私钥。
在比特币中,每个用户都有一对密钥(公钥和私钥),比特币系统中是使用用户的公钥作为交易账户的。
我们先看下图:
在图中可以看到,在第一笔交易记录中,是 用户U0 来发起的交易,要将代币支付给 用户U1,是怎么实现的呢?
首先 用户U0 写好交易信息:data(明文,例如:用户U0转账100元给用户U1)
用户U0 使用哈希算法将交易信息进行计算,得出 H = hash(data),然后再使用自己的私钥对 H 进行签名,即 S(H),这一步其实是为了防止交易信息被篡改用的
然后基于区块链网络,将 签名S(H) 和 交易信息data 传递给 用户U1
用户U1 使用 用户U0 的公钥 来对 S(H) 解密,就得到了交易信息的哈希值 H
同时,用户U1 还使用哈希算法对 交易信息data 进行计算,得出 H2 = hash(data)
对比上面2个哈希值,如果 H1==H2,则交易合法。说明 用户U0 在发起交易的时候确实拥有真实的私钥,有权发起自己账户的交易
网络中每一个节点都可以参与上述的验证步骤。
这个示例,就是比特币中一次交易的签名流程,即将 哈希算法与非对称算法结合在一起用于了比特币交易的数字签名。
除此之外,比特币中,公私钥的生成、比特币地址的生成也是由非对称加密算法来保证的。
以上,就是区块链体系中,核心技术之哈希算法与加密算法的应用情况,欢迎一起交流。
相关阅读:https://www.roncoo.com/course/view/45408f63110e428389881f4d84d0cd30

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Spark源码系列RDD详解【转】
1、什么是RDD? 上一章讲了Spark提交作业的过程,这一章我们要讲RDD。简单的讲,RDD就是Spark的input,知道input是啥吧,就是输入的数据。 RDD的全名是Resilient Distributed Dataset,意思是容错的分布式数据集,每一个RDD都会有5个特征:1、有一个分片列表。就是能被切分,和Hadoop一样的,能够切分的数据才能并行计算。2、有一个函数计算每一个分片,这里指的是下面会提到的compute函数。3、对其他的RDD的依赖列表,依赖还具体分为宽依赖和窄依赖,但并不是所有的RDD都有依赖。4、可选:key-value型的RDD是根据哈希来分区的,类似于mapreduce当中的Paritioner接口,控制key分到哪个reduce。5、可选:每一个分片的优先计算位置(preferred locations),比如HDFS的block的所在位置应该是优先计算的位置。对应着上面这几点,我们在RDD里面能找到这4个方法和1个属性,别着急,下面我们会慢慢展开说这5个东东。 //只计算一次 protecteddefgetPartitions:Array[...
- 下一篇
zabbix实战--mysql监控详解
视频资源:http://www.roncoo.com/course/view/fb3050a5b34b42f39ccad83ebebc89c1 龙果开源运维项目地址:https://github.com/roncoo/roncoo-cmdb 一、监控采集依据:主要基于show global status对数据进行采集: 二、对用户进行授权,然后使用show global status进行采集分析。 mysql -uroot -p”xxxx” -e "show global status" ###查看所有的值 监控项注释: Aborted_clients ##客户端不能正常连接,失败的连接数量。 Aborted_connects ##客户端中断数量,可能有恶意连接。 ###吞吐量 Bytes_received ##从所有客户端接收到的字节数。 Bytes_sent ##发送给所有客户端的字节数。 ###com admin 语句执行数量 Com_commit ##统计提交语句次数 com_delete ##统计删除语句 com_delete_multi ##最小 com_inse...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker安装Oracle12C,快速搭建Oracle学习环境
- Linux系统CentOS6、CentOS7手动修改IP地址
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Hadoop3单机部署,实现最简伪集群