在密碼雜湊裡必然會出現的「salt(鹽)」。就像做菜時的鹽一樣,給雜湊加上一小撮,安全性就會大不相同。本文講解其機制與要點(不會寫出攻擊步驟)。
為什麼「調味」能起作用
沒有 salt 時,密碼相同的人保存的雜湊也相同。這給了攻擊者兩條近路——預先計算好的對照表(彩虹表)能直接命中,以及「一個人的破解結果,可以套用到所有密碼相同的人身上」。
加上 salt 後,即便同樣是 "password123",每個使用者的保存值也會完全不同。
出於同樣的道理,salt 必須每個使用者(最好是每個密碼)都重新建立。如果所有人共用同一個 salt,相同密碼的人之間保存值又會一致,好不容易得來的效果就被削弱了。產生時要使用難以猜測的密碼學亂數,建立好的 salt 要和雜湊值一起保存(無需保密)。
另外,salt 守護的範圍僅限於「預先計算好的表」和「針對重複使用密碼的批次破解」。針對單個密碼進行窮舉的攻擊本身,讓它變慢並不是 salt 的工作,而是由 bcrypt/Argon2 這類故意做得很慢的雜湊來承擔。兩者的守備範圍不同,所以必須搭配使用。
常見誤解與正解
誤解
- salt 必須保密
- 所有使用者用共同的 salt 就行
- 只要加上 salt,弱密碼也安全
正解
- salt 以公開為前提即可(和雜湊一起保存)
- 每個使用者(最好是每個密碼)用不同的亂數
- salt 是針對「預先計算與重複使用密碼破解」的對策。窮舉對策由慢速雜湊承擔
本站的觀點:salt 和 pepper 是兩種東西
容易與 salt 混淆的是 pepper(胡椒)。pepper 是給全體新增的祕密值,放在和資料庫不同的地方(應用設定或金鑰管理)。salt(公開·每個使用者)和 pepper(祕密·全體共用)角色不同,任何一方都無法替代另一方。話雖如此,實務上首先要做的,是用 bcrypt/Argon2 正確地實作salt+慢速雜湊。
接下來閱讀
- 術語:密碼雜湊是什麼(與 salt 成對理解)
- 對策:密碼的安全保存方法(雜湊+salt 實踐)
- 入門:密碼的正確保管
FAQ
Qsalt 必須保密嗎?
不必。salt 不是『祕密的金鑰』,可以和雜湊值一起保存。它的目的不是保密,而是讓相同密碼的人保存值也各不相同,從而使預先計算(彩虹表)和針對重複使用密碼的批次破解失效。需要保密的是另一種東西『pepper』(後述)。
Q所有使用者能不能共用同一個 salt?
不行。salt 必須是每個使用者(最好是每個密碼)各不相同的隨機值,這一點至關重要。如果用共同的 salt,相同密碼的人之間保存值就會一致,攻擊者只需一次窮舉就能成批攻破多個帳戶。每次新產生時都要用密碼學亂數來建立。
Q需要自己實作 salt 嗎?
通常不需要。bcrypt、Argon2、scrypt 這類專用雜湊會自動完成 salt 的產生與保存(大多直接內含在雜湊字串之中)。比起自己新增 salt,把它交給這些標準實作更安全、更可靠。