哈希算法的过去、现在和未来
在了解区块链时,初学者常听到的关键词之一就是哈希和哈希算法这是个无处不在的有关安全性的概念。运行在通过 p2p 连接数万个节点,具有“无需信任”和验证效率的分布式网络和共识机器中,如比特币或以太网网络。也就是说,这些系统需要将信息编码成短的紧凑的格式,以便其参与者能够安全、快速地进行验证。
比特币和以太坊处理的主要原语是块的概念,块是包含事务、时间戳和其他重要元数据的数据结构。其安全性的一个关键部分是能够将关于网络全局状态的大量信息压缩成一个简短的可以有效验证的被称为哈希的消息。
即使更改输入中的一个字符也会产生完全不同的哈希值!从密码存储到文件验证系统,加密哈希的使用无处不在。基本思想是使用确定性算法,该算法接收一个输入并每次产生固定长度的字符串。也就是说,使用相同的输入将总是导致相同的输出。不仅仅是决定论对哈希很重要,而且改变输入中的 一位 也将产生 完全不同的哈希值。哈希算法的一个问题是碰撞的必然性。也就是说,哈希是固定长度字符串的事实意味着对于我们可以想象的每个输入,还有其他可能的输入将导致相同的哈希。 碰撞是很糟糕的事情。 这意味着如果攻击者能够按需创建碰撞,攻击者就可以为恶意文件或数据生成正确的哈希从而伪装成合法数据。一个好的哈希函数的目标是使攻击者很难找到生成相同哈希值的输入的方法。哈希计算不应该_太有效_,因为这会使攻击者更容易人为地计算碰撞。哈希算法需要抵抗“原像攻击”。也就是说,给定一个哈希值,应该极难计算回溯用于再现创建散列的值(即前映像)所采取的确定性步骤。
对于 s= hash(x),找到 x 几乎是不可能的。
总结一下,“好”哈希算法具有以下 3 个属性:
- 改变输入中的一位应产生雪崩效应并导致完全不同的哈希
- 应该具有非常低的碰撞概率
- 某种程度的效率不会牺牲抗冲击性
哈希破解
最初的哈希算法标准之一是 MD5 散列,它广泛用于文件完整性验证(校验和),并在 Web 应用程序数据库中存储散列密码。它的功能非常简单,因为它为每个输入,输出一个固定的 128 位字符串,并在几轮中使用简单的单向操作来计算其确定性输出。它的输出长度短,操作简单,使得 MD5 完全易于破解,易受所谓的 生日攻击 的影响。
什么是“生日攻击”?
曾经听说过如果把 23 个人放在一个房间里,有 50% 的可能他们中的两个会有相同的生日?如果 70 人在一个房间里,就会有 99.9% 概率。这源于我们所谓的 鸽巢原理,其粗略地说,如果有 100 只鸽子和 99 只盒子,那么将鸽子分别放入盒子,必然有 1 个盒子将共享 2 只鸽子。也就是说,固定输出约束意味着存在固定的序列,可以在其上找到碰撞。
鸽子太多了!至少一只会与另一只同在一个盒子中实际上,MD5 的抗碰撞性非常弱,因此简单的家用 2.4GHz 奔腾处理器可以在几秒钟内计算出人工哈希碰撞。此外,它在当前网络早期的广泛使用已经在线创建了大量泄露的 MD5 预映射,可以通过简单的 Google 搜索其哈希来找到。
哈希算法的多样性和演化
起点:SHA1 & SHA2
NSA(是的,NSA)长期以来一直是哈希算法标准的先驱,他们最初提出了 安全哈希算法 或 SHA1,创建了 160 位固定长度输出。不幸的是,SHA1 仅仅通过增加输出长度,单向操作的数量和这些单向操作的复杂性来改进 MD5,但是没有对强大的电脑尝试不同攻击方向提供任何根本的改进。那我们怎么能做得更好呢?