密碼學中的哈希函數、哈希碰撞、抗碰撞性(collision resistance)以及比特幣中使用的 SHA-256 的簡明介紹:
🧩 一、哈希函數(Hash Function)
定義:
哈希函數是一種將任意長度的輸入(消息)映射為固定長度輸出(哈希值,digest)的函數。
特點:
- 輸入可以是任意長度,輸出固定長度(如256位)。
- 相同輸入總是得到相同的輸出。
- 不同輸入得到相同輸出的概率極低。
- 哈希過程不可逆(不能從輸出推回輸入)。
🎯 二、哈希碰撞(Hash Collision)
定義:
當兩個不同的輸入通過哈希函數得到了相同的輸出時,就發生了哈希碰撞(collision)。
例子:
H("hello") = 0x123456...
H("world") = 0x123456... ← 碰撞
🛡? 三、抗碰撞性(Collision Resistance)
定義:
一個哈希函數是“抗碰撞的”,意味著要找到兩個不同的輸入,使得它們哈希結果相同非常困難(計算上不可行)。
哈希函數的安全性主要包括三個方面:
- Preimage Resistance(單向性): 給定 H(x),難以找出 x。
- Second Preimage Resistance(第二原像抵抗): 給定 x1 和 H(x1),難以找出 x2 ≠ x1 使得 H(x1) = H(x2)。
- Collision Resistance(抗碰撞性): 難以找到任何 x1 ≠ x2,使得 H(x1) = H(x2)。
🪙 四、比特幣中的 SHA-256
SHA-256: 是 Secure Hash Algorithm 2(SHA-2)系列中的一種,由 NSA 設計,輸出長度為 256 位(32 字節)。
用途:
- 挖礦(Proof of Work):
- 挖礦者需要找到一個 nonce,使得
SHA256(SHA256(BlockHeader))
的結果小于某個目標值。
- 挖礦者需要找到一個 nonce,使得
- 交易哈希(Transaction Hashing):
- 每筆交易都會被哈希成一個唯一 ID。
- 區塊哈希(Block Hashing):
- 整個區塊頭部被雙重哈希生成 block hash,用作區塊標識。
- Merkle Tree 構建:
- 每個交易被哈希,然后兩兩組合再次哈希,最終得到 Merkle Root,作為區塊頭的一部分。
比特幣挖礦核心:
找一個 nonce,使得
SHA256(SHA256(BlockHeader)) < Target
📌 示例:SHA-256 哈希
echo -n "hello" | openssl dgst -sha256
# 輸出:2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824