[資安概念] 001 淺談 Hash(雜湊):原理、應用、駭客攻擊手法與防禦策略

以下內容將以淺顯易懂的方式,帶大家認識「雜湊(Hash)」的觀念、它在日常應用中的角色、駭客常見的攻擊手法、常見的攻擊工具,以及如何有效地防範這些攻擊。適合對網路安全或加密機制剛入門的新手朋友。


1. 什麼是 Hash(雜湊)?

Hash(中文常譯為「雜湊」或「雜湊函式」)是一種「將任意長度的輸入資料,透過數學運算壓縮成一段固定長度雜湊值」的函式。

  • 固定長度輸出:不管輸入是 1 Byte 或是幾百 MB 的檔案,雜湊函式都會輸出固定長度的結果。例如,SHA-256 不論輸入多長,都會輸出 256 bits(64 個 16 進位字元)長度的雜湊值。
  • 雪崩效應:只要輸入有微小的變更,例如把大寫的 “A” 改成小寫的 “a”,輸出結果就會有巨大的改變,難以從輸出推回原本的輸入。
  • 判斷資料完整性:如果對同一份資料使用同一種雜湊函式,會得到相同的雜湊值。因此可以用來檢查資料在傳遞或儲存過程中,是否被竄改。

為什麼雜湊值可以用來驗證完整性?

  • A 把文字「APPLE」用 SHA-1 算出來的雜湊值給 B(例如 d0be2dc421be4fcd0172e5afceea3970e2f3d940)。
  • B 拿到 A 給的明文「APPLE」後,也用同樣的 SHA-1 算一次。如果結果和 A 提供的雜湊值一樣,就表示這段文字沒有在傳送過程中被改動。
  • 如果資料中任何一個字元被更動了,雜湊值就會完全不同,B 一對照就能發現問題。

2. 一般情況什麼時候使用 Hash?

  1. 檔案完整性驗證
    • 例如下載作業系統的映像檔(ISO)時,官方會提供雜湊值(如 MD5、SHA-256),讓使用者下載後核對,確認檔案在下載過程中未被竄改。
  2. 密碼儲存
    • 很多網站不會直接儲存使用者的明文密碼,而是儲存加了鹽(Salt)後的雜湊值,讓駭客即使拿到資料庫,也難以輕易取得使用者的真正密碼。
  3. 數位簽章 / 數位憑證
    • 傳送重要文件時,會先對文件雜湊後,再用私鑰對雜湊值進行加密。接收者用公鑰解密這段加密雜湊值,再和自己計算出的雜湊值比對,如果相同,就能確認文件的完整性和發送者的身份。

結合雜湊函式與非對稱加密

  • 若透過公鑰與私鑰來「簽章」這份雜湊值,可讓接收者驗證訊息未被篡改,也確保只有正確的私鑰持有者能產生這段簽章,達到「身分確認」與「資料完整」的雙重保護。

3. 駭客會怎麼攻擊 Hash?

  1. 字典攻擊(Dictionary Attack)
    • 駭客收集常見或曾流出的密碼字典(例如 123456passwordqwerty…),逐一丟進雜湊函式和資料庫中的雜湊值比對。
  2. 暴力破解(Brute Force Attack)
    • 駭客嘗試所有可能的字串組合,一直算雜湊值直到猜到正確結果。
  3. 彩虹表攻擊(Rainbow Table Attack)
    • 先離線生成巨大的「字串 → 雜湊值」對照表,遇到雜湊值時,可以直接在表中搜尋對應原文,大幅縮短破解時間。
  4. 碰撞攻擊(Collision Attack)
    • 特意找到兩份不同的資料卻能產生相同雜湊值。如果某雜湊演算法設計不良或強度不足,駭客就可能利用這種方法在文件中做隱匿的修改而不被察覺。

4. 有哪些常見的攻擊工具?

  1. Hashcat
    • 目前相當流行且強大的雜湊值破解工具,支援 CPU、GPU 加速,能進行字典攻擊、暴力攻擊、彩虹表攻擊等。
  2. John the Ripper
    • 老牌的密碼破解工具,支援多種作業系統與多種雜湊演算法,也可搭配字典檔來加速破解。
  3. RainbowCrack
    • 專門使用彩虹表來進行攻擊的工具,能快速對大量雜湊值進行比對。
  4. 其他線上 / 雜湊查詢平台
    • 一些網站收集龐大的雜湊資料庫,只要輸入雜湊值就能查詢是否對應到已知的明文字串。

5. 如何有效防禦?

  1. 對密碼使用 Salt(加鹽)與適合的加密雜湊演算法
    • 若只單純將密碼做雜湊,駭客可用預先產生的彩虹表或字典檔直接對比。
    • 在密碼前或後加入一段隨機字串(Salt),即使使用者密碼相同,最終雜湊結果也會不同,可顯著提升破解難度。
    • 選擇安全的演算法(如 bcrypt、scrypt、PBKDF2、Argon2 等),這些演算法天生就會讓計算變慢或需要更多資源,暴力破解難度更高。
  2. 定期更新雜湊演算法與系統
    • 不要使用已知有漏洞或容易產生碰撞的舊算法(例如 MD5、SHA-1)。
    • 使用較新、碰撞風險小且經過安全審計的演算法(如 SHA-256、SHA-3、或上述提到的專門密碼雜湊演算法)。
  3. 限制登入嘗試次數、實施多因素驗證(MFA)
    • 如果駭客無法無限制地嘗試各種密碼,就能降低暴力攻擊成功機率;
    • 多因素驗證(例如用手機 OTP、硬體金鑰)也能在雜湊被洩漏時,提供第二道保護。
  4. 公鑰 / 私鑰機制加上雜湊加密簽章
    • 在需要證明訊息來自特定身份的情境下,使用私鑰簽章雜湊值、接收方用公鑰驗證,可防止中間人竄改或假冒。
  5. 建立安全的傳輸環境(如使用 SSL/TLS)
    • 資料在傳輸過程中也需要被加密,避免通訊內容被攔截與竄改。
    • 雜湊是用來驗證完整性的,但如果整段資料用明文傳送,中間人攔截並改動內容,就失去了加密通信的保護。

小結

  • Hash(雜湊)是用來「判斷資料完整性」與「驗證身分」的重要工具:它把任意長度的輸入,透過特定的數學函式,壓縮為固定長度的雜湊值。
  • 在實務上,常用於檔案完整性驗證、密碼儲存、數位簽章 / 憑證等場合。
  • 駭客攻擊常採用字典攻擊、暴力破解、彩虹表攻擊、碰撞攻擊等手段。
  • 常見攻擊工具包含 Hashcat、John the Ripper、RainbowCrack 等。
  • 防禦策略除了選擇安全的雜湊演算法,也要加鹽(Salt)、限制登入嘗試次數、採用多因素驗證、多用公私鑰簽章及保護通訊環境等方法,才能降低被駭客攻擊得手的機率。

希望這篇簡介能幫助新手朋友快速了解 Hash 的概念、應用情境和安全注意事項,進而在日常開發與安全設計中更遊刃有餘。


參考資料

Python 中的 Hash 函數使用範例

# Linux下可用指令
printf "Hello, world!" | md5sum
6cd3556deb0da54bca060b4c39479839  - printf "Hello, world!" | sha256sum
315f5bdb76d078c43b8ac0064e4a0164612b1fce77c869345bfc94c75894edd3  -
# Python2
import hashlib

print hashlib.md5('Hello, world!').hexdigest()
# 6cd3556deb0da54bca060b4c39479839

print hashlib.sha256('Hello, world!').hexdigest()
# 315f5bdb76d078c43b8ac0064e4a0164612b1fce77c869345bfc94c75894edd3

# Python3 要記得在字串前加 b
import hashlib

print(hashlib.md5(b'Hello, world!').hexdigest())
print(hashlib.sha256(b'Hello, world!').hexdigest())
飛飛
飛飛