什麼是密碼學雜湊?
密碼學雜湊是一種把資料轉換成固定長度摘要的計算方法。無論輸入是一句話還是一個大檔案,只要使用同一種雜湊演算法,就會得到該演算法規定長度的結果,這個結果稱為雜湊值或摘要。
它很像資料的「指紋」:輸入不變,算出的雜湊值就不變;輸入哪怕只改動一個字元,結果通常也會明顯不同。因此,別人可以重新計算雜湊值,檢查自己拿到的資料是否與原資料一致,而不必逐字比較全部內容。
這個比喻也有邊界。雜湊值不是資料的縮寫,不能用它還原原文;它也不是絕對唯一的編號。安全的密碼學雜湊追求的是讓反推輸入或故意找到相同結果在計算上極其困難,而不是從數學上保證碰撞永遠不會發生。
雜湊計算的輸入與輸出
雜湊演算法處理的是一串確定的二進位資料。文字、圖片或交易在計算前都要先轉換成位元組;字元編碼、欄位順序,或者把結構化資訊按規則排列成位元組的方式不同,輸入就不同,結果也會不同。這個排列過程通常稱為序列化。
以 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:默克爾帕特里夏樹——雜湊連接的資料結構和包含證明。




