哈希运算是从可变大小的输入生成固定大小的输出的过程。该过程通过称为“哈希函数”(以哈希运算算法实现)的数学公式完成。
并非所有哈希函数都涉及到运用密码学,但“加密哈希函数”却是加密货币的核心。得益于加密哈希函数,区块链和其他分布式系统的数据完整性和安全性才能达到较高水平。
传统哈希函数与加密哈希函数均具有确定性。确定性指的是只要输入不更改,哈希运算算法将始终生成相同的输出(也称为“摘要”或“哈希值”)。
通常情况下,加密货币的哈希运算算法均设计为单向函数,这意味着如果没有大量计算时间和资源,这些函数无法轻易恢复。换言之,从输入创建输出极为容易,但反向从输出生成输入则相对困难。总体而言,越难找到输入,哈希运算算法就越安全。
哈希函数如何运作?
不同的哈希函数生成大小不一的输出,但每个哈希运算算法的输出大小始终不变。例如,SHA-256算法只能生成256位的输出,而SHA-1始终生成160位的摘要。
为说明这一点,我们通过SHA-256哈希运算算法(比特币中使用的算法)运行“Binance”和“binance”这两个词。
SHA-256 | |
输入 | 输出(256位) |
Binance | f1624fcc63b615ac0e95daf9ab78434ec2e8ffe402144dc631b055f711225191 |
binance | 59bba357145ca539dcd1ac957abc1ec5833319ddcae7f5e8b5da0c36624784b2 |
请注意,首字母大小写的微小改动都会生成完全不同的哈希值。不论输入数值的长短,使用SHA-256的输出始终保持256位(或64个字符)的固定长度。此外,无论算法运行这两个词多少次,二者的输出都保持不变。
相反,如果通过SHA-1哈希运算算法运行同样的输入,得到的结果如下:
SHA-1 | |
输入 | 输出(160位) |
Binance | 7f0dc9146570c608ac9d6e0d11f8d409a1ee6ed1 |
binance | e58605c14a76ff98679322cca0eae7b3c4e08936 |
请注意,“SHA”是安全哈希算法(Secure Hash Algorithms)的首字母缩写。该算法指的是一组加密哈希函数,其中包括SHA-0和SHA-1算法,以及SHA-2和SHA-3组。SHA-256与SHA-512及其他变体均为SHA-2组的一部分。目前只有SHA-2和SHA-3组被认为是安全的。
哈希函数的重要性何在?
传统哈希函数拥有丰富用例,包括数据库查找、大文件分析以及数据管理。加密哈希函数则广泛用于信息安全应用,例如消息验证和数字指纹。就比特币而言,加密哈希函数是挖矿过程中不可或缺的一部分,同时影响新地址和密钥生成。
哈希运算在处理海量信息时才发挥真正威力。例如,通过哈希函数运行大文件或数据集,然后利用其输出即可快速验证数据的准确性和完整性。哈希函数具有确定性,因此行之有效:输入始终能生成压缩过的简化输出(即哈希值)。这种技术消除了存储和“记忆”大量数据的必要。
哈希运算在区块链技术领域尤为实用。比特币区块链有多处涉及哈希运算的操作,其中大多数都在挖矿过程中。事实上,几乎所有加密货币协议都依靠哈希运算来连接交易组并压缩至区块中,同时在各个区块间生成加密链接,有效创建区块链。
加密哈希函数
同样,部署加密技术的哈希函数可以定义为加密哈希函数。一般来说,破解加密哈希函数需要无数次蛮力尝试。如需“还原”加密哈希函数,就要反复试错猜测输入,直至生成相应的输出。但是,不同的输入也有可能生成完全相同的输出,这样就会发生“冲突”。
从技术上讲,加密哈希函数需具备三种属性,才算有效保障安全。三大属性分别为抗冲突性、抗原像性和抗第二原像性。
在分别讨论每种属性之前,先简要总结一下各属性的逻辑。
- 抗冲突性:任意两个不同的输入不可能生成相同的哈希值输出。
- 抗原像性:不可能“还原”哈希函数(即无法从给定输出找到输入)。
- 抗第二原像性:不可能找到与特定输入发生冲突的另一个输入。
抗冲突性
如前所述,不同的输入生成完全相同的哈希值时就会发生冲突。因此,只要没人发现冲突,哈希函数就视为具有抗冲突性。请注意,由于可能的输入无限,而可能的输出有限,因此哈希函数始终存在冲突。
假设发现冲突的可能性低至需以数百万年计算,则可以说,哈希函数具有抗冲突性。因此,现实中虽然没有不冲突的哈希函数,但只要其中一些(例如SHA-256)足够强大,就视为具有抗冲突性。
在各种SHA算法中,SHA-0和SHA-1组出现过冲突,所以不再安全。目前SHA-2和SHA-3组被认为具有抗冲突性。
抗原像性
抗原像性属性与单向函数概念有关。假设找出生成特定输出的输入概率极低,则可认为哈希函数具有抗原像性。
请注意,攻击者会查看给定输出来猜测输入,因此该属性与抗冲突性有所不同。而且,两个不同的输入生成相同的输出就会产生冲突,但是使用哪个输入其实并不重要。
抗原像性属性对保护数据很有价值,其原因是无需披露信息,消息的简单哈希值即可证明其真实性。在实际运用中,许多服务供应商和网络应用存储和使用由密码生成的哈希值,而非明文形式的密码。
抗第二原像性
简言之,抗第二原像性介于上述两种属性之间。假设有人能找出特定的输入,该输入生成的输出与已知的另一输入的输出相同,则会发生第二原像攻击。
换言之,第二原像攻击与找出冲突相关,但并非搜索生成相同哈希值的两个随机输入,而是在已知特定输入的情况下,搜索生成相同哈希值的另一个输入。
第二原像攻击通常意味着存在冲突。因此,任何抗冲突的哈希函数同样能抵抗第二原像攻击。但是,函数具有抗冲突性意味着能从单一输出中找出单一输入,因此攻击者仍可向抗冲突性的函数发起原像攻击。
加密货币挖矿
比特币挖矿中多个步骤用到哈希函数,例如查看余额、连接交易输入和输出,以及哈希运算同个区块内的交易以形成默克尔树。但是,比特币区块链安全的主要原因之一是,矿工需要执行无数哈希运算操作,才能最终找出下一个区块的有效解决方案。
具体而言,矿工在创建候选区块哈希值时必须尝试若干不同的输入。从本质上讲,只有生成的输出哈希值以一定数量的零开头,矿工才能验证区块。零的数量决定挖矿难度,并随着专用于网络的哈希率变化而变化。
在这种情况下,哈希率代表投入比特币挖矿的算力大小。如果网络的哈希率增加,比特币协议将自动调整挖矿难度,使得出块所需的平均时间保持在近10分钟。相反,若多名矿工决定停止挖矿,导致哈希率大幅下降,则挖矿难度调低,直至平均出块时间恢复到10分钟。
请注意,矿工能生成多个哈希值作为有效输出(以一定数量的零开头),因此他们无需查找冲突。一个区块有多种可能的解决方案,但取决于挖矿难度阈值,矿工只须找到其中一种解决方案。
比特币挖矿是一项高成本任务,矿工没有必要欺骗系统,那样反而会造成重大经济损失。加入区块链的矿工越多,区块链规模越大,也越强大。
总结
毫无疑问,哈希函数是计算机科学中必不可少的工具,其处理海量数据的能力尤为出众。与密码学相结合,哈希运算算法能发挥广泛用途,以各种方式保障安全和提供身份验证。对于几乎所有加密货币网络而言,加密哈希函数至关重要。因此,若对区块链技术感兴趣,了解加密哈希函数属性与运行机制必将大有裨益。