Key-Derivation
對於使用密碼的加密,您是否應該重新使用相同的鹽來生成密鑰?
假設我有一個簡單的“保險庫”應用程序,使用者可以在其中輸入數據和密碼,它將被加密,要求他們重新輸入密碼才能解密。
這將按如下方式實施:
- 為密鑰生成生成鹽
- 使用 argon2、scrypt 或任何其他 libsodium 使用的 (salt, passphrase) 生成密鑰
- 生成 nonce 或 iv
- 使用 chacha / aes-gcm / libsodium 使用的任何其他內容加密和簽名(明文、密鑰、隨機數或 iv)
- 儲存(帶有簽名、salt、iv 或 nonce 的密文),因為我需要全部 3 個才能從密碼片語中解密
我的問題:每次為同一個使用者重複使用鹽有優點還是缺點?大多數加密範例都重複使用密鑰,只要 IV 或 nonce 不同就可以。但是,如果我每次都生成和儲存鹽,我每次都有效地使用不同的密鑰。這是好/壞/不重要嗎?
鹽的目的始於密碼儲存。在使用散列函式儲存使用者名和密碼的非常常見的案例中,未加鹽的密碼散列顯示哪些使用者具有相同的密碼。這揭示了有關底層密碼的大量資訊,並使密碼雜湊“破解”更加有效。
在您的案例中,您處理的不是散列密碼而是密碼派生密鑰,但是,鹽的案例是相似的。對於您的保險庫來說,顯示所有密文都使用相同的派生密鑰加密是否是一種可接受的設計?例如,如果您的保管庫允許使用者為密鑰派生指定每個文件的密碼,則靜態鹽可能會顯示多個文件使用相同的密碼來派生其加密密鑰。
模型的安全性實際上取決於散列函式的安全性。使用鹽的主要原因之一是為了防禦彩虹表,但在這種情況下,您可以安全地免受彩虹表的影響,因為您的雜湊不會暴露。
但是,如果您使所有密碼都具有相同的鹽,那麼攻擊者的工作就會變得更加容易。假設該表有 N 個條目,作為攻擊者,我想嘗試獲取盡可能多的使用者保管庫數據。此時我正在執行字典攻擊。在您的模型中,每個密碼都具有相同的鹽,我只需對任何給定密碼進行一次雜湊處理,然後嘗試對稱解密每個文件。當每個使用者都有一個唯一的鹽時,您必須執行 N 次雜湊。密碼雜湊被設計為緩慢且記憶體密集的雜湊。因此,這是一件大事,並且對於試圖破壞盡可能多的使用者的攻擊者來說是很多額外的工作量。因此,使用相同的鹽確實存在安全問題,因為您失去了加在攻擊者身上的 N 個額外工作。