什么是密码学哈希?
密码学哈希是一种把数据转换成固定长度摘要的计算方法。无论输入是一句话还是一个大文件,只要使用同一种哈希算法,就会得到该算法规定长度的结果,这个结果称为哈希值或摘要。
它很像数据的“指纹”:输入不变,算出的哈希值就不变;输入哪怕只改动一个字符,结果通常也会明显不同。因此,别人可以重新计算哈希值,检查自己拿到的数据是否与原数据一致,而不必逐字比较全部内容。
这个比喻也有边界。哈希值不是数据的缩写,不能用它还原原文;它也不是绝对唯一编号。安全的密码学哈希追求的是让反推输入或故意找到相同结果在计算上极其困难,而不是从数学上保证碰撞永远不会发生。
哈希计算的输入与输出
哈希算法处理的是一串确定的二进制数据。文字、图片或交易在计算前都要先转换成字节;字符编码、字段顺序,或者把结构化信息按规则排列成字节的方式不同,输入就不同,结果也会不同。这个排列过程通常称为序列化。
以 SHA-256 为例,它总是输出 256 位,也就是 32 字节。哈希值经常写成 64 个十六进制字符,方便人和软件显示。下面两个输入只差一个字母的大小写,但结果完全不同:
| 输入 | SHA-256 哈希值 |
|---|---|
hello |
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824 |
Hello |
185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969 |
相同输入会稳定得到相同结果,所以不同参与者可以独立验证。结果变化明显,则便于发现输入发生过变化。但仅凭“看起来随机”不能判断一个算法是否安全;安全性还取决于算法能否抵抗特定攻击。
密码学哈希的三项重要性质
密码学哈希通常需要让以下三件事在现实计算条件下难以完成:
- 已知一个哈希值,难以找到能够产生该结果的输入,这称为原像抗性。通俗地说,不能把哈希值当成可直接解码的压缩文件。
- 已知一份输入,难以再找到另一份不同输入,使两者得到相同哈希值,这称为第二原像抗性。
- 难以找到任意两份不同输入,使它们得到相同哈希值,这称为碰撞抗性。
因为可能的输入数量远多于固定长度的输出数量,碰撞在数学上一定存在。安全目标不是消灭碰撞,而是让攻击者无法在可行成本内找到可利用的碰撞。
“难以反推”也不表示哈希能隐藏所有秘密。如果输入范围很小或容易猜,例如常见密码,攻击者可以逐个尝试候选值并比较结果。因此,保存密码通常需要专门的密码哈希方案,还要混入每条记录各自的随机数据(盐值),并设置每次猜测所需计算量(成本参数)。不能只对密码做一次普通快速哈希。
哈希、加密、数字签名和校验和的区别
这几种技术都可能用于处理或检查数据,但解决的问题不同:
| 方法 | 主要作用 | 能否恢复原数据 | 是否需要密钥 |
|---|---|---|---|
| 密码学哈希 | 生成数据摘要,帮助检查完整性或构建其他密码学机制 | 设计目标是不从摘要反推输入 | 普通哈希不需要 |
| 加密 | 防止未获授权的人读取内容 | 持有正确密钥时可以解密 | 需要 |
| 数字签名 | 证明持有相应私钥的一方授权了特定数据,并检查数据是否被改动 | 签名不是用来恢复原数据的 | 签名和验证使用密钥对 |
| 普通校验和 | 发现传输或存储中的意外错误 | 不能据此恢复原数据 | 通常不需要 |
哈希本身不能证明是谁创建了数据。数字签名系统通常先计算数据摘要,再让私钥对与该数据相关的结果进行签名;验证者还需要公钥和签名规则,才能检查授权关系。普通校验和则主要防止偶然损坏,通常不能抵抗攻击者有意修改数据。
区块链如何使用哈希
区块链不会只靠一个哈希值维护账本。哈希通常与数字签名、网络验证、共识和数据结构一起使用,承担以下任务。
标识交易或其他数据
部分网络会根据按照协议格式排列好的交易数据计算标识符。例如,Bitcoin 交易标识符(TXID)来自交易序列化数据的哈希。只要参与者使用相同规则处理相同数据,就能独立算出相同标识符。
不过,“交易哈希”不是所有网络都采用同一算法或同一输入格式的通用编号。网络名称、算法和序列化规则都是含义的一部分,只复制一串字符可能不足以唯一说明对象。
连接区块并发现历史改动
区块可以保存前一个区块头的哈希。前一块的数据发生变化时,其哈希也会变化,后续区块保存的值便不再匹配。Bitcoin 区块头和 Ethereum 区块都包含指向前序区块的哈希信息。
这种连接让历史改动容易被发现,但不会从物理上阻止任何人重新计算哈希。要判断网络最终接受哪段历史,还需要验证规则、共识机制和参与者对网络状态的判断。
汇总大量数据并提供包含证明
默克尔树等数据结构会逐层组合并哈希多项数据,最后得到一个根哈希。验证者可以用较少的中间哈希检查某项数据是否包含在已承诺的数据集合中,而不必每次传输全部内容。Ethereum 的默克尔帕特里夏树就是一种使用哈希连接状态数据的结构。
根哈希只能说明“给定数据与这份密码学承诺是否一致”。它不能证明输入信息来自可信来源,也不能证明链外事件真实发生。
参与工作量证明
在工作量证明系统中,参与者反复调整候选区块中的数据并计算哈希,寻找符合协议难度条件的结果。其他节点可以快速检查结果是否达标。哈希在这里提供可重复计算的难题和验证结果,但由谁的区块被网络接受,仍由完整的共识规则决定。
哈希算法不能随意互换
SHA-256、SHA-3 和其他密码学哈希是不同算法系列。即使两种算法都输出 256 位,对同一输入也不会得到相同结果。协议或文件校验说明必须同时给出算法名称和输入处理方式,不能只写“计算一个哈希”。
常见的安全哈希算法包括 SHA-2 和 SHA-3 两个系列。美国国家标准与技术研究院(NIST)的安全哈希标准收录 SHA-2 系列,SHA-3 标准收录 SHA-3 系列。算法名称相近也不代表实现细节相同。系统应使用其协议明确要求且仍适合当前用途的算法,不能因为旧算法仍能输出结果,就认为它仍满足安全要求。
常见问题
哈希值能够解密吗?
不能把普通密码学哈希“解密”,因为哈希不是加密,也没有对应的解密密钥。攻击者可能通过猜测输入、穷举较小的输入空间或利用算法弱点找到匹配值,但这不是从摘要直接还原原文。
两份数据的哈希值相同,内容就一定相同吗?
不能说数学上绝对相同,因为固定长度输出必然允许碰撞。使用仍具备足够碰撞抗性的算法,并确认双方采用相同编码和计算规则时,相同哈希值通常可以作为数据一致的强证据。
看到哈希值就能确认文件安全吗?
不能。你还需要知道预期哈希值来自哪里。如果文件和页面上的哈希值都由攻击者替换,重新计算后仍可能“匹配”。哈希能检查数据与某个已知摘要是否一致,但摘要本身必须通过可信渠道获得。
区块链使用哈希,就代表链上信息一定真实吗?
不代表。哈希可以帮助检查数据是否变化以及不同数据结构是否匹配,却不能判断输入内容是否描述了真实世界。数据来源、签名授权、网络验证和共识仍需分别判断。
相关词条
参考来源
- NIST:密码学哈希函数定义——固定长度摘要、原像抗性、第二原像抗性和碰撞抗性。
- NIST FIPS 180-4:安全哈希标准——SHA-2 系列、摘要长度与完整性用途。
- NIST FIPS 202:SHA-3 标准——SHA-3 系列及其与 SHA-2 的关系。
- NIST SP 800-63B:密码验证器——密码哈希方案、盐值和成本参数。
- Bitcoin Developer Reference:交易——交易序列化数据与 TXID。
- Bitcoin Developer Reference:区块链——前一区块头哈希、默克尔根和工作量证明。
- Ethereum.org:区块——前序区块哈希与状态、交易等根哈希。
- Ethereum.org:默克尔帕特里夏树——哈希连接的数据结构和包含证明。









