Symmetric
使用 libsodium 使用密碼為本地儲存加密數據
我想使用使用者輸入的密碼加密儲存在硬碟上的數據。為此,我查看了鈉文件,我能找到的所有對稱加密都是經過身份驗證的加密。
這種方法需要一個“nonce”,在解密中再次需要這個“nonce”。如果我理解正確,隨機數對於交流很重要,但就我而言,它們不是必需的。正確的?
此外,從使用者輸入的密碼生成密鑰需要鹽,每次都必須相同。
- 經過身份驗證的加密真的是我的任務的正確選擇嗎?如果是,我應該如何處理隨機數?
- 我應該如何處理生成密鑰的鹽?我應該總是使用相同的嗎?或者我應該把它存放在哪裡?
隨機數確保相同的明文將始終使用相同的密鑰映射到不同的密文。需要隨機數的方案應該總是得到一個隨機數,即使對於文件加密,您也不能保證您的使用者不會對同一個文件進行兩次加密,原因只有他們知道。
現在回答你的問題:
身份驗證加密 (AE)始終是首選模式,但全盤加密 (FDE) 除外,在這種情況下您會受到嚴厲懲罰。但由於您不做 FDE,AE 是您的正確選擇。
關於隨機數,您有幾種可能性。
- 您可以將其儲存在文件之前。
- 您可以使用基於密碼的密鑰派生函式 (PBKDF) 在派生密鑰的同一呼叫中派生隨機數。
- (不推薦)假設密鑰每次都不同,您可以保持不變。
- (不推薦)你可以一直增加它,但隨機生成更容易管理我想說的。
每次使用不同的鹽不會傷害你,但重複使用鹽可能會傷害你,所以不要重複使用鹽。始終使用相同的鹽可能最終會出現在相同的密鑰中(只要使用者提供兩次相同的密碼),並且鹽化用於防止“已知雜湊”攻擊,如果您重用鹽和攻擊者,這實際上無法達到目的可以簡單地嘗試預先計算的值。所以在每種情況下使用不同的(不可預測的)鹽。
你應該把鹽存放在哪裡?鹽不需要保密,因此您可以將其儲存在文件的開頭。