跳至主要内容

Hash

What?​

Hash 是一種將輸入資料(如文字或檔案)經過特定演算法轉換為固定長度的字串的技術。無論輸入的大小如何,輸出總是相同長度且看似隨機的字串。我們可以把它想像成資料的「指紋」,每份資料都有其唯一對應的 Hash 值。

舉例來說,如果你將 "hello" 輸入某個 Hash 演算法(例如 SHA-256),就會得到一段固定長度的雜湊值,而即使你只改變一個字母(改成 "Hello"),結果也會完全不同。

$$ \text{SHA-256("hello")} = \text{2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824} $$

Hash 的特性包括:

  1. 不可逆性(Irreversibility):無法從 Hash 值反推出原始資料。
  2. 抗碰撞性(Collision Resistance):不同輸入不應該產生相同的 Hash 值。
  3. 固定長度輸出(Fixed-Length Output):不論輸入大小,結果都是固定長度。

Who?​

  1. 開發者與工程師
    在存取控制、數位簽章、密碼儲存等場景中經常使用 Hash 演算法。

  2. 安全專家
    用來驗證檔案完整性和保護敏感資料。

  3. 區塊鏈開發者
    Blockchain 中的大量運算依賴於 Hash 技術,例如交易打包和共識機制。

  4. 終端用戶
    雖然不直接接觸,但例如下載檔案時可能會看到提供 MD5 或 SHA-256 值供比對,間接受到影響。


When?​

  1. 密碼儲存
    當用戶在網站上註冊或登入時,系統通常不直接儲存密碼,而是儲存其 Hash 值。這樣可以避免密碼被竊取後直接暴露。

  2. 檔案完整性驗證
    下載大型軟體或檔案時,網站通常提供一組 Hash 值供用戶驗證下載是否完整且未被篡改。

  3. 數位簽章與驗證
    在加密通信中,用於確保訊息未被修改,例如 HTTPS 與 SSL/TLS 協議。

  4. 區塊鏈交易處理
    區塊鏈中的每筆交易都會經過哈希處理以確保不可篡改性,並形成鏈式結構。


Where?​

  1. 應用層面:API、身份驗證系統、加解密模組
  2. 數據層面:資料庫中的密碼欄位或記錄校驗欄位
  3. 網路層面:TLS/SSL 協議內部
  4. 分散式系統:例如 Blockchain 的 Block Header 和交易摘要

Why?​

  1. 安全性問題

    • 原始敏感資訊(如密碼)的直接儲存風險太高,因此需要轉換成不可逆的格式。
  2. 訊息完整性

    • 確保傳遞過程中的訊息或檔案未被篡改。例如,在 PGP 驗證中對比原始文件與其公佈的哈希值即可確認完整性。
  3. 效率提升

    • 固定長度輸出讓比較和校驗更快速。例如,比較兩份文件是否一致,只需比較其哈希值即可,不需逐字節比對整個內容。
  4. 分布式一致性

    • 區塊鏈利用 Hash 來實現不可篡改以及工作量證明機制,高效維護分布式帳本的一致性。

How?​

🛠️ 建立階段​

建立一個 Hash 的流程如下:

  1. 選擇合適的演算法,例如 MD5、SHA-256 或 BLAKE3。
  2. 將原始資料作為輸入送進演算法。
  3. 演算法執行後返回固定長度的雜湊值作為結果。

範例程式碼 (Python):

import hashlib

data = "hello"
hash_object = hashlib.sha256(data.encode())
hash_value = hash_object.hexdigest()
print(hash_value) # 輸出: 2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824

🔍 查詢階段​

查詢階段主要是進行比對或校驗:

  1. 將收到的新資料重新計算一次其雜湊值。
  2. 與已知正確值進行比較。如果兩者相符,即表示資料完整且未被修改。

補充說明​

📌 範例比較​

以下展示不同演算法在相同輸入下生成的結果比較:

演算法hash value (hello)
MD55d41402abc4b2a76b9719d911017c592
SHA-2562cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
SHA-5123615f80c9d293ed7402687f8f7be8ed4167a15307f123bc6...

🧠 延伸/常見誤解​

常見誤解:​

  1. 「Hash 是加密技術」—— 錯誤!Hash 是單向處理,無法反推原始內容,而加密則是雙向,可解釋回來源數據。

  2. 「MD5 和 SHA-256 一樣安全」—— 錯誤!MD5 已被破解,不建議在任何需要高安全性的情境下使用。目前推薦採用 SHA-256 或更高版本如 SHA-512 或 BLAKE3。

延伸應用:​

除了基本用途外,Hash 還可結合其他技術,如:

  • 使用鹽值(Salt)提升雜湊強度,用於防止彩虹表攻擊。