Symmetric

使用 libsodium 使用密碼為本地儲存加密數據

  • April 3, 2016

我想使用使用者輸入的密碼加密儲存在硬碟上的數據。為此,我查看了鈉文件,我能找到的所有對稱加密都是經過身份驗證的加密

這種方法需要一個“nonce”,在解密中再次需要這個“nonce”。如果我理解正確,隨機數對於交流很重要,但就我而言,它們不是必需的。正確的?

此外,從使用者輸入的密碼生成密鑰需要鹽,每次都必須相同。

  • 經過身份驗證的加密真的是我的任務的正確選擇嗎?如果是,我應該如何處理隨機數?
  • 我應該如何處理生成密鑰的鹽?我應該總是使用相同的嗎?或者我應該把它存放在哪裡?

隨機數確保相同的明文將始終使用相同的密鑰映射到不同的密文。需要隨機數的方案應該總是得到一個隨機數,即使對於文件加密,您也不能保證您的使用者不會對同一個文件進行兩次加密,原因只有他們知道。

現在回答你的問題:

  • 身份驗證加密 (AE)始終是首選模式,但全盤加密 (FDE) 除外,在這種情況下您會受到嚴厲懲罰。但由於您不做 FDE,AE 是您的正確選擇。

  • 關於隨機數,您有幾種可能性。

    1. 您可以將其儲存在文件之前。
    2. 您可以使用基於密碼的密鑰派生函式 (PBKDF) 在派生密鑰的同一呼叫中派生隨機數。
    3. 不推薦)假設密鑰每次都不同,您可以保持不變。
    4. 不推薦)你可以一直增加它,但隨機生成更容易管理我想說的。
  • 每次使用不同的鹽不會傷害你,但重複使用鹽可能會傷害你,所以不要重複使用鹽。始終使用相同的鹽可能最終會出現在相同的密鑰中(只要使用者提供兩次相同的密碼),並且鹽化用於防止“已知雜湊”攻擊,如果您重用鹽和攻擊者,這實際上無法達到目的可以簡單地嘗試預先計算的值。所以在每種情況下使用不同的(不可預測的)鹽

  • 你應該把鹽存放在哪裡?鹽不需要保密,因此您可以將其儲存在文件的開頭。

引用自:https://crypto.stackexchange.com/questions/25665