LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 币圈百科 > 一文读懂什么是哈希函数 | 比特币中的密码学原理

一文读懂什么是哈希函数 | 比特币中的密码学原理

2020-07-15 郑植 来源:区块链网络


比特币被称为加密货币(crypto-currency),但其实加密货币是不加密的。 区块链上所有交易内容,包括账户地址,转账金额都是公开的。比特币中,主要用到了密码学中的两个功能,一个是哈希,另一个是签名

碰撞阻力(collision resistance )

我们先来看哈希函数。哈希函数有两个性质,其中一个叫碰撞阻力

怎么理解呢,我们先了解一下什么是哈希碰撞。

x≠y,H(x)=H(y)

如果有两个输入 x、y(x≠y)。哈希函数叫做H,如果H(x)=H(y),那么这就叫做哈希碰撞。也就是说两个不同的值通过哈希函数算出的结果是相等的。

一般来说,哈希碰撞时不可避免的。因为输入空间都远远大于输出空间。比如有一个 256 位的哈希值,那输出空间就是 2 的 256 次方。但是输入空间可以是无限大的。所以理论上会有两个输出被映射到一个输入的情况发生。


我们这里说到的碰撞阻力的意思,并不是说碰撞绝对不会发生。而是说没有什么高效的方法,可以人为的去制造哈希碰撞。只能靠蛮力求解的方法,用所有的输入挨个去试。这叫做暴力破解。

但如果这个输入的空间非常大的话,在实际破解中就是不可行的,因为工作量实在是太大了。


碰撞阻力有什么用?

碰撞阻力这个属性有什么用呢?我举一个例子,比如你想把一个软件传到云盘上,将来要用的时候再下载回来。这时候,我怎么知道下载的版本和你上传的版本是一样的呢?这时候就可以用得到哈希函数碰撞阻力的这个属性。

在我们上传文件之前,先算一个哈希值存在本地。当我们下载回来的时候,再算一个哈希值。和我们之前存的哈希值比较一下。如果一样那就说明,上传的文件没有被篡改过。

隐秘性(hiding)

第二个性质叫隐秘性,意思是哈希函数的计算过程是单项的,不可逆的。用公式表达是这样的,给定一个输入 X 可以算出他的哈希函数H(x),但如果我们只知道输出H(x)是没法反推出X的。也就是输出值,不会泄露任何输出值的有关信息。

但我们想一下,如果想要知道这个输入也还是有方法的。还是用蛮力的方法,把输入全都算一遍,看看哪个哈希值和输出相等就可以。所以隐秘性这个性质的成立,还有一个前提。需要输入的空间足够的大,让蛮力求解的方式不可行。而且输入的分布,还要比较均匀。各种取值的可能性都是差不多的。不然,就算输入的取值空间很大,但都集中在少数几个值,还是容易被破解。

隐秘性有什么用?

隐秘性有什么用呢?它可以和碰撞阻力的性质结合来做一个承诺(commitment)。

比如说有一个人,他说自己能预测股票走势。怎么才能证明他的预测是否准确呢?一种方法是,这个人提前把他的预测信息发出来。等到第二天收盘,和市场表现对比一下就知道了。

但是这样做有一个问题,因为预测结果提前公布了,很可能会影响股市。比如有些散户信了他的话提前进行了操作。所以说,在这种情景中预测结果不能提前公开。可不提前公开信息,又怎么能保证预测结果没有被篡改过呢?

在真实世界里,预测者可以把预测的信息提前写好,装在信封里封好,然后将信封交给可信任的第三方机构代为保管。


那在电子的世界里,就要用到哈希函数了。把预测的结果作为输入,算出一个哈希值,然后把哈希值公布出去。因为有上面提到的隐秘性的性质,所有其他人从这个哈希值里,也算不出我的预测结果。等到第二天收盘了,再把预测结果公布出去。又因为有碰撞阻力的性质,所以我的预测结果是不可能篡改的。如果改了的话,就和当初公布的哈希值对不上了。

谜题友好(puzzle friendly)

除了密码学中哈希函数的两个性质之外,比特币中用到的哈希函数。还要求第三个性质谜题友好(puzzle friendly)。他的意思是说,哈希值的计算,事先是不可预测的。也就是只通过输入,是很难判断出输出是什么。只能进行计算。

所以,我们如果想要一个输出的结果,落到某个范围之内。也没什么好办法,只能一个一个输入去试。比如,比特币的挖矿就是要求输出结果前面多少位都是0。这也是完全没有规律可循的,只能一个一个去计算。

签名

说完了哈希函数,我们说说比特币当中用到的另一个密码学功能签名

非对称加密

要想了解签名,我们要从比特币的账户管理开始说起。
日常生活中,你想开一个账户的话,我们需要带上证件去银行办理一个开户的手续。这就是中心化的系统的账户管理方式。

而比特币是去中心化的,他没有银行之类的机构。那怎么开账户呢?

每个用户可以自己决定开户,不需要任何人批准。开户的过程很简单,就是创建一个公钥和私钥。

公私钥这个概念,来自于非对称加密体系。最早的加密体系都是对称的,比如说我们两个人要通信,但通信的网络是有可能被窃听的。为了防止信息泄露,可以提前准备一个秘钥。我把这个信息加密之后发给你,你收到之后再用这个秘钥解密。


因为加密和解密用的是同一个秘钥,所以叫做对称加密。他的前提是,有某种安全的渠道。能把秘钥分发给通讯的双方。一旦秘钥泄露了,加密也就没意义了。这是对称加密体系的一个弱点。

而非对称加密,就能比较好的解决这个问题。加密用公钥,解密用私钥。比如我们要把信息传给你,我用你的公钥对信息进行加密。你收到之后呢,再用你的私钥进行解密。加密和解密用的都是接收人的公钥和私钥。公钥可以公开到网络上,而私钥只有自己知道。当你要给别人发送信息的时候,也一样用的是他的公钥进行加密。

这样的好处就是,避免了对称加密过程中秘钥传输的问题。

签名

比特币系统中你要创建一个账户,就在本地产生一个公钥和私钥。公钥就相当于你的银行账号,别人要给你转账,只需要知道你的公钥即可。而私钥相当于你的账户密码,知道私钥就能把账户上的钱转走。

我们之前说过,比特币这个加密货币其实是不加密的,信息都是公开的。那我要这公钥和私钥干嘛呢?答案就是签名

比如我要转1个比特币给你,我把这个消息发布到区块链上。别人怎么知道这个交易确实是我发起的呢?这就需要我在发布这个交易的时候,要用我自己的私钥对这个交易进行签名。其他人收到这个交易之后,再用我的公钥去验证这个签名的正确性。这样就能确定我的身份了。

参考内容:

北京大学肖臻老师《区块链技术与应用》公开课

区块链技术驱动金融-数字货币与智能合约技术 |中信出版社

【官方双语】想知道比特币(和其他加密货币)的原理吗?

—-

编译者/作者:郑植

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...