How Password is Stored?

密碼是如何被存儲的?哪些機制預防密碼洩漏?

前言

雖然之前製作過一個筆記網站有建構用戶註冊的部份:my-note🔗,但沒有筆記下來發現忘了很多概念,碰巧看到我看過最簡單好懂的解說影片:You’re Storing Passwords Wrong. Here’s The Fix - LearnThatStack🔗,把密碼保存相關的知識都紀錄一下。

密碼存儲

明文存儲

將用戶提交直接存儲到資料庫中,當密碼流出時就真的沒救了,甚至使用者往往會多個服務共用相同密碼造成更大傷害。

雜湊函式 Hash Function

  1. 只能單向輸入輸出的函式,可從 password → hash,但極難從 hash → password
  2. 輸入固定,輸出固定
  3. 輸入微小改變,輸出差異極大

想像絞肉機,只要攪爛了資料沒有任何人有辦法在可接受的時間與資源限制下還原,但只要相同的原料被丟進去就會出來相同的結果,也是這樣的特性可以被用來驗證身份,只需要每次用戶提交密碼就進行雜湊運算,與紀錄中雜湊值比對即可,雜湊值無法推斷出密碼。

彩虹表 Rainbow Table

但常見的密碼雜湊組合可能被紀錄,實際破解時只需要對照紀錄就能很快破解,這張查找表也被稱為彩虹表。

加鹽 Salting

為了應對彩虹表降低破解成本以及相同密碼有相同雜湊值的問題還會多「加鹽」,鹽是隨機的資料用於在雜湊前添加,使相同的密碼也會產生完全不同的結果。

SHA256

SHA256 是安全且快速常見的雜湊演算法,但「快」在存儲密碼的情境下反而會拉低了暴力破解的門檻。

bcrypt

bcrypt 是刻意被設計得「緩慢」的雜湊演算法,對使用者來說登入時可調整多花費數百毫秒的時間等待,但卻能大幅度拉高暴力破解的門檻。