{%hackmd theme-dark %} # 為何會員密碼需要雜湊加密 ### 關於 這個文章是為了回應一位好友而寫,主要說明為何會員的密碼需要雜湊加密。 ## 正文 ### 密碼 引述自維基百科: >密碼或稱為`口令`、`通行字`、`通行碼`,`口令`原來的意義是口頭暗號,也叫「通行字」,是一個用於身份驗證的保密的字符串。 由上述可知,密碼本身是需要『保密』的,知道的人、或儲存的位置越少越好,甚至就連密碼驗證端也最好不知道密碼,總的來說,就是『無人知道的秘密不會被外洩』。 ### 系統中的密碼 系統中儲存雜湊過的密碼,並沒有什麼深刻的理由,純粹只是因為更安全而已。 以下就儲存密碼的方式來分析其風險。 1. **`明文`** 明文儲存的風險非常大。 在資料外流等事件中,明文密碼造成的是所有外流帳號都不再安全,其損失可能難以估計,甚至會波及其他系統,因為有許多使用者會在不同網站中使用相同密碼。(此處不考慮 `OTP`) 並且明文儲存對於內部人員是不利的。人性難測,對於 DBA、PG、OP 等眾多可以接觸到帳號密碼的內部人員,企業無法預期他們是否會惡意存取會員帳號,或者將這些密碼拿去嘗試於其他系統等,尤其是涉及金融服務的系統,其『誘惑』更大。 2. **`可逆密文`** 可逆密文同樣存在風險,但是比明文小的多。 可逆密文的風險在於,解密金鑰同樣可能外洩;而即便金鑰保存良好,但駭客同樣可能藉由[選擇明文攻擊](https://zh.wikipedia.org/wiki/選擇明文攻擊)等方式來破解出解密金鑰,而解密金鑰只要被破解或取得一次,則相當於所有帳號都被破解。 並且,對於有權存取解密金鑰的內部人員而言,同樣會存在如明文儲存中的誘惑力。 3. **`不可逆密文`** 不可逆密文即為雜湊加密,是目前主流的密碼儲存格式。 不可逆密文依然具有風險,但是比可逆密文更低。 在遭遇資料外洩的事件時,使用雜湊加密儲存的密碼保證了攻擊者無法在短時間內回推明文,即便攻擊者知道系統所使用的雜湊演算法、[Salt](https://zh.wikipedia.org/wiki/%E7%9B%90_(%E5%AF%86%E7%A0%81%E5%AD%A6)),甚至連 [HMAC](https://zh.wikipedia.org/wiki/%E9%87%91%E9%91%B0%E9%9B%9C%E6%B9%8A%E8%A8%8A%E6%81%AF%E9%91%91%E5%88%A5%E7%A2%BC) 的加密金鑰都知道了,也會因為其不可逆的特性而被迫以窮舉法的方式來取得明文,並且該窮舉法必須對所有帳號都執行,而非如可逆密文一般,破解一次即取得全部密碼。 ### 結論 如上一節開頭所述,系統中儲存雜湊過的密碼,並沒有什麼深刻的理由,純粹只是因為更安全而已。 ### 額外內容 雖然都是雜湊加密演算,但是依照實作方式,依然可能出現安全性風險,以下列出一些需要注意的事項: 1. 不要用 [`md5`](https://zh.wikipedia.org/wiki/MD5) 進行雜湊,因為這種雜湊方式已經被證實可以破解 2. 一定要加[鹽](https://zh.wikipedia.org/wiki/%E7%9B%90_(%E5%AF%86%E7%A0%81%E5%AD%A6)),用於防止[彩虹表](https://zh.wikipedia.org/wiki/%E5%BD%A9%E8%99%B9%E8%A1%A8) 3. 考慮使用 [HMAC](https://zh.wikipedia.org/wiki/%E9%87%91%E9%91%B0%E9%9B%9C%E6%B9%8A%E8%A8%8A%E6%81%AF%E9%91%91%E5%88%A5%E7%A2%BC) 參考報導 - https://www.ithome.com.tw/news/117253 - https://buzzorange.com/techorange/2019/03/22/facebook-stored-users-password/