﻿---
title: "密碼學雜湊函數"
description: "一份以驗證為重點的密碼學雜湊函數指南，涵蓋安全性質、位元組編碼、SHA-2、SHA-3、Keccak、區塊鏈用途與實作風險。"
image: "https://wiki.fcontext.com/og.png"
---

> Documentation Index
> Fetch the complete documentation index at: https://wiki.fcontext.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 密碼學雜湊函數

> 僅供教育用途，不構成投資或密碼學實作建議。摘要相符本身並不能證明真實性、所有權、授權、最終性或資料可用性。

<a id="answer"></a>

## 直接回答

密碼學雜湊函數以確定性的方式，將以位元組表示的訊息映射為具有規定輸出長度的摘要。對於輸出長度固定為 `n` 位元的雜湊函數，基本關係為：

`h = H(m), where h is in {0,1}^n`

相同的位元組和演算法會產生相同的摘要。輸入改變一個位元，應當會以不可預測的方式改變許多輸出位元，但這種雪崩效應並不是安全性的定義。主要安全目標是**原像抗性**（給定一個摘要，找到能產生該摘要的輸入在計算上不可行）、**第二原像抗性**（給定一個輸入，找到與它摘要相同的另一個輸入在計算上不可行）和**碰撞抗性**（找到摘要相同的任意兩個不同輸入在計算上不可行）。

雜湊不是加密：它沒有解密金鑰，也不保證可以還原輸入。由於無限多個可能的訊息會被映射到有限的輸出空間，碰撞必然存在；安全性意味著，對所選演算法和輸出長度而言，找到可利用的碰撞在計算上不可行。

摘要本身也不提供真實性保證。只有預期摘要和演算法透過可信管道取得時，重新計算檔案雜湊才能據此發現不一致。協定會將雜湊與簽章、訊息鑑別碼、經驗證資料結構、共識規則或工作量證明結合起來，從而獲得更強的保證。

<a id="mechanism"></a>

## 運作方式

1. **明確定義確切的位元組。** 文字編碼、大小寫、空白、欄位順序、整數表示、長度前綴和序列化方式都會影響 `m`。協定必須規定標準編碼，並將雜湊綁定到特定的演算法、版本、網路和用途。
2. **執行指定的建構。** SHA-256 會對長度受限的訊息進行預處理，將其分塊，並反覆更新內部狀態。SHA3-256 使用以 KECCAK 為基礎的海綿建構。兩者都回傳 256 位元摘要，但它們是不同的函數，輸出不能互換。
3. **依所需性質理解安全性。** 對於理想的 `n` 位元雜湊函數，通用原像搜尋大約需要 `2^n` 次計算，而由於生日效應，通用碰撞搜尋大約需要 `2^(n/2)` 次計算。如果演算法已被破解、摘要遭到截短或周邊協定存在缺陷，僅看輸出長度並不足以判斷安全性。
4. **圍繞摘要建構協定。** 數位簽章方案可以對訊息的摘要簽署；HMAC 加入祕密金鑰來實現訊息鑑別；默克爾樹用一個根對許多葉節點作出承諾；工作量證明則反覆對候選區塊標頭進行雜湊，直到摘要符合目標值。這些建構提供的保證各不相同。
5. **使用區塊鏈指定的確切函數。** 比特幣區塊標頭和默克爾節點按規定的位元組順序使用雙重 SHA-256。以太坊執行層使用標準化前 KECCAK 設計中的 Keccak-256，而不是標準化的 SHA3-256。因此，「256 位元雜湊」這樣的標籤不足以用於驗證。
6. **先驗證情境，再解讀含義。** 檢查預期摘要的來源、演算法識別碼、位元組編碼、網域或區塊鏈、所引用的區塊和狀態、確認狀態以及是否存在截短。在錯誤的情境中計算正確，驗證仍然失敗。

<a id="example"></a>

## 範例解析

- **輸入的微小變化。** 五個 UTF-8 位元組 `hello` 的 SHA-256 是 `2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824`。將第一個位元組替換為大寫 `H` 後，結果是 `185f8db32271fe25f561a6fc938b2e264306ec304eda518007d1764826381969`。摘要不同並不會透露究竟是哪個位元組發生了變化。
- **在不同攻擊模型中，安全強度不一定等於摘要長度。** 理想的 256 位元雜湊函數提供的原像搜尋工作量約為 `2^256`，碰撞搜尋工作量則為 `2^128`。當協定依賴碰撞抗性時，這項差異十分重要，數位簽章流程通常就是如此。
- **默克爾證明只針對某一個根來驗證包含關係。** 驗證者按規定順序，將經過編碼的葉節點與提供的每個兄弟節點一起進行雜湊，直到重建出承諾的根。結果相符並不能證明該根已經最終確定、葉節點資料真實，或未提供的資料仍然可用。
- **工作量證明增加了目標值規則。** 只有當候選區塊標頭的雙重 SHA-256 值依共識規則解讀後小於或等於編碼後的目標值時，比特幣才會驗證通過。礦工付出更多工作，並不會讓摘要具有更強的碰撞抗性。

<a id="risks"></a>

## 風險

- 使用已棄用或不適用的演算法，尤其是在需要碰撞抗性時仍依賴 SHA-1。
- 將 SHA3-256、Keccak-256、SHA-256、雙重 SHA-256 以及截短方式不同的變體視為可以互換。
- 對顯示出來的文字而非標準位元組進行雜湊，或忽略 Unicode 正規化、空白、位元組序、欄位順序和長度編碼。
- 從同一個已遭入侵的位置下載檔案及其預期摘要，因而無法得到獨立的完整性檢查。
- 使用快速的通用雜湊函數直接儲存密碼，而不是採用加鹽、專門用於密碼雜湊且工作因子適當的方案。
- 使用 `H(secret || message)` 自製鑑別碼；某些反覆運算式雜湊建構容易受到長度延伸攻擊，而 HMAC 是專為金鑰式鑑別設計的。
- 截短摘要時，沒有根據協定的規模和威脅模型計算截短後的碰撞安全性與原像安全性。
- 在不同協定中重複使用一種編碼而不做網域分離，使得在一個情境中有效的摘要可能被解讀到另一個情境中。
- 認為交易雜湊能夠證明確認、最終性、執行成功、所有權或區塊鏈不會重組。
- 認為內容雜湊能保證取回所引用的資料；即使所有可用副本都已消失，承諾仍可能有效。
- 比較區塊鏈瀏覽器顯示的字串時，不檢查位元組序、前綴規則、序列化方式，或介面是否以不同形式顯示內部識別碼。
- 在缺少標準測試向量、持續維護的函式庫、獨立審查和升級流程的情況下實作密碼學原語。

<a id="misconceptions"></a>

## 常見誤解

- **雜湊就是經過加密的資料。** 加密可以使用正確的金鑰逆轉；密碼學雜湊是單向摘要，不存在解密操作。
- **不同輸入絕不可能具有相同摘要。** 固定長度的輸出必然存在碰撞。安全的設計會讓尋找和利用碰撞在計算上不可行。
- **256 位元摘要始終提供 256 位元安全強度。** 對於理想的 256 位元雜湊函數，通用碰撞抗性約為 128 位元，協定選擇還可能進一步降低這項強度。
- **雜湊相符就能證明訊息由誰建立。** 單獨的雜湊不含祕密，也不驗證傳送者；當來源很重要時，應使用簽章或適當的 MAC。
- **Keccak-256 和 SHA3-256 是同一個函數的兩個名稱。** 它們採用密切相關的設計，但標準化參數不同，產生的摘要也不同。
- **鏈上交易雜湊能夠證明結算。** 它識別經過編碼的交易資料；區塊鏈收錄、執行狀態、確認和最終性是彼此獨立的事實。

<a id="related"></a>

## 相關主題

- [區塊鏈](/zh-tw/crypto/blockchain/)
- [區塊鏈不可能三角](/zh-tw/crypto/blockchain-trilemma/)
- [默克爾樹](/zh-tw/crypto/merkle-tree/)
- [工作量證明](/zh-tw/crypto/proof-of-work/)

<a id="sources"></a>

## 來源

- [雜湊函數](https://csrc.nist.gov/projects/hash-functions) - NIST（查閱日期：2026-08-20）
- [安全雜湊標準（SHS）](https://doi.org/10.6028/NIST.FIPS.180-4) - NIST（查閱日期：2026-08-20）
- [SHA-3 標準：以置換為基礎的雜湊與可延伸輸出函數](https://doi.org/10.6028/NIST.FIPS.202) - NIST（查閱日期：2026-08-20）
- [比特幣開發者參考：區塊鏈](https://developer.bitcoin.org/reference/block_chain.html) - Bitcoin.org（查閱日期：2026-08-20）
- [以太坊黃皮書](https://ethereum.github.io/yellowpaper/paper.pdf) - Ethereum（查閱日期：2026-08-20）

Source: https://wiki.fcontext.com/zh-tw/crypto/cryptographic-hash/index.mdx
