密碼散列是保護密碼的基本方面,將密碼存儲從明文轉變為加密散列。這篇文章探討了密碼散列的演變,從早期的算法如 MD5 和 SHA-1 到今天推薦的更安全的方法,最後強調了在每個網站上使用隨機密碼的重要性。
在深入研究密碼散列的歷史和演變之前,重要的是要了解什麼是散列。散列函數是執行散列的方式,旨在接受任何字符串或“輸入”,並產生一個固定大小的字節字符串,通常稱為“散列”。該過程具有幾個關鍵特徵,使其對於安全目的特別有用。
散列函數的一個重要特徵是它對輸入變更的敏感性,這被稱為雪崩效應。即使是輸入中的微小改變——例如更改密碼中的單個字符——也會生成完全不同的散列。例如,字符串“password1”和“password2”的散列看起來完全不同,儘管兩個輸入之間的唯一区別是最後一個字符。這一特徵對於保持數據完整性至關重要,因為它幾乎不可能僅從散列推斷出原始輸入。
此外,散列函數是單向函數,這意味著它們設計上使逆轉計算上幾乎不可行。輸出(散列)不保留任何細節信息,這會允許某人依靠常規計算力重建原始數據。唯一可行的“逆轉”散列的方法是用暴力破解法,即將所有可能的原始數據組合再次進行散列,直到找到匹配的散列。
在數字安全的早期,MD5(Message-Digest Algorithm 5)和 SHA-1(Secure Hash Algorithm 1)被廣泛用於密碼散列。這些算法在 90 年代初開發,將純文本密碼轉換為固定大小的散列值。儘管它們最初具有一定的安全性,但是由於容易受到碰撞攻擊等漏洞的影響,很快就不再適用於安全應用。
儘管散列函數的設計是快速高效的,但這一特點在密碼安全方面可能具有不利影響,因為它使暴力攻擊變得更容易。基於密碼的密鑰衍生函數(PBKDFs),如 PBKDF2,bcrypt 和 scrypt,旨在通過包含鹽(以防禦彩虹表攻擊)和採用密鑰伸展技術來抵消這些攻擊。密鑰伸展故意減慢散列過程,這可以大大阻止未經授權的訪問嘗試。
隨著網絡安全技術的進步,像 MD5 和 SHA-1 這樣的早期散列算法的不足之處顯而易見,進而促使了專為密碼安全設計的算法的發展,包括 bcrypt、scrypt 和 Argon2 或所謂的基於密碼的密鑰衍生函數(PBKDFs)。
根據 OWASP 的建議,推薦用於密碼散列的算法是 bcrypt、scrypt 和 Argon2。這些算法之所以受到青睞,是因為它們對暴力攻擊的強大防禦能力以及對鹽和密鑰伸展的內置機制。
bcrypt 是一種從 Blowfish 密碼衍生的密碼散列函數。它包含鹽以保護免受彩虹表攻擊,並使用一個成本參數來增加生成散列的計算時間(從而增加難度)。該成本係數是可調節的,允許該算法隨著硬件改進而擴展。
關鍵參數:
OWASP 建議使用工作係數 10 或更高,並將密碼限制為 72 字節。
scrypt 設計上既耗費記憶體又耗費時間,以抗擊大規模定制硬件攻擊。它可以配置為需要特定的內存量,並且也包括鹽和迭代計數,類似於 PBKDF2。
關鍵參數:
OWASP 建議使用最低 CPU / 記憶體成本參數(2^17),最低塊大小為 8(1024 字節),並行參數為 1。
2015 年密碼散列競賽的獲勝者 Argon2 有兩種變體:Argon2d 和 Argon2i。Argon2d 優化於威脅來自側信道攻擊較低的環境,而 Argon2i 則優化於抗擊側信道攻擊。它還結合了 bcrypt 和 scrypt 的關鍵功能。
關鍵參數:
OWASP 建議使用 Argon2id,最低配置為 19 MiB 記憶體,迭代次數為 2,並行度為 1。
鑑於安全威脅和對策的不斷演變,更新密碼安全的最新實踐至關重要。欲獲得最新且最全面的建議,請參閱 OWASP 官網的 OWASP Password Storage Cheat Sheet。確保定期查看這些指南,以保持與網絡安全最佳實踐的同步。
儘管採用現代散列算法至關重要,但創建和管理密碼的方式也在維護安全性上起著關鍵作用。每個網站的隨機密碼由於以下幾個因素顯得至關重要:
從 MD5 和 SHA-1 到現代算法如 bcrypt 和 Argon2,密碼散列經歷了重大變革。隨著網絡威脅的不斷演變,採用現代散列算法並確保為每個網站使用隨機、獨特的密碼是保護在線安全的必要做法。這些策略不僅可以防止個別帳戶被攻陷,還可以加強整體安全態勢,以應對日益復雜的攻擊。