4

Jason‘s Blog

 2 years ago
source link: https://jasonxqh.github.io/2022/03/03/%E5%8C%BA%E5%9D%97%E9%93%BE%E5%9F%BA%E7%A1%80-%E5%93%88%E5%B8%8C/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

区块链基础-哈希

区块链中常见的Hash函数

首先,我们要给出Hash函数的定义以及特征:

Hash函数是一种从任何种类、任何大小的数据中创建固定大小值的方法,这个值也被称为散列值。通常,用一个短的随机字母和数字组成的字符串来代表。

比如说对于sha 256算法来说,不管输入的值是什么类型、值有多大,它出来的一定是一个256bits的字符串。

  • Hash函数是逆向难解的。根据给定的散列值,以目前的计算资源很难在有限的时间内推出原文
  • 强抗碰撞性。对于任意两个不同的明文x和y,$H(x)$ 不等于$H(y)$
  • 雪崩效应。原文的微小变更会导致散列值巨大的变化,使得通过明文来反推原文的难度是非常困难的

Hash函数常见算法

MD系列有MD4和MD5,输出位128位。MD5比MD4更加安全,但计算速度较慢。

SHA是一个Hash函数族。主要有SHA-0,SHA-1,SHA-2,SHA-3 这几个版本。 SHA-2版本包括SHA-224、SHA-256、SHA-384和SHA-512,其中SHA-256是应用最广泛的Hash函数。

现在 MD5、SHA-0和SHA-1已经发现碰撞,存在安全问题,已经不适于商业应用。

哈希函数在区块链中的应用

首先我们要思考在P2P网络中,如何保证数据的准确性?比如说我用P2P下载一部电影,那么这时候电影文件会被拆分成一个一个片段,由不同的用户传给我。那么怎么保证我收到的电影片段是完整的呢?答案就是利用哈希。因为哈希的雪崩效应和强抗碰撞性,只要输入的片段有所偏差,那么输出的值肯定是不对的。因此我们可以用哈希函数对数据的正确性进行验证。

应用在区块链上:

区块链的地址与标识

每个交易的标识、区块的标识都是一个 Hash值。区块链通过区块链头中的PrevBlockHash或ParentHash连接相邻的块,最终形成链状结构。

区块体相关数据的树根hash —— 交易树

在区块的头部存储Merkle树的根散列值,这个根散列值是由两两交易逐层生成的,因此这个根散列值也代表了区块中的所有交易数据的数字摘要。

比如说,我想知道L3这块数据的正确性,我只需要Hash0、Hash1-1这两个哈希值(Top Hash已知),我们就能通过Hash函数验证L3是否正确。这就是Merkle Proof

签名与验证

要理解签名和验证,首先要搞明白公钥和私钥的区别。比特币账户是以一个$2^{160}$的数字地址形式存在的,该账户能拥有、转出和转入比特币。因为地址够长,从而可以确保任意两个账户不会重复。

公钥和私钥

那么为了标识一个唯一的身份,就出现了公有密钥(公钥)和私有密钥(私钥)的概念。

  • 私有密钥是随机生成的,而共有密钥根据私有密钥产生
  • 公有密钥是交易方对外公布的地址,别人都可以知道。用于接收转入
  • 私有密钥则用于支付,这个是不能告诉任何人的。
对称加密和非对称加密

了解了公钥和私钥的概念,还需要了解对称加密非对称加密的概念。

  • 对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。但是在对称加密中,如何给别人提供密钥呢?如果广播的话,每个人都知道密钥是什么,那么会造成数据的不安全。
  • 非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。比如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人—银行才能对你的消息解密。与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高。
数字签名与验证
  1. 数字签名的签名过程

数字签名的操作过程需要有发方的签名数字证书的私钥及其验证公钥。

具体过程如下:

  • 首先对代发文件做哈希算法形成数字摘要
  • 再对数字摘要用签名私钥做非对称加密形成数字签名;
  • 之后将以上的签名和电子文件原文以及签名证书的公钥加在一起进行封装,形成签名结果发送给收方待收方验证。
  1. 数字签名的验证过程

接收方收到发方的签名结果进行签名验证

具体过程如下:

  • 接收方收到数字签名的结果,其中包括数字签名、电子原文和发方公钥,即待验证的数据。
  • 接收方进行签名验证:接收方首先用发方公钥解密数字签名,导出数字摘要;
  • 并对电子文件原文做同样哈希算法得出一个新的数字摘要,将两个摘要的哈希值进行结果比较,相同签名得到验证,否则无效。

示意图如下:

数字签名的意义就是,在传输一份文件的时候,除了文件本身还附带了一个我的签名,这个签名的作用就是证明,我本人发了这个文件,是赖不掉的(不可抵赖性);而且保证了文件的安全性,因为如果被篡改会导致验证失败

  1. 防篡改。由哈希函数和默克尔树的特性可知,区块中的某个交易的修改会导致交易的散列值发生变化,区块头部中的根散列值也会发生变化。区块的校验方法会校验区块头部中的根散列值和区块中交易生成的新的根散列值是否一致
  2. 数据编码

加密解密算法

数字证书及PKI体系


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK