前兩天已經學會密碼破解工具了,因此我今天想學習防禦密碼被破解的技術,保護密碼免受彩虹表和暴力破解攻擊,並且減少資料洩漏時的風險。
簡單的哈希算法像是 MD5 或 SHA-1 將密碼轉換為一串固定長度的雜湊值,在存儲時看似已經隱藏原始密碼,但這樣的做法有以下幾個弱點。
Salted Hash 的原理是為每個密碼增加一段隨機生成的數據,這段數據在計算哈希時會與密碼一起被運算,讓每個雜湊值都獨一無二。優點在於能有效防止彩虹表攻擊,由於每次計算哈希都會有不同的鹽值,即使密碼相同,最終的哈希結果也會不同,攻擊者無法使用預先計算的彩虹表。而且加鹽可以提高暴力破解的難度,增加隨機性後,即使是相同的密碼也需要重新計算不同的雜湊值,攻擊的成本和時間顯著增加。這種方式還能獨立保護每個密碼,即使某個使用者的密碼被破解,也不會影響其他使用者的安全,因為每個密碼的鹽值是獨立的。
加鹽的方式是當存儲密碼時,可以隨機生成一段鹽值,將鹽值和密碼結合後進行哈希計算,最後將生成的鹽值與最終的雜湊值一起存儲,以便在未來進行驗證時使用。
Key stretching 是一個增加密碼安全性的加密技術,尤其是在原始密碼缺乏隨機性或長度不夠長,難以抵禦駭客攻擊的情況。透過增加計算時間來提高破解密碼的難度,這些技術會出現大量重複計算,使每次密碼驗證都變得花費時間。
PBKDF2 (Password-Based Key Derivation Function 2) 是一種常見的密鑰延伸,通常用於安全存儲密碼、加密金鑰生成等場景。PBKDF2 透過反覆運行數千甚至數百萬次的雜湊計算來增加破解成本,並加入隨機鹽值保護雜湊。它的安全性可以根據硬體性能,隨時調整計算次數,來平衡安全性與計算性能,應用範圍廣泛,尤其是在網路應用程式的密碼保護中。
bcrypt 是一個密碼存儲設計的雜湊算法,包含延遲和加鹽機制。它在每次計算時會自動生成鹽值並重複多次計算,使破解過程比單純的哈希複雜很多。bcrypt 設計上允許動態調整計算次數,次數越高,計算所需的時間越長,攻擊難度也會跟著增加。即使硬體性能不斷提升,bcrypt 也能通過增加計算次數,持續提升破解難度,並自動生成鹽值,使同一個密碼在不同次計算有不同結果。
scrypt 也是一種加密算法,不但延遲計算時間,還會增加記憶體需求,使攻擊者在執行並行破解時面臨更高的成本。scrypt 會同時增加 CPU 和 RAM 使用量,對於大規模攻擊如 GPU 和 FPGA 平台破解都很有效,適用於需要高度安全的密碼存儲。