加密哈希函数定义

加密哈希函数(Cryptographic Hash Function),又译作密码哈希函数、加密哈希函数,是一种使用于密码学的数学函数。对加密哈希函数输入资料(Input),会得到一串固定长度的输出结果(Digest)。请看下图:

图片来源:Wikipedia

非常简单,输入不同的值便会得到不同的输出结果,针对加密哈希函数,我们可以简单整理出三个基本特征:

1. 可以输入任何字串

乍听之下好像没什么了不起,也许Hash一两段句子你感受不到,当你Hash一整个图书馆的资料,还是无数笔交易纪录等等的时候,它就产生了极大的应用空间。

2. 固定长度的输出值

结合第一项,无论你Hash多少资讯量,都只会产生固定长度的输出值,所以你可以利用哈希函数,为各种庞大数量的资料标上识别码。

3. 高效的计算速度

输入资料后马上就能产生输出值。

你可能会问,这和加密货币有什么关系呢这就要从加密哈希函数的属性来看了。

加密哈希函数属性

1. 无冲突的(Collision-free)

不同的Input,一定会产生不同的输出结果,也就是不同的哈希值(准确说,是要找到相同的机率太低,找到的时候可能宇宙已经毁灭)。

因此,当A和B的哈希值相同,就证明了A等于B,比如说如果我生日数字的哈希值,和你生日数字的哈希值一样时,就表示我们的生日一样。

这有什么用呢最主要的,是它让我们可以很进行高效的验证。

假设我今天手中有两本书,看起来好像一样,但我又没办法确定,除非我一页页每一个字去核对,要花费相对多时间。其实,我只要取得这两本书的哈希值,就能轻易验证这两本书是不是一模一样。

2. 函数是单向的(Hiding)

很难(几乎等于不行)从哈希值,倒推回去算出输出值。也就是说,你可以对密码和档案Hash之后,拿来使用、验证、发布,而不会危及你密码的安全性。

3. Puzzle-friendly

不知道怎么翻译,大概是「支持解谜的」。具体来说,就是无法依靠选择,产生出你想要指定的哈希值,比如你想要让哈希值是111111,你无法知道要输入什么字串,只能不停尝试,直到111111出现为止。

你肯定常常听到的「挖矿」,其实就是矿工们去竞争、去寻找一个随机常数,让整个区块的哈希值落在目标区域内。今天先不谈这个,只是先让你知道Puzzle-friendly属性对于加密货币领域也是相对重要的一环。

另外要提的是,以上有很多地方出现「很难」这个形容,一来是因为有些机率过低,像是冲突(collision)肯定存在,只是无法发现;二来是未来或许会出现具有更高算力的电脑、机器,可以打破加密哈希函数的单向属性,只是目前是还没有发生的。

基本上,我们总希望加密哈希函数拥有这些属性,但事实上,不同算法和不同的输入值分布状况,可能导致其缺少一些属性,或是给恶意的人有机可乘的漏洞。

目前,加密哈希函数被广泛运用于加密货币的交易中,基于上面的特性,提供用户匿名性和安全性;举例来说,Bitcoin用的就是SHA-256,加密哈希函数算法之一,门罗币XMR用的则是Cryptonight演算法等等。