Aes

密鑰推導:位長

  • November 23, 2018

這是一個後續問題

HKDF:ikm、salt 和 info 值

根據回饋,我現在決定為 AES-GCM-256 文件加密實現我的密鑰派生,大致如下:

在此處輸入圖像描述

scrypt 之前的所有內容都執行一次,每個要加密的文件都重複 HKDF-expand 部分。隨機鹽和資訊值與加密文件一起儲存(未加密)。

我的問題:

  1. 你看到任何嚴重的缺陷嗎?
  2. 您對各種位長有何看法?特別是:當我最終只使用 256 位作為數據保護密鑰時,將所有內容暫時放大到 512 位是否有意義?

資訊值長度為 512 位沒有真正的理由。對它們的唯一要求是唯一的,為此,即使是 128 位的隨機性也足夠了(至少假設您加密的次數不會超過 $ 2^{64} $ 具有相同密鑰的文件)。鹽也是如此。當然,使用更長的值不會真正損害安全性,它只會使您的加密文件更大一些。

我認為使用 512 位中間值沒有問題,即使您最後只生成 256 位密鑰。事實上,我會​​考慮在第一步用 SHA-512 替換 SHA-256,如果只是為了標準化單個雜湊函式。我相信 SHA-512 在現代 64 位 CPU 上甚至更快,儘管與 I/O 和其他成本成本相比,這在實踐中不太可能產生任何顯著差異。

此外,只要您為每個文件使用不同的 IV/nonce,您就不需要不同的密鑰。因此,您可以直接使用主密鑰(截斷為您需要的任何長度)作為 AES-GCM 密鑰,而完全不用 HKDF。或者您可以繼續使用 HKDF-Expand(例如,如果您出於某種原因需要從主密鑰派生其他密鑰材料),但只使用固定的資訊字元串呼叫它一次(例如,“AES-256-GCM-key”或其他合理獨特和資訊豐富的東西)來導出加密密鑰。

您甚至可以考慮使用 HKDF 從主密鑰派生 GCM IV,使用類似“AES-256-GCM-IV-< counter >”的資訊字元串,其中 < counter > 是一個增量計數器,用於生成所有資訊字元串給定的主密鑰是唯一的。(您也可以將例如文件名和目前時間附加到資訊字元串中,以防萬一主密鑰以某種方式被重用。)您不需要將此資訊字元串儲存在任何地方,因為您可以只儲存 IV 派生改為使用它。使用這種方法而不是僅僅使用隨機 IV 的主要優點是它可以保護您免受系統 RNG 故障的(小但非零)風險。當然,如果你願意,你也可以仍然在用於派生 IV 的資訊字元串中包含一堆隨機位。


請注意,根據NIST SP 800-38D第 8.3 節,您加密的次數不應超過 $ 2^{32} $ 使用相同密鑰和隨機 IV 的 GCM 模式文件。這是為了保持 IV 碰撞的風險足夠小。如果您確實發現自己需要一次加密更多的文件,那麼避開限制的最簡單方法可能就是使用不同的鹽從散列密碼中重新派生一個新的主密鑰。這意味著重新執行 scrypt,但每次都這樣做 $ 2^{32} $ 文件可能不是一個重要的性能問題。

實際上,一個更重要的限制是 SP 800-38D 第 5.2.1.1 節還將使用 AES-GCM 加密的文件的長度限制為小於 $ 2^{39}-256 $ 位 = 64 GiB(準確地說是減去 32 個字節)。如果您需要加密比 GCM 更長的文件,您需要將其分成更短的部分,並將它們與本文中的 CHAIN 結構相結合。


至於其他問題,一個潛在的問題是,對多個文件使用從相同鹽派生的相同主密鑰,並將未加密的鹽儲存在文件本身中,可以查看兩個文件是否已被同一使用者加密同時。這可能是不必要的資訊洩漏。

不幸的是,沒有簡單的方法可以解決這個問題,除非您可以將鹽儲存在其他地方(在哪裡?),為每個文件使用不同的鹽(這會使加密速度變慢,因為您需要為每個文件重新執行 scrypt)或完全省略鹽(不建議這樣做,因為它使您的方案容易受到使用預先計算的密碼 ⇆ scrypt(password) 表的攻擊)。儘管如此,至少,您應該清楚地告知您的使用者,並且可能會提供一個選項來為每個文件使用新的鹽,但會以性能為代價。

一般來說,對於鹽等參數,您應該可以使用最小大小為 128 位和最大大小為 256 位的參數。儘管由於生日問題您應該將安全參數減半,但我認為大多數密碼學家仍然會選擇 256 位鹽作為最大值。

生日問題不太可能用於增強安全性超過它提供的 192 位安全性 $ 2^{64} $ 文件。所以你會有一個非常大的 256 位邊距。鹽有時甚至設置為 64 位——例如在用於加密的 OpenSSL 命令行中——但就像 64 位的任何東西一樣,現在可能處於低位。


WRT 結構的安全性而不是鹽的大小

請注意,為基於密碼的加密宣傳 256 位的安全強度是相當不真誠的。密碼通常具有遠低於 64 位的安全強度。即使是強大的密鑰強化功能(如 scrypt)也不會為此增加顯著的強度。

通過使用公鑰加密可以部分解決此類問題,其中公鑰用於加密,而私有解密密鑰可以保存在不易訪問的位置,直到使用為止。該私鑰可能也需要包裝,可能使用問題中指定的方案。OpenPGP 是一種(舊)格式,可以這樣描述。

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