新手在学习区块链时,常常听到的词汇就是,这些算法似乎无处不在。在运行分布式网络和共识机器时(比如比特币和以太坊网络),通过点对点的方式连接数万个结点,需要同时具备“无信任”和高效率验证。也就是说,这些系统需要以紧凑的格式对信息进行编码,允许其参与者进行安全而快速的验证。
比特币和以太坊处理的主要原语是块的概念,块是包含事务、时间戳和其他重要元数据的数据结构。能够将关于网络全局状态的大量信息压缩成一个简短的消息标准,是其安全性的重要保障,如果有需要可以有效地验证消息标准,称之为哈希。
即使只改变输入中的一个字符也会产生完全不同的哈希值,从密码存储到文件验证系统,到处都在使用 Hash 算法。其基本思想就是使用确定的算法,给算法接受一个输入并产生一个固定长度的输出,也就是说,相同的输入将**始终产生相同的输出。
不仅仅是确定性对 Hash 算法很重要,在输入中改变单个的位也将产生完全不同的 Hash 值。
Hash 算法的一个问题就是碰撞的必然性。也就是说,对于任何我们能想象的输入,都产生一个固定长度的字符串,那就有其他可能的输入将导致输出相同的字符串。碰撞是很糟糕的事情,这意味着攻击者可以按需求去创建碰撞,然后将恶意的文件或数据作为正确的 Hash 与合法的伪装。好的 Hash 函数的目标是增加攻击者找到产生相同 Hash 值的输入的难度。
计算 Hash 不应该太有效,因为这会使攻击者更容易认为的计算碰撞。Hash 算法需要抵抗“预成像攻击”。也就是说,给定 Hash 值,应该很难计算出创建这个 Hash 值的确定性步骤。
总结一下,好的 Hash 算法应该有以下三个特性:
改变输入中的一位会导致雪崩效应并产生完全不同的结果;
应该具有非常低的碰撞率;
某种程度的效率不会牺牲碰撞阻力。
攻击哈希
最初的 Hash 算法标准之一是 MD5 散列,它广泛用于文件完整性验证(校验和),并在 web 应用程序数据库中存储密码(常见于),它的功能非常简单,为每个输入都输出一个固定的 128 位字符串,并在几轮之间使用简单的单向操作来计算它的确定性输出。短输出以及操作的简单性使得 MD5 非常容易被破坏,容易受到所谓的生日攻击。
什么是生日攻击
你听说过把23个人放在一个房间里,有 50% 的可能两个人生日是同一天吗?如果将人数提高到70人,那么将会有 99.9% 的可能有两人生日是同一天。这源于我们所谓的,该理论粗略的指出,给出 100 个鸽子和 99 个盒子,要把盒子装满,那么有一个盒子里面会有两只鸽子。也就是说,固定的输出意味着存在固定的排列程度,在此基础上就能找到碰撞。
实际上 MD5 的抗碰撞非常弱,一个简单的家用 2.4GHz 奔腾处理器就可以在几秒内计算出人工哈希碰撞。此外,在当前 web 的早期,它的广泛使用已经在网上创建了大量泄露的 MD5 预映像,只需要对她们的散列进行简单的 Google 搜索就能找到这些映像。
哈希算法的多样性与演进
NSA(美国国家安全局)一直是哈希算法标准的先驱,他们最初提出了安全哈希算法SHA1,创建了160位固定长度输出。很不幸,SHA1 仅仅通过增加输出长度、单向操作的步骤、单向操作的复杂度来改进 MD5,但是没有针对使用不同攻击向量的强大机器进行改进。
那么我们怎样才能做得更好呢?
在2006年,NIST(美国国家标准技术研究所)发起了一个比赛,旨在找到一个从根本上区别于 SHA2 的方案作为新的标准。因此,SHA3 因为 KECCAK 算法的诞生而广为人知。
尽管叫这个名字,但是 SHA3 内部有很大的差异,它采用了海绵结构机制,使用随机排列来吸收和输出数据,同时作为哈希算法未来输入的随机性来源。
SHA3 维护一个内部状态,它包含更多与输出相关的信息,使得它能够克服以前算法的局限性。NIST 在2015年把它列为标准。
哈希的工作证明
当把哈希算法集成到区块链协议中时,比特币选择了 SHA256 而以太坊使用修改后的 SHA3(KECCAK256) 作为其工作证明。使用工作证明为区块链选择哈希函数的一个重要质量是计算前面所说的哈希效率。
比特币 SHA256 的实现可以通过专用集成电路的专用硬件进行额外的高效计算。关于在采矿池中使用专用集成电路使协议趋向于集中计算已经写了很多了。也就是说,工作证明可以激励计算机效率高的计算机组合聚合到采矿池中,并增加我们所说的“哈希能力”,或者来衡量机器每个时间间隔可以计算的哈希值。
以太坊选择了一种名为 KECCAK256 的改良 SHA3。此外,以太坊的工作证明算法 Dagger-Hashimoto 意味着内存难以计算硬件(就是对计算机性能要求很高的意思)。
为什么比特币使用双向 SHA256?
比特币使用了一种有趣的方法通过 SHA256 来散列数据,它在协议中运行算法的两次迭代。注意,这不是生日攻击的对策,很明显,如果则。替而代之,双向 SHA256 用于缓解长度扩展攻击。
本质上,这种攻击涉及攻击者知道散列输入的长度,该输入可用于通过向哈希值附加秘密字符串来欺骗哈希函数以启动其内部状态的某个部分。 SHA2 算法系列中的 SHA256 遭受了这个陷阱,比特币通过计算两次哈希来减轻它的负担。
以太坊2.0和BLAKE
SHA3 不是美国国家标准技术研究所所发起比赛中的唯一突破,虽然 ShA3 胜出了,紧随其后的 BLAKE 也同样出名。对于以太坊2.0的分块实现,更高效的哈希算法是刚需,也是研究团队非常注重的问题。BLAKE2b 算法是在竞赛中对 BLAKE 算法的改进,与 KECCAK256 相比,它在保持安全性的同时,其效率得到了极大的探索。
在现代 CPU 上计算 BLAKE2b 实际上比 KECCAK 快 3 倍。
展望未来:哈希算法的未来
似乎无论我们怎么做,无非就是增加内部哈希操作的复杂性,或者增加哈希输出的长度,希望攻击者的计算机不能足够快地有效地计算碰撞。
为了保证网络的安全性,我们依赖于单向操作前映像的模糊性。也就是说,哈希算法的安全目标是尽可能的使任意两个人都不能找到两个不同的输入使得它们的哈希值相同,尽管可能存在无数次的碰撞。
量子计算的未来呢?哈希算法安全吗?
基于现在的理解,哈希算法是经得起时间和量子计算的考验的。量子计算能够打破的是那些由基于严格的基础数学结构技巧和理论所构建的算法,比如 RSA。在另一方面,哈希算法的内部结构都不那么正式。
量子计算机的确提高了非结构化问题(比如哈希)的计算速度,但最终,它们还是会像今天的计算机一样,强行发起攻击。
不管我们为协议选择什么算法,很明显我们正走向一个计算效率更高的未来,我们必须用我们最好的判断力来选择适合这项工作的工具,以及那些有望经得起时间考验的工具。
领取专属 10元无门槛券
私享最新 技术干货