数字货币的基础 - 加密哈希函数

前文《数字签名是什么 》简述了数字签名技术的基础概念及应用场景。对于数字加密货币来说,除了数字签名,还有一个基础技术是加密哈希函数。所谓哈希函数,简单理解就是输入一个字符串,输出另一个字符串。听起来很简单对不对?但是对于加密哈希函数来说,它还需要满足其他条件才能发挥其强大的作用。


需要满足哪些条件?最重要的有两个:

一个是碰撞阻力;

一个是隐秘性。


看字面是不是很难理解?不用着急,为了理解这两个特性,我们从现实中的例子来讲起。


1. 碰撞阻力


你上传了一个很大的本地文件到网盘,以便随时可以使用。某天在其他机器登陆网盘、下载这个文件之后,你需要确认文件内容与你之前的本地文件内容一样。不一样可能有多种原因,可能是网络传输问题导致文件下载不全,也可能由于黑客攻击,使得文件内容被人恶意篡改过。


你不可能直接拿这个文件与之前的原始文件进行比较,如果可以这样的话,也就没必要上传下载了。


你可能会说,看文件大小不就好了,如果文件下载不全,文件大小会不一样。


确实,对于网络传输导致下载失败的情况,看文件大小是可以的,但如果是恶意篡改呢?文件中的某些内容如果被修改,你如何才能发现?


这时,一个简单的解决方案是信息摘要。通过一个加密哈希函数,将文件内容转化成一个固定长度的信息摘要(还记得之前说过的吗,哈希函数的作用就是输入一个字符串,并输出一个字符串;文件底层也是一串长长的字节码,你可以把它想象成一个很长的字符串),你只需要记住这个信息摘要(原文件的哈希值),下载文件之后,重新计算文件的哈希值,并将它与你先前记录的信息摘要进行比较。


如果这两个哈希值一样,则说明原文件没有被篡改过。


那么问题来了,加密哈希函数如何保证这点?会不会存在两个不一样的文件,输出一样的哈希值?放心,这就是加密哈希函数需要满足的一个基础特性之一:碰撞阻力。


所谓碰撞阻力,是指对于一个哈希函数,没有人能够找到两个不同的输入,让它们产生相同的输出。满足这个条件的哈希函数就是具有碰撞阻力的。


聪明的你一定会问,常见的加密哈希函数的输出都是固定位数的,如果输出为32位,而输入无穷尽的,由于输入的总数量大于输出的总数量的,那肯定存在不同的输入对应相同的输出,这样的函数怎么能说是具有碰撞阻力呢?


这里需要注意,这里所定义的“没有人能找到”,而不是说真的不存在。理论上通过遍历计算的方法,是一定能找到的两个输出相同的输入的。但是输出的长度越大,遍历计算所需要的计算量就越大,找到两个输出相同的输入的概率也越小。当概率小到一定程度,我们就完全能忽略这种可能性了


举个例子,如果输出的长度为256位,假如一台计算机每秒计算1万次hash值,那么就算地球上的所有计算机从地球诞生一刻起开始马不停蹄的计算,它们找到两个有相同输出值的概率,比2秒内地球被其他小行星撞击的概率还小。因此与其担心碰撞被找到,还不如担心地球被小行星撞击毁灭


因此,如果你使用的具有碰撞阻力的加密哈希函数,只要信息摘要一样,你就可以很确信文件没有被篡改过。篡改人是无法做到既修改文件内容,又保证信息摘要不变的。


2. 隐秘性


对于何为碰撞阻力,你现在应该比较清楚了。隐秘性又是什么呢?要理解这个概念,让我们还是回到现实的场景。


设想这样一个场景,多人需要对某个决议进行投票,大家把自己的投票结果放在一个信封中,信封密封好放在桌上(避免各自的决议被其他人知道,以免影响投票策略)。等到所有人都放好后,仲裁人打开所有信封公布结果时。在这个过程中你无法修改信封中的内容,你的投票结果也无法影响到其他人。


如果把这个场景放在线上呢?没有仲裁人的存在,如何来实现投票过程。我们先总结整个过程需要满足的条件:

1、结果公布前,互相不知道其他人的决议是什么;

2、决议做出后无法更改。


在线上场景要满足以上条件确实比较麻烦。由于没有一个仲裁人的存在,如果将决议信息显式的发布出来,其他人就能够看到;如果不发布出来,而是在披露结果的时候再头一次展示,则无法防止中途修改数据。


一个可行的方法如下:

1、所有人均将自己的决议信息通过哈希函数加密,并公布出来;

2、所有加密的决议信息公布完成之后,大家在各自公布自己的决议信息;对于每个人的信息,其他人都可以通过哈希函数再次进行加密计算,并与他之前公布的加密信息进行比对,如果内容一致,则说明一开始给出的决议与当前相同。


那这个加密函数需要满足什么条件?除了上面讲到的碰撞阻力,还需要满足的就是隐秘性


所谓隐秘性,是指如果我们仅仅知道哈希函数的输出,那么我们没有可行的办法算出输入值。


试想下,如果没有隐秘性,则这个哈希函数无法满足上述条件1:大家可以通过加密后的输出来计算出原始决议的内容。


如果没有碰撞阻力,就无法满足上述的条件2:如果有人准备了多个决议,它们的加密结果相同,则在最后公布时,他能选择对自己更有利的决议来混淆大家的判断。


如果哈希函数能满足这两个条件,那么上面的投票过程就能顺利进行了。


另外,在具体的实践中,为了防止“暴力撞库”,发布的信息通常是和一个临时的随机字符串连接之后,再进行哈希计算,公布结果时也会同时公布此随机字符串与发布的信息。如果不这样做,可能会有人把曾经出现过的所有信息与加密结果记录下来,当你给出一个加密信息时,他很可能直接匹配上输入。


举个例子,如果决议的结果只是0到9中的某一个数字,那参与人可以提前将0到9的加密结果算好;其他人公布加密结果时,他能能轻松的得知其他人的真实信息。但如果每次公布加密结果时,都先生成一个32位长的随机字符串,再在这个字符串后面拼接上真实信息(0到9中的某个数字)后进行加密,则其他人是无法通过上述方式得知你的真实信息。而在最终公布结果时,你只要把随机字符串与真实信息同时披露即可。


好了,相信通过上面的介绍,大家已经知道加密哈希函数的特性及可被应用的场景了。


在加密数字货币的实现中,加密哈希函数是非常基础和重要的,关于具体有哪些加密哈希函数、它们的实现细节如何,涉及到较多的密码学知识,这里就不多赘述。后面的文章会更多的聚焦于数字货币的运行机制、以及生态。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

留言与评论(共有 0 条评论)
   
验证码:
微信号已复制,请打开微信添加咨询详情!