密码学哈希函数是区块链的根基,也是很多安全系统的基石。
密码学哈希函数包含两个概念,哈希函数和密码安全。哈希函数是一个数学函数,具有以下三个特性:
- 其输入可以为任意大小字符串
- 它产生固定大小的输出(比如256位的输出)
- 它能进行有效的计算,且计算时间合理,对n位的字符串,其哈希计算的复杂度为O(n)
要使得哈希函数达到密码安全,又需要哈希函数具有以下三个附加特性:
- 碰撞阻力
- 隐秘性
- 谜题友好
碰撞阻力
如果无法找到两个值,x和y,x不等于y,使得H(x) = H(y),则称哈希函数H具有碰撞阻力。然而实际中,并没有办法找到完全不碰撞的哈希函数,也不存在某个哈希函数具有完全防碰撞特性。但是,找到某些哈希函数的碰撞情况的概率仍为无穷小,比下两秒陨石撞地球的概率还小得多,所以我们选择相信那些加密的哈希函数具有碰撞阻力。
由此我们可以将哈希函数输出作为信息摘要,并用作鉴别文件真伪的证据。例如我上传了一个很大的文件到服务器,在我下载这个文件到电脑时,如何保证文件没有被修改?我只需要在上传文件前,计算下文件的哈希值并保存起来。在下载文件后,重新计算下下载文件的哈希值,与之前保存的哈希值比较一下,就知道文件有没有被修改。
隐秘性
隐秘性是指我们仅仅知道哈希函数的输出y = H(x), 但却无法通过y倒推出x的值。
隐秘性的应用之一就是“承诺”。比如我说明天的体育彩票开奖号码为123456,但我不想立刻告诉大家,怕体彩破产,只想让大家知道我预测了一个号码。开奖后如果不是我预测的号码,我给大家一人一万元。如何保证我不会出尔反尔,在开奖后说我预测的号码就是开奖号码?
在开奖前,将我预测的号码和一个随机数作为哈希函数的输入,将得到的输出公之于众,大家不可能通过我公布的输出推出我预测的号码。开奖后,我公布我预测的号码和这个随机数,那么大家都能验证我说的是否正确,同时,我也不可能改变主意,赖掉这件事了。
在密码学中,这个随机数(nonce)意味着只能使用一次。这一点很重要,不少安全函数对随机数的随机性及使用次数都有明确规定。
谜题友好
这一特性是指,如果一个哈希函数y = H(x)具备谜题友好性,这就意味着没有一个解决策略比只是随机地尝试x取值来求得给定y更好
安全哈希算法
安全哈希算法(Secure Hash Algorithm 256, SHA-256)在比特币系统中被大量使用。这是一个效果很不错的哈希函数。
简单介绍了一下密码学哈希函数,希望对大家能有帮助
有兴趣的朋友可以加群讨论,一起学习 701477586
参考资料
《区块链技术驱动金融》
网友评论