跳至主要內容
>_ITDITD網站資安平台

名詞解釋

salt(鹽)是什麼 — 給密碼雜湊新增的「每個使用者各不相同的調味」

salt(鹽)是在對密碼做雜湊之前新增的『每個使用者各不相同的隨機值』。本文隱去攻擊步驟、從防禦視角講解為何需要它(即便密碼相同,保存值也會各不相同,使彩虹表和針對重複使用密碼的批次破解失效)、它與 pepper 的區別,以及常見誤解。

發布於 2026-06-27 更新於 2026-06-27 閱讀時間 1 分鐘

在密碼雜湊裡必然會出現的「salt(鹽)」。就像做菜時的鹽一樣,給雜湊加上一小撮,安全性就會大不相同。本文講解其機制與要點(不會寫出攻擊步驟)。

為什麼「調味」能起作用

沒有 salt 時,密碼相同的人保存的雜湊也相同。這給了攻擊者兩條近路——預先計算好的對照表(彩虹表)能直接命中,以及「一個人的破解結果,可以套用到所有密碼相同的人身上」。

加上 salt 後,即便同樣是 "password123",每個使用者的保存值也會完全不同

無 salt:「password123」→ 所有人 雜湊相同(用表一擊命中)
↓ 加上每個使用者各自的 salt 後
A:salt_a + password123 → 雜湊 X
B:salt_b + password123 → 雜湊 Y(與 X 不同)
即便密碼相同,只要 salt 不同,所有人的保存值就各不相同。預先計算的表因此失效。

出於同樣的道理,salt 必須每個使用者(最好是每個密碼)都重新建立。如果所有人共用同一個 salt,相同密碼的人之間保存值又會一致,好不容易得來的效果就被削弱了。產生時要使用難以猜測的密碼學亂數,建立好的 salt 要和雜湊值一起保存(無需保密)。

另外,salt 守護的範圍僅限於「預先計算好的表」和「針對重複使用密碼的批次破解」。針對單個密碼進行窮舉的攻擊本身,讓它變慢並不是 salt 的工作,而是由 bcrypt/Argon2 這類故意做得很慢的雜湊來承擔。兩者的守備範圍不同,所以必須搭配使用。

常見誤解與正解

誤解

  • salt 必須保密
  • 所有使用者用共同的 salt 就行
  • 只要加上 salt,弱密碼也安全

正解

  • salt 以公開為前提即可(和雜湊一起保存)
  • 每個使用者(最好是每個密碼)用不同的亂數
  • salt 是針對「預先計算與重複使用密碼破解」的對策。窮舉對策由慢速雜湊承擔

本站的觀點:salt 和 pepper 是兩種東西

容易與 salt 混淆的是 pepper(胡椒)。pepper 是給全體新增的祕密值,放在和資料庫不同的地方(應用設定或金鑰管理)。salt(公開·每個使用者)和 pepper(祕密·全體共用)角色不同,任何一方都無法替代另一方。話雖如此,實務上首先要做的,是用 bcrypt/Argon2 正確地實作salt+慢速雜湊

接下來閱讀

FAQ

Qsalt 必須保密嗎?
A

不必。salt 不是『祕密的金鑰』,可以和雜湊值一起保存。它的目的不是保密,而是讓相同密碼的人保存值也各不相同,從而使預先計算(彩虹表)和針對重複使用密碼的批次破解失效。需要保密的是另一種東西『pepper』(後述)。

Q所有使用者能不能共用同一個 salt?
A

不行。salt 必須是每個使用者(最好是每個密碼)各不相同的隨機值,這一點至關重要。如果用共同的 salt,相同密碼的人之間保存值就會一致,攻擊者只需一次窮舉就能成批攻破多個帳戶。每次新產生時都要用密碼學亂數來建立。

Q需要自己實作 salt 嗎?
A

通常不需要。bcrypt、Argon2、scrypt 這類專用雜湊會自動完成 salt 的產生與保存(大多直接內含在雜湊字串之中)。比起自己新增 salt,把它交給這些標準實作更安全、更可靠。