【讀書筆記】安全儲存使用者資料
總結:
一、使用者資訊之密碼
講密碼的儲存方案前,先要記住三條前提:
- 使用者喜歡到處使用一樣的密碼
- 使用者喜歡使用簡單好記的密碼
- 世界上沒有絕對的安全,但當攻擊成本遠高於收益時,整個系統達到相對安全
Phrase 1:雜湊
雜湊儲存的思路很簡單:使用者註冊時,把他的密碼做一次MD5運算儲存起來;使用者登入時,把他輸入的密碼做一次MD5運算,再驗證是否和資料庫裡儲存的一致。
在MD5被證明不夠安全以後,大家又開始選擇其他的雜湊演算法如sha256等。但除了雜湊演算法本身的安全性外,這種做法的缺陷很快暴露,就是應付不了彩虹表
彩虹表就是把簡單的數字密碼組合(和各種常見密碼)的雜湊先儘可能的計算出來,這些明文和雜湊結果的對應關係就是一張彩虹表。由於前提2(大家喜歡使用簡單好記的密碼),所以試著計算出一個常用範圍內的所有字母組合的雜湊的彩虹表,可以破解絕大多數人的密碼。當彩虹表足夠大時,這種儲存方式實際上與明文無異。
Phrase 2:加鹽雜湊
加鹽雜湊是目前業界最常見的做法。
加鹽雜湊的步驟如下:
- 使用者註冊時,給他隨機生成一段字串,這段字串就是鹽(Salt)
- 把使用者註冊輸入的密碼和鹽拼接在一起,叫做加鹽密碼
- 對加鹽密碼進行雜湊,並把結果和鹽都儲存起來
在登陸時,先取出鹽,再同樣進行拼接、計算雜湊,就能判斷密碼的合法性。
加鹽雜湊的做法,既保證了儲存資料的不可逆,又防止了上一章的彩虹表攻擊方式。這種方式下,黑客拿到資料庫後,如果再要用遍歷所有常用的密碼組合的方式做彩虹表,那他需要對所有常用密碼+鹽值
進行雜湊運算。而每個使用者的鹽值都不相同,之前彩虹表的「一次運算無數次使用」變成了「一次運算一次使用」。這樣的成本是難以接受的,由於前提3(攻擊成本遠高於收益,系統達到相對安全),所以這是一個比較安全的做法。
二、使用者資訊之手機號
對於手機號這種資訊,只能用相對安全的做法,即先對手機號進行對稱加密,再將加密結果儲存在資料庫裡;使用時再用金鑰
最後,謹防日誌洩露使用者資訊:在後端專案生產環境裡,總是會列印並收集各種各樣的日誌。日誌可以方便統計資料、在出錯的時候回溯、除錯bug。但是我們不應該總是列印和收集全部請求的正文內容,因為請求裡可能包含密碼等敏感資訊。當日志被洩露時,使用者資料同樣會以明文形式直接洩露出去。