Encryption

使用從 Argon2 派生的密鑰使用 AES 加密文件

  • November 22, 2021

我想加密我的電腦和智能手機上的一些敏感文件,這樣即使電腦被盜,它們仍然無法讀取。

就我而言,AES 是最好的加密算法,所以我會選擇它。對於 AES,我還需要一個密鑰(或密碼密鑰)。因此,我需要一個密鑰派生函式,最好是基於密碼的函式。顯然,我不想將派生的密鑰儲存在電腦(或智能手機)上,否則,可以使用密鑰輕鬆解密加密的文本。

我讀過 Argon2 被認為是目前基於密碼的密鑰派生的最佳選擇。

現在,在“ argon2 cffi Documentation Release 19.1.0 ”(2019 年 1 月 17 日)中,我讀到“Argon2i 使用與數據無關的記憶體訪問,這是密碼散列和基於密碼的密鑰派生的首選”(第 3 頁)。然後,在第 9 頁,我讀到了關於 Argon2id 的同樣的話:“那就是

$$ Argon2id $$密碼散列和基於密碼的密鑰派生的首選類型”。 現在我的第一個問題是:兩種類型的 Argon2 中哪一種最適合基於密碼的密鑰派生?

此外,根據同一文件,argon2.PasswordHasher 算法“總是使用隨機鹽進行散列”。這意味著每次我輸入密碼來解密文件時,散列算法都會產生不同的密鑰,所以我無法重現密鑰來解密我的文件。

當然,我可以將鹽儲存在電腦(或智能手機)上,但隨後會出現另外兩個問題:

如何將 Argon2 與預定義的鹽一起使用?

使用可自由訪問的鹽是否有意義(如果我的數據被盜)?

那麼,有人可以闡明如何將 Argon2 用作基於密碼的密鑰派生函式嗎?我的問題的解決方案是什麼?

兩種 Argon2 中的哪一種最適合基於密碼的密鑰派生?

簡而言之,正如draft-irtf-cfrg-argon2-03 所說

如果您不知道它們之間的區別,或者您認為側通道攻擊是可行的威脅,請選擇 Argon2id

  • Argon2d速度更快,並且使用依賴數據的記憶體訪問。數據依賴性立即啟用旁道。這適用於不受側通道攻擊威脅的加密貨幣和應用程序。
  • Argon2i使用與數據無關的記憶體訪問,這是密碼散列和基於密碼的密鑰派生的首選。
  • Argon2id在第一次迭代的前半部分作為 Argon2i 工作,其餘作為 Argon2d 工作。這實現了邊通道保護和時間記憶體權衡。

如何將 Argon2 與預定義的鹽一起使用?

來自Argon2 的庫

   Usage:  ./argon2 [-h] salt [-i|-d|-id] [-t iterations] [-m memory] [-p parallelism] [-l hash length] [-e|-r] [-v (10|13)]
           Password is read from stdin
   Parameters:
           salt            The salt to use, at least 8 characters
           -i              Use Argon2i (this is the default)
           -d              Use Argon2d instead of Argon2i
           -id             Use Argon2id instead of Argon2i
           -t N            Sets the number of iterations to N (default = 3)
           -m N            Sets the memory usage of 2^N KiB (default 12)
           -p N            Sets parallelism to N threads (default 1)
           -l N            Sets hash output length to N bytes (default 32)
           -e              Output only encoded hash
           -r              Output only the raw bytes of the hash
           -v (10|13)      Argon2 version (defaults to the most recent version, currently 13)
           -h              Print argon2 usage

圖書館會為您處理這個問題。您只需提供一個隨機數salt並儲存它,如果您想再次獲得相同的結果,請使用相同的鹽。

使用可自由訪問的鹽是否有意義(如果我的數據被盜)?

通常,您可以將這些值(鹽、迭代、記憶體使用、並行化、輸出大小)與您的數據一起儲存。如果您真的想將它們與儲存分開,您可以這樣做,但沒有必要。即使攻擊者知道它們,它也被設計為安全的。當伺服器受到攻擊時,所有這些參數也被攻擊者獲取。鹽用於彩虹表。記住Kerckhoffs 的原則,只有密鑰是秘密的。

有些人建議將鹽作為提高產品安全性的秘密,但是,請記住,如果您的安全性依賴於鹽的安全性,那麼您的設計就存在真正的問題。

有人可以闡明如何將 Argon2 用作基於密碼的密鑰派生函式嗎?

有一種磁碟加密實用程序常用的密鑰加密密鑰 (KEK) 方法。假設文件加密密鑰 (FEK) 是由一個好的隨機源隨機生成的。然後,您的密碼用於使用基於密碼的密鑰派生函式 (PBKDF) 派生 KEK,在您的情況下為 Argon2id。

$$ \text{KEK} = \operatorname{Argon2id}(salt, password) $$ 使用您的 KEK 加密 FEK 並將其儲存在您的目標(您的電腦或手機)上。$$ FEK^* = \operatorname{AES}\hbox{-} Enc_{KEK}(FEK) $$

現在,您要加密文件,使用密碼生成 KEK

$$ \text{KEK} = \operatorname{Argon2id}(salt, password) $$

並使用 KEK 從儲存中解密您的 FEK。

$$ FEK = \operatorname{AES}\hbox{-} Dec_{KEK}(FEK^*) $$

使用經過身份驗證的加密模式(如 AES-GCM 或 ChaCha20-Poly1305)對文件進行加密,並將其儲存在您的電腦或手機上。

$$ \text{EnryptedFile, ATag} = \operatorname{AES}\hbox{-} GCM\hbox{-}Enc_{FEK}(\text{file}) $$ATag身份驗證標籤在哪裡。如果標籤不匹配,切勿解密密文,停止!

您只需將 FEK 保留在系統記憶體中,並在操作完成時將其清除。

這種方法的好處;

  • 你只需要記住你的密碼
  • 加密的 FEK 和 Argon2id 參數可以與文件一起儲存或其他合適的位置供您選擇。
  • 對於每個文件,您可以生成一個新的隨機 FEK。

總是使用隨機鹽進行散列”。

它適用於每個文件或密碼,而不適用於 Argon2 的每次執行。如果要比較文件的雜湊或生成相同的密鑰,則需要得出相同的結果,必須使用相同的參數,包括鹽。為了不忘記鹽,你必須把它寫在某個地方。

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