以下內容將以淺顯易懂的方式,帶大家認識「雜湊(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?
- 檔案完整性驗證
- 例如下載作業系統的映像檔(ISO)時,官方會提供雜湊值(如 MD5、SHA-256),讓使用者下載後核對,確認檔案在下載過程中未被竄改。
- 密碼儲存
- 很多網站不會直接儲存使用者的明文密碼,而是儲存加了鹽(Salt)後的雜湊值,讓駭客即使拿到資料庫,也難以輕易取得使用者的真正密碼。
- 數位簽章 / 數位憑證
- 傳送重要文件時,會先對文件雜湊後,再用私鑰對雜湊值進行加密。接收者用公鑰解密這段加密雜湊值,再和自己計算出的雜湊值比對,如果相同,就能確認文件的完整性和發送者的身份。
結合雜湊函式與非對稱加密
- 若透過公鑰與私鑰來「簽章」這份雜湊值,可讓接收者驗證訊息未被篡改,也確保只有正確的私鑰持有者能產生這段簽章,達到「身分確認」與「資料完整」的雙重保護。
3. 駭客會怎麼攻擊 Hash?
- 字典攻擊(Dictionary Attack)
- 駭客收集常見或曾流出的密碼字典(例如
123456
、password
、qwerty
…),逐一丟進雜湊函式和資料庫中的雜湊值比對。
- 駭客收集常見或曾流出的密碼字典(例如
- 暴力破解(Brute Force Attack)
- 駭客嘗試所有可能的字串組合,一直算雜湊值直到猜到正確結果。
- 彩虹表攻擊(Rainbow Table Attack)
- 先離線生成巨大的「字串 → 雜湊值」對照表,遇到雜湊值時,可以直接在表中搜尋對應原文,大幅縮短破解時間。
- 碰撞攻擊(Collision Attack)
- 特意找到兩份不同的資料卻能產生相同雜湊值。如果某雜湊演算法設計不良或強度不足,駭客就可能利用這種方法在文件中做隱匿的修改而不被察覺。
4. 有哪些常見的攻擊工具?
- Hashcat
- 目前相當流行且強大的雜湊值破解工具,支援 CPU、GPU 加速,能進行字典攻擊、暴力攻擊、彩虹表攻擊等。
- John the Ripper
- 老牌的密碼破解工具,支援多種作業系統與多種雜湊演算法,也可搭配字典檔來加速破解。
- RainbowCrack
- 專門使用彩虹表來進行攻擊的工具,能快速對大量雜湊值進行比對。
- 其他線上 / 雜湊查詢平台
- 一些網站收集龐大的雜湊資料庫,只要輸入雜湊值就能查詢是否對應到已知的明文字串。
5. 如何有效防禦?
- 對密碼使用 Salt(加鹽)與適合的加密雜湊演算法
- 若只單純將密碼做雜湊,駭客可用預先產生的彩虹表或字典檔直接對比。
- 在密碼前或後加入一段隨機字串(Salt),即使使用者密碼相同,最終雜湊結果也會不同,可顯著提升破解難度。
- 選擇安全的演算法(如 bcrypt、scrypt、PBKDF2、Argon2 等),這些演算法天生就會讓計算變慢或需要更多資源,暴力破解難度更高。
- 定期更新雜湊演算法與系統
- 不要使用已知有漏洞或容易產生碰撞的舊算法(例如 MD5、SHA-1)。
- 使用較新、碰撞風險小且經過安全審計的演算法(如 SHA-256、SHA-3、或上述提到的專門密碼雜湊演算法)。
- 限制登入嘗試次數、實施多因素驗證(MFA)
- 如果駭客無法無限制地嘗試各種密碼,就能降低暴力攻擊成功機率;
- 多因素驗證(例如用手機 OTP、硬體金鑰)也能在雜湊被洩漏時,提供第二道保護。
- 公鑰 / 私鑰機制加上雜湊加密簽章
- 在需要證明訊息來自特定身份的情境下,使用私鑰簽章雜湊值、接收方用公鑰驗證,可防止中間人竄改或假冒。
- 建立安全的傳輸環境(如使用 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())