SHA-256 是整个比特币系统最底层的密码学基石。从区块哈希、交易ID、默克尔树节点,到工作量证明(PoW)和地址生成,全都构建在它之上。下面我从函数定义、内部构造、安全特性、比特币中的具体用法这几个维度来拆解。
1. 什么是 SHA-256
SHA-256 (安全哈希算法 256 位)是美国国家安全局(NSA)设计、NIST 于 2001 年发布的 SHA-2 家族 一员。它接收任意长度 的输入消息,输出一个 256 位(32 字节) 的固定长度摘要,通常表示为 64 个十六进制字符。
密码学哈希函数的必备属性:
- 单向性(抗原像) :给定哈希值
h,无法反推m。 - 抗第二原像 :给定
m1,找不到不同的m2使hash(m1)=hash(m2)。 - 抗碰撞 :找不到任意两个不同的
m1、m2使哈希相等。 - 雪崩效应:输入即使改变 1 比特,输出也有约一半比特翻转,毫无相关性。
SHA-256 在整个区块链里,扮演的是数据指纹机 和随机性预言机的角色。
2. 算法内部构造
SHA-256 的本质是一个逐块迭代的压缩函数,处理过程分为预处理和主循环。
2.1 消息预处理(填充)
消息被划分成 512 比特的块。对于最后一块,会进行特定填充:
填充后消息 = 原始消息 || 1 || 000...000 || 原始长度(64位)
- 先补一个
1,后面补0,直到总比特数模 512 余 448。 - 最后 64 位填入原始消息的比特长度(大端序)。
- 这样保证每个消息块恰好 512 位。
2.2 初始化向量(IV)
8 个 32 位初始哈希值,取自前 8 个素数的平方根小数部分的前 32 位:
H0 = 0x6a09e667 H1 = 0xbb67ae85 H2 = 0x3c6ef372 H3 = 0xa54ff53a
H4 = 0x510e527f H5 = 0x9b05688c H6 = 0x1f83d9ab H7 = 0x5be0cd19
2.3 压缩函数主循环
对每个 512 位消息块,把上一块的哈希状态(或 IV)作为输入,经过 64 轮迭代更新状态。最终状态即为当前块的哈希,并作为下一块的输入链式传递。
消息扩展(Message Schedule):
将 512 位块拆成 16 个 32 位字 W[0..15],然后通过递归生成 64 个字 W[0..63]:
W[t] = σ1(W[t-2]) + W[t-7] + σ0(W[t-15]) + W[t-16] (16 ≤ t ≤ 63)
其中 σ0 和 σ1 是右下方向的旋转异或操作:
σ0(x) = ROTR7(x) ⊕ ROTR18(x) ⊕ SHR3(x)
σ1(x) = ROTR17(x) ⊕ ROTR19(x) ⊕ SHR10(x)
64 轮压缩:
每轮使用一个 32 位常量 K[t](取自前 64 个素数的立方根小数部分),并对工作变量 A~H 执行:
T1 = H + Σ1(E) + Ch(E,F,G) + K[t] + W[t]
T2 = Σ0(A) + Maj(A,B,C)
H = G
G = F
F = E
E = D + T1
D = C
C = B
B = A
A = T1 + T2
使用的逻辑函数:
- Ch(E,F,G) (选择):
(E & F) ⊕ (~E & G)------ 按 E 的比特选择 F 或 G。 - Maj(A,B,C) (多数):
(A & B) ⊕ (A & C) ⊕ (B & C)------ 三个输入中多数为 1 的比特位。 - Σ0(A) :
ROTR2(A) ⊕ ROTR13(A) ⊕ ROTR22(A) - Σ1(E) :
ROTR6(E) ⊕ ROTR11(E) ⊕ ROTR25(A)
每轮使用一个轮常量 K[t] 和扩展后的消息字 W[t],混合后更新工作变量,8 个工作变量加上原来状态的 8 个哈希值,就完成了该消息块的压缩。
2.4 输出
当所有 512 位消息块处理完毕后,将最终的 8 个 32 位状态变量 A~H 拼接,得到 256 位摘要,这就是 SHA-256 的输出。
3. 安全特性与雪崩效应
雪崩效应极强:
- 输入哪怕只翻转 1 比特,约 50% 的输出比特会改变,且变化模式与输入无任何关联。
- 这保证了挖矿过程的无捷径性:矿工只能完全随机地尝试修改 Nonce,无法预测哈希结果离目标还有多远,也无法定向"靠近"目标。
安全性(截至 2025 年):
- 目前对完整 64 轮的 SHA-256,没有发现有效的碰撞攻击或原像攻击。
- 唯一的理论威胁来自通用量子算法(Grover's algorithm),可在约 2^128 次操作找到原像,但目前距离具备破解能力的量子计算机还很遥远。
- 比特币社区已预留升级路径(如基于 SHA-256 的变体或后量子签名),但 SHA-256 本身在现阶段仍被视为非常坚固。
4. 比特币中"双重 SHA-256"的特殊设定
比特币几乎所有地方都使用 dSHA256 ,即 SHA256(SHA256(x))。这个习惯来自中本聪的设计,有几个重要意图:
- 防长度扩展攻击:普通 SHA-256 基于 Merkle-Damgård 结构,存在"长度扩展"漏洞。双重哈希后,攻击者无法利用内部状态伪造有效的数据后缀。
- 额外安全余量:多一层哈希可降低因 SHA-256 某种弱化(如碰撞发现)导致的直接冲击。
- 交易 ID 与区块哈希的统一:两者都用 dSHA256,简化验证逻辑。
关键应用点:
- PoW 挖矿:80 字节区块头做 dSHA256,结果必须小于当前网络难度目标。
- 区块哈希:每个区块的唯一标识符就是区块头的 dSHA256。
- 交易 ID:序列化交易的 dSHA256 作为 txid。
- 默克尔树:所有树节点哈希值都是子节点数据拼接后的 dSHA256。
- 比特币地址:公钥 → SHA-256 → RIPEMD-160 → ...,SHA-256 是中间的第一道屏障。
5. 总结
SHA-256 在比特币中不是一个辅助工具,而是信任引擎的物理燃料。它把任意数据映射成仿佛完美随机的数字指纹,赋予整个系统不可篡改、可轻量验证、不可伪造的特性。理解了 SHA-256 的单向性和雪崩效应,你就明白了为什么寻找一个合适 Nonce 是纯粹的概率过程、为什么修改历史便需要重做所有后续区块的工作量------这正是比特币"数字黄金"安全性的根基。