1. 程式人生 > >【讀書筆記】安全儲存使用者資料

【讀書筆記】安全儲存使用者資料

文章:後端應該如何安全地儲存使用者資料?

總結:

一、使用者資訊之密碼

講密碼的儲存方案前,先要記住三條前提

  1. 使用者喜歡到處使用一樣的密碼
  2. 使用者喜歡使用簡單好記的密碼
  3. 世界上沒有絕對的安全,但當攻擊成本遠高於收益時,整個系統達到相對安全

 

Phrase 1:雜湊

雜湊儲存的思路很簡單:使用者註冊時,把他的密碼做一次MD5運算儲存起來;使用者登入時,把他輸入的密碼做一次MD5運算,再驗證是否和資料庫裡儲存的一致。

在MD5被證明不夠安全以後,大家又開始選擇其他的雜湊演算法如sha256等。但除了雜湊演算法本身的安全性外,這種做法的缺陷很快暴露,就是應付不了彩虹表

的攻擊方式。

彩虹表就是把簡單的數字密碼組合(和各種常見密碼)的雜湊先儘可能的計算出來,這些明文和雜湊結果的對應關係就是一張彩虹表。由於前提2(大家喜歡使用簡單好記的密碼),所以試著計算出一個常用範圍內的所有字母組合的雜湊的彩虹表,可以破解絕大多數人的密碼。當彩虹表足夠大時,這種儲存方式實際上與明文無異。

Phrase 2:加鹽雜湊

加鹽雜湊是目前業界最常見的做法。

加鹽雜湊的步驟如下:

  • 使用者註冊時,給他隨機生成一段字串,這段字串就是(Salt)
  • 把使用者註冊輸入的密碼和鹽拼接在一起,叫做加鹽密碼
  • 對加鹽密碼進行雜湊,並把結果和鹽都儲存起來

在登陸時,先取出鹽,再同樣進行拼接、計算雜湊,就能判斷密碼的合法性。

加鹽雜湊的做法,既保證了儲存資料的不可逆,又防止了上一章的彩虹表攻擊方式。這種方式下,黑客拿到資料庫後,如果再要用遍歷所有常用的密碼組合的方式做彩虹表,那他需要對所有常用密碼+鹽值進行雜湊運算。而每個使用者的鹽值都不相同,之前彩虹表的「一次運算無數次使用」變成了「一次運算一次使用」。這樣的成本是難以接受的,由於前提3(攻擊成本遠高於收益,系統達到相對安全),所以這是一個比較安全的做法。

 

二、使用者資訊之手機號

對於手機號這種資訊,只能用相對安全的做法,即先對手機號進行對稱加密,再將加密結果儲存在資料庫裡;使用時再用金鑰

解開。這時金鑰不應該被儲存在資料庫裡。如果資料庫被拖庫,那麼些資料的安全性與明文無異。通常會將金鑰以環境變數的形式放在伺服器上。這時除非網站在被拖庫的情況下同時被拿到伺服器許可權,否則手機號的明文就不會被洩露出去。

 

 

最後,謹防日誌洩露使用者資訊:在後端專案生產環境裡,總是會列印並收集各種各樣的日誌。日誌可以方便統計資料、在出錯的時候回溯、除錯bug。但是我們不應該總是列印和收集全部請求的正文內容,因為請求裡可能包含密碼等敏感資訊。當日志被洩露時,使用者資料同樣會以明文形式直接洩露出去。