哈希函数:数据安全的基石
哈希函数,简单来说,就是把任意长度的输入转换成固定长度的输出的过程。这就像一个神奇的转换器,无论你输入什么,它都能给你一个特定大小的“摘要”。 这其中的奥秘在于数学公式,也就是我们所说的哈希算法。
虽然并非所有哈希算法都涉及加密技术,但所谓的加密哈希函数却是加密货币的核心。正是有了它们,区块链和其他分布式系统才能实现高水平的数据完整性和安全性。 这就好比给重要的文件盖上一个独一无二的印章,一旦文件被篡改,印章就会失效。
无论是传统的哈希函数还是加密哈希函数,都具有确定性。这意味着只要输入不变,哈希算法就会始终产生相同的输出(也称为摘要或哈希值)。 这就像一个精确的计算器,同样的算式,永远得到同样的结果。
通常,加密货币的哈希算法被设计成单向函数,这意味着在没有大量计算时间和资源的情况下,很难反向推导出输入。说白了,由输入得到输出很容易,但反过来却很难。 这就像一把只能开锁,却无法反向制造钥匙的特殊钥匙。一般来说,越难找到输入,哈希算法就被认为越安全。
哈希函数是如何工作的呢?
不同的哈希函数会产生不同大小的输出,但每个哈希算法的可能输出大小总是恒定的。例如,SHA-256算法只能产生256位的输出,而SHA-1算法总是生成160位的摘要。
让我们用SHA-256算法(比特币中使用的算法)来处理“Binance”和“binance”这两个词为例:
SHA-256 | |
Input | Output (256 bits) |
Binance | f1624fcc63b615ac0e95daf9ab78434ec2e8ffe402144dc631b055f711225191 |
binance | 59bba357145ca539dcd1ac957abc1ec5833319ddcae7f5e8b5da0c36624784b2 |
注意,一个微小的变化(首字母的大小写)导致了完全不同的哈希值。但由于我们使用的是SHA-256,输出始终具有256位(或64个字符)的固定大小——无论输入大小如何。此外,无论我们多少次运行这两个词通过算法,这两个输出都将保持不变。
相反,如果我们通过SHA-1哈希算法运行相同的输入,我们将得到以下结果:
SHA-1 | |
Input | Output (160 bits) |
Binance | 7f0dc9146570c608ac9d6e0d11f8d409a1ee6ed1 |
binance | e58605c14a76ff98679322cca0eae7b3c4e08936 |
值得注意的是,缩写SHA代表安全哈希算法。它指的是一组加密哈希函数,包括SHA-0和SHA-1算法以及SHA-2和SHA-3组。SHA-256是SHA-2组的一部分,还有SHA-512和其他变体。目前,只有SHA-2和SHA-3组被认为是安全的。
它们为什么重要?
传统的哈希函数有广泛的用途,包括数据库查找、大型文件分析和数据管理。另一方面,加密哈希函数广泛用于信息安全应用,例如消息认证和数字指纹。对于比特币而言,加密哈希函数是挖掘过程的重要组成部分,还在生成新地址和密钥中发挥作用。
哈希的真正威力在于处理海量信息时。例如,人们可以将大型文件或数据集通过哈希函数运行,然后使用其输出快速验证数据的准确性和完整性。这是因为哈希函数的确定性:输入总是会产生简化、浓缩的输出(哈希)。这种技术消除了存储和“记住”大量数据的需要。
在区块链技术中,哈希尤其有用。比特币区块链有几个涉及哈希的操作,大部分都在挖掘过程中。事实上,几乎所有加密货币协议都依赖于哈希来链接和压缩交易组到区块中,并产生每个区块之间的加密链接,从而有效地创建区块链。
加密哈希函数
再次强调,部署加密技术的哈希函数可以定义为加密哈希函数。一般来说,破解加密哈希函数需要无数次的暴力尝试。对于一个人来说,“反转”一个加密哈希函数,需要通过反复试验猜测输入是什么,直到产生相应的输出。然而,也有可能不同的输入产生完全相同的输出,在这种情况下就会发生“碰撞”。
从技术上讲,加密哈希函数需要遵循三个特性才能被认为是有效的安全。我们可以将它们描述为碰撞阻力、原像阻力以及第二原像阻力。
在讨论每个属性之前,让我们用三句话总结它们的逻辑。
- 碰撞阻力:难以找到任何两个不同的输入产生相同的哈希输出。
- 原像阻力:难以“反转”哈希函数(从给定的输出中找到输入)。
- 第二原像阻力:难以找到任何第二个与指定的输入发生碰撞的输入。
碰撞阻力
如前所述,当不同的输入产生完全相同的哈希值时,就会发生碰撞。因此,哈希函数被认为是抗碰撞的,直到有人发现碰撞为止。请注意,对于任何哈希函数,碰撞总是存在的,因为可能的输入是无限的,而可能的输出是有限的。
换句话说,当找到碰撞的可能性低到需要数百万年的计算时,哈希函数就是抗碰撞的。因此,尽管没有无碰撞的哈希函数,但其中一些足够强大,可以被认为是抗碰撞的(例如,SHA-256)。
在各种SHA算法中,SHA-0和SHA-1组不再安全,因为已经发现了碰撞。目前,SHA-2和SHA-3组被认为是抗碰撞的。
原像阻力
原像阻力特性与单向函数的概念有关。当有人找到生成特定输出的输入的概率非常低时,哈希函数就被认为是抗原像的。
请注意,此属性与之前的属性不同,因为攻击者将试图通过查看给定的输出来猜测输入是什么。另一方面,当有人找到两个不同的输入生成相同的输出时,就会发生碰撞,但这并不重要使用了哪些输入。
原像阻力特性对于保护数据非常有价值,因为消息的简单哈希可以证明其真实性,而无需公开信息。在实践中,许多服务提供商和网络应用程序存储和使用从密码生成的哈希值,而不是明文密码。
第二原像阻力
为了简化,我们可以说第二原像阻力介于其他两个属性之间。当有人能够找到一个特定的输入,生成另一个他们已经知道的输入的相同输出时,就会发生第二次原像攻击。
换句话说,第二次原像攻击涉及查找碰撞,但他们不是搜索生成相同哈希的两个随机输入,而是搜索生成与另一个特定输入生成的相同哈希的输入。
因此,任何抗碰撞的哈希函数也抗第二次原像攻击,因为后者总是意味着碰撞。但是,仍然可以在抗碰撞函数上执行原像攻击,因为它意味着从单个输出中找到单个输入。
挖掘
比特币挖掘的许多步骤都涉及哈希函数,例如检查余额、链接交易输入和输出,以及在一个区块内对交易进行哈希以形成默克尔树。但是,比特币区块链安全的主要原因之一是,矿工需要执行无数的哈希操作,才能最终找到下一个区块的有效解决方案。
具体来说,矿工在为其候选区块创建哈希值时必须尝试几种不同的输入。从本质上讲,只有当他们生成的输出哈希以一定数量的零开头时,他们才能验证其区块。零的数量决定了挖掘难度,它根据投入网络的哈希率而变化。
在这种情况下,哈希率表示有多少计算能力被投入到比特币挖掘中。如果网络的哈希率增加,比特币协议将自动调整挖掘难度,以便挖掘一个区块所需的时间平均保持在10分钟左右。相反,如果一些矿工决定停止挖掘,导致哈希率大幅下降,挖掘难度将被调整,使其更容易挖掘(直到平均区块时间恢复到10分钟)。
请注意,矿工不必查找碰撞,因为他们可以生成多个哈希作为有效输出(以一定数量的零开头)。因此,对于某个区块,有几种可能的解决方案,矿工只需要找到其中一种——根据挖掘难度确定的阈值。
因为比特币挖掘是一项成本密集型任务,矿工没有理由作弊,因为这会导致巨大的经济损失。加入区块链的矿工越多,区块链就越大越强。
结束语
毫无疑问,哈希函数是计算机科学中必不可少的工具,尤其是在处理海量数据时。当与密码学结合时,哈希算法可以非常通用,以多种不同的方式提供安全性和身份验证。因此,加密哈希函数对于几乎所有加密货币网络都至关重要,因此,对于任何对区块链技术感兴趣的人来说,了解其属性和工作机制肯定是有帮助的。