本文介绍了哈希函数在计算机和区块链中的基本原理和应用,包括哈希函数的特性(如单向性、抗碰撞性)、区块链地址的生成、交易哈希的重要性以及哈希在区块链中的多种用途。文章通过详细的解释和示例,帮助读者理解哈希技术的核心概念及其在区块链中的关键作用。
灯泡、比特与字节
你可能听说过计算机中的所有数据都是 0 或 1。最小的数据单位是一个 比特,只能是 0 或 1。想象一下计算机内部拥有许多灯泡,这些灯泡要么亮着 (1),要么熄灭 (0)。不同的数据片段通过灯泡所显示的模式表示。大数据,像视频,也使用许多灯泡。简短的电子邮件则使用较少的灯泡。一个灯泡就是一个比特。另一个你可能听说过的术语是 字节,它只是 8 个灯泡的组合。1 兆字节的数据是 100 万个字节,这样就会有 800 万个灯泡。
今天的家用计算机拥有数十亿甚至万亿个灯泡。但借助于乘法的力量,请注意,就连一组 256 个灯泡几乎足以表示宇宙中任何一个 可观察的粒子。想象一下 256 个灯泡可以产生的所有模式,其数量是天文数字:从数学上讲这是 2 的 256 次方。
密码学哈希函数
一个 哈希函数 接受任何输入,并生成一个特定大小的输出。将哈希函数应用于某些数据的过程称为 哈希。哈希函数的输出称为 哈希。特定哈希函数的基本特征是其产生的输出大小。本文的例子中,我们将使用一个生成 256 比特(32 字节)输出的哈希函数。还有用于生成较小输出的哈希函数,以及其他生成较大输出的哈希函数。也有许多生成 256 比特输出的哈希函数,但这些示例并不在意使用的是哪一个特定的函数。
使用示例哈希函数,当对一个许多兆字节的视频进行哈希时,输出将是 256 个灯泡,其中有些灯泡发光。当对一封简短电子邮件进行哈希时,输出将是 256 个灯泡的不同模式。在某种程度上,哈希看起来像是压缩。简单来说,两者之间的区别在于,哈希始终会生成相同数量的灯泡,而压缩一个许多兆字节的视频仍然会生成数百万个灯泡。压缩视频可以被解压,以获得原始视频。当一个视频被哈希为仅 256 个灯泡时,从哈希中重建原始视频的许多兆字节是非常不可能的。这听起来可能不是期望的结果,但这种行为实际上是哈希函数的一个强大特性。
安全密码学哈希函数的一个关键特性是它是单向的。这意味着,从输出中几乎不可能,或者数学和计算上极不可能,确定输入是什么。也就是说,给定一个哈希,学习或找到提供给哈希函数的输入数据应该是不可行的。这个技术术语称为 预映像抗性。
其后果是,哈希函数应该消耗大约相同的时间,无论是对大输入还是小输入进行哈希。另一个理想结果是哈希,由哈希函数生成的灯泡模式,看起来应该是随机的。对数据“password1”进行哈希应该会产生一个与对数据“password2”进行哈希非常不同的灯泡模式。否则,如果这些模式相似,攻击者可能会推测输入相似,并且如果发现任意相关词(如“pass”、“word”),就很容易找到密码。安全哈希函数会生成截然不同的输出,即使输入只相差一个比特。
出于安全考虑,理想的行为是,给定一个哈希,找到输入数据的唯一方法是对所有输入组合进行哈希,直到哈希出正确的输入。如果输入是随机的,找到它将需要不确定的时间,因此实际上是“不可能的”。
虽然找到哈希的输入应该是非常困难且耗时极长,但计算哈希应该是快速的。可以提供一个非常大的输入给哈希函数,依然在不到一秒的时间内得到输出。考虑到 今天的智能手机 每秒执行数十亿次计算,1秒在计算上是很长的时间。
密码学哈希函数也应该是 抗碰撞 的。碰撞是指哈希函数为多个输入产生相同输出的情况。如果对 data1(可能是电子表格)进行哈希,并且对 data2(可能是图片)进行哈希,产生相同的输出,那么就发生了碰撞。
安全密码学哈希函数属性的重要性将随着我们对区块链和哈希的描述而愈加显现。
区块链与哈希
哈希在区块链中被广泛使用,以下是一些例子。
区块链上的地址是通过哈希公钥的过程得出的。以太坊账户是通过用 Keccak-256 哈希公钥计算得出的(开发人员应 阅读与 SHA3–256 的重要区别)。一个 比特币地址 是通过用 SHA2–256 和 RIPEMD160 哈希公钥计算得出的。
哈希函数的抗碰撞性非常重要,因为如果两个人生成了相同的地址(碰撞),那么他们都可以花费发送到该地址的资金。
签名是区块链的一个基本部分。类似于签署支票,密码学签名确定了哪些交易是有效的。签名是从待签名数据的哈希和私钥生成的。
交易哈希在区块链中极为显眼。与其将交易描述为“在日期 D 和时间 T 时 Alice 向 Bob 发送 X 单位货币的交易”,不如通过其哈希来引用交易。例如, 5c504ed432cb51138bcf09aa5e8a410dd4a1e204ef84bfed1be16dfba1b22060 是以太坊区块链中的一笔交易。相比于像“区块 1337 中第 1024 笔交易”这样的描述,交易哈希使用起来更直接。只需复制哈希并将其粘贴到区块链浏览器中,即可查看该交易的详细信息。
在形而上学上,区块链中的块是通过它们的哈希进行识别,哈希同时充当 身份识别和完整性验证 的双重目的。一个既提供自身完整性的识别字符串称为自证标识符。
对于使用挖矿的区块链,工作量证明是一个数字,称为 nonce,当与其他数据结合并哈希时,生成的值小于指定目标。挖矿充分利用了哈希是快速单向且不可逆的特性。找到一个有效的 nonce 需要时间,因为没有线索可以指向足够小的哈希,找到比目标小的唯一途径是计算许多哈希:在比特币中, 目前超过 10 septillion 个哈希。当找到一个有效的 nonce 时,验证过程在一秒内完成,然后新块在网络中传播,形成最新的共识和区块链。
由于区块链中的存储是永久性的,并且在区块链上存储大量数据并不经济,因此在区块链上存储数据的实际方式是存储数据的固定(且通常较小)尺寸的表示,称为“数据的哈希”。区块链的一种用途是作为时间戳服务。假设有一张照片,你想证明它目前存在,且在未来不会造假。你可以现在将这张照片存储到区块链上,而一年后,如果法官问这张照片是否确实是一年前拍的,你可以在区块链上展示它。但是,由于你了解哈希,你将对图片进行哈希,然后将哈希存储在区块链上。当法官要求提供证据时,你提供照片,然后法官可以对照片进行哈希,并将其与存储在区块链上的哈希进行比较。
还有更复杂的例子涉及哈希的使用,例如在 梅克尔树 中,这是区块链、可扩展性以及移动和轻钱包创新的根基。
安全地识别任何事物的哈希
安全的密码学哈希函数是单向的、计算快速且抗碰撞的。结合它们处理任何类型输入以生成固定大小输出(称为哈希)的特性,哈希非常适合作为任何数据的标识符。长度为 256 比特的哈希表示天文数量的组合,足以作为物联网的全球唯一标识符,即使在纳米技术的规模及其更高层级上也绰绰有余。而这些哈希可以以 64 个字符的形式表示( 十六进制),这使它们的实用性足以用作标识符。在区块链中,哈希用于标识块、交易和地址。
哈希具有安全性和隐私性的优点。如果一首歌以数字格式记录,且这首歌的哈希存储在区块链上,那么其他人无法声称他们先于产生哈希的歌曲,而不知晓这首歌本身:某人不能随便创作一首歌曲并篡改其哈希。同样,除非揭示了这首歌或其他数字化财产或数据,否则它仍然保留私密,仅在区块链上显示哈希。所有权登记可以存储在区块链上,所拥有的细节在相关方之间保持私密。举个简单的例子,车辆登记可以存储汽车数据的哈希(图片、VIN、车牌),只有车主、保险公司和政府才会知道车辆的实际细节。
在深奥的理论与广泛的实践中
设计密码学哈希函数需要艺术与科学的结合。要证明它们的安全性需要高级数学和计算机科学。区块链是首次填满哈希的用户接口,普及面广泛。良好的用户体验将在众多哈希背后隐藏,但正如我们今天看到各种身份证明和序列号一样,有时哈希是指代某事的最佳标识符,胜过冗长的描述。随着密码学和物联网等技术的广泛应用,预计未来将会更多看到 64 字符的哈希!
- 原文链接: medium.com/@Consensys/bl...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!