区块链密码学——哈希函数

区块链密码学——哈希函数

密码学是区块链以及一切网络安全相关产业的基础,而密码学中的哈希函数又被普遍运用到区块链中。

密码学是区块链以及一切网络安全相关产业的基础,而密码学中的哈希函数又被普遍运用到区块链中。拿比特币来说,其钱包地址是哈希数值,挖矿是哈希计算,这就是为什么要学点哈希函数。通过理解哈希函数,能间接的理解为什么强大的密码学基础可以给比特币投资人以信心,在没有政府背书的比特币世界,仍然愿意投资比特币,归根结底其信心是建立在对密码学的信心之上。

哈希函数主要特性

哈希算法并不是一个特定的算法而是一类算法的统称。哈希算法也叫散列算法,一般来说满足这样的关系:f(data)=key,输入任意长度的data数据,经过哈希算法处理后输出一个定长的数据key。

输入data可以是任意长度的字符串,比如LbitaG7yT6bPb

无论输入多少字符串,都会输出固定长度字符串的key,如这样一个34位的比特币钱包地址3Cbq7aT1tY8kMxWLbitaG7yT6bPbKChq64

能进行有效计算。给定合理的输入,在合理时间内能算出合理的结果。一个长度的输入是一秒内算出来,一万个长度的输入也能一秒内算出来,而不是算上一年才出结果。

这三个特性定义了一般哈希函数。

哈希函数附加特性

碰撞阻力(collision-resistance)

什么是碰撞?对于函数H(),H(x) = H(y), x≠y, x和y算出来一样的值,那么x和y就碰撞了。两个人穿了一样的衣服,撞衫了。

碰撞阻力就是找不到这样一个y,使y≠x 但是H(x) = H(y),这种情况我们就说哈希函数H()具有碰撞阻力。

具有碰撞阻力并不能说明真的找不到这样一个y,只要可能的输入足够多,早晚会找到这样一个y,只是时间问题。对于一个256位输出的哈希函数来说,最坏的情况是你需要进行2256+1次哈希函数计算,平均次数为2128次(生日悖论,仅通过检验可能输出数量的平方根次数,便大体能找到碰撞),如果一台电脑每秒计算10000个哈希值,计算2128个哈希值需要花1027多年时间,简直是天文数字,就算从地球诞生那天开始算到现在也还远远不够用。

我们日常生活中遇到下载软件的情况,会发现注重安全的网站会负责的放上信息摘要(message digest)。这个信息摘要就是哈希函数计算的输出值。软件下载到本地,用同一个哈希函数如MD5计算此文件生成的输出值即摘要,和网站提供的摘要对比,如一致则说明文件在传输过程中完整可靠,没有损坏或被篡改。这就是对碰撞阻力特性的重要应用。

隐秘性(hiding)

回头看一下这个函数f(data)=key,输入任意长度的data数据,经过哈希算法处理后输出一个定长的数据key。

同时这个过程是不可逆的,无法由key逆推出data。不可逆,data可以被藏的好好的没人能猜出来,即隐秘性。

隐秘性的好处在于只有持有data的人才能使用这个独一无二的key。

解题友好(puzzle-friendliness)

如果对于任意n位输出值y,假设k选择高阶最小熵分布,如果无法在比2n小很多时间内找到H(k||x)=y中x值,那么H哈希函数谜题友好。

一个搜索谜题包含如下内容:

哈希函数H

谜题ID

目标集合Y

求x满足如H(id ll x)∈Y

集合Y的值越多谜题就越容易解答,id与Y共同决定了解决上述数学问题的难度,因为id和Y的范围都可人为控制,这样就可控制挖矿的难度。

哈希表

哈希表这种数据结构就是以哈希函数为基础创建的。

这里引用知乎的答案,通过一个生动的比喻来讲述什么是哈希表:

via:什么是哈希表和哈希算法?

比如这里有一万首歌,给你一首新的歌X,要求你确认这首歌是否在那一万首歌之内。

无疑,将一万首歌一个一个比对非常慢。但如果存在一种方式,能将一万首歌的每首数据浓缩到一个数字(称为哈希码)中,于是得到一万个数字,那么用同样的算法计算新的歌X的编码,看看歌X的编码是否在之前那一万个数字中,就能知道歌X是否在那一万首歌中。

作为例子,如果要你组织那一万首歌,一个简单的哈希算法就是让歌曲所占硬盘的字节数作为哈希码。这样的话,你可以让一万首歌“按照大小排序”,然后遇到一首新的歌,只要看看新的歌的字节数是否和已有的一万首歌中的某一首的字节数相同,就知道新的歌是否在那一万首歌之内了。

当然这个简单的哈希算法很容易出现两者同样大小的歌曲,这就是发送了碰撞。而好的哈希算法发生碰撞的几率非常小。


分享到:


相關文章: