Aes

使用 iv/salt/iterations 儲存的逐行加密日誌記錄。它有多安全?

  • March 23, 2020

我正在建構一個加密的日誌記錄應用程序。日誌條目使用 AES-256-GCM 加密,使用密碼派生密鑰和 PBKDF2。應用程序必須支持日誌輪換,我想讓每個日誌條目“自給自足”。這將允許我丟棄以前已經處理過/太舊的日誌。

自給自足是指擁有日誌條目和密碼就足以解密有效負載。我不希望維護一個單獨的文件/記錄,其中包含有關密鑰或其派生的資訊。

這意味著我必須在每個日誌條目中儲存一大堆資訊:

  • pbkdf2鹽
  • pbkdf2 迭代
  • iv
  • gcm 標籤
  • 加密有效載荷

PBKDF2 salt 和迭代不太可能經常更改(如果有的話)。IV將為每個日誌條目隨機生成。payload 是使用者提供的內容 tag 是 GCM 加密的驗證標籤。

以下是此類日誌文件的範例:

timestamp  pbkdf2 salt              iter   iv               tag                      encrypted payload
1584815488,IqdD09R5kbtA4recw5LQeg==,100000,IxsZwVEjYvO0vgjl,w4EdRjRJQNCK/sOYKYyXYA==,DCqFFCGQbpYhWEy3u3OlKMN2iMn9JF2vFZFY
1584815488,IqdD09R5kbtA4recw5LQeg==,100000,n1PscNktuug1Os7b,e1oZAg31XCZOZUC4ZrKjzg==,cLhr1baGonaTt/k/PJZ2s5hboTBjNCmqFu281w==
1584815488,IqdD09R5kbtA4recw5LQeg==,100000,RqKtky2ICMORWqGZ,G5VHGDkhWuUch7ZN0AiRBg==,mjexQ9aUHCZGomrlrnQrk6K9ULBEYHPSsjeAxw==
1584815488,IqdD09R5kbtA4recw5LQeg==,100000,JY3h/TQSlk+yP/5W,bXL8xK5QVC9uPi2vJ+IDQw==,xu5e/UKPyeEnghFVJL+JLmV2yXYlN2cKBmGGZw==
1584815488,IqdD09R5kbtA4recw5LQeg==,100000,W/3uKytKkGmPezdP,HuGNKT6L+Bh/bEvwnlkI5A==,rwVB3ssIKNaz0ZldNRR608JKOIjlimnuu5ZAyQ==
1584815488,IqdD09R5kbtA4recw5LQeg==,100000,l7RSko8EvTydWWgt,Ahwjm63IR/8MK03gn//uQQ==,cVS+O0nP7BrhuFCheXn1EDSdGSXumzu8PL1cUQ==
1584815488,IqdD09R5kbtA4recw5LQeg==,100000,H+5ywMwpalZVPwLj,nzVSRSz08gJ+OxcktniAOQ==,4WbpNcfcIEcx0wDyzH7s40u+Utx+xzlIFfosuA==
1584815488,IqdD09R5kbtA4recw5LQeg==,100000,hF5i+nCT3lFFxHJh,w9MYSR4j3tlebur+ZkUyVg==,9ZIlK8ooUhV0AVAJso6DIstAZ3IdxXCbNhpG4A==
1584815488,IqdD09R5kbtA4recw5LQeg==,100000,RAqAaY4cXsAMXZ3m,JzS4uU4QuMeenWqOMnCoRA==,phjLHaBeETJ+H5mRq0i1EUIe/MIbNmxEnNhLcA==
1584815488,IqdD09R5kbtA4recw5LQeg==,100000,iGXfpm7FZ7Rmj0F1,TRi0/ElsdCbdUUGBrhxqhQ==,P2yMW+1pn9F7kTTU7bWOm19xrjWQU+0UuhJGKw==
1584815488,IqdD09R5kbtA4recw5LQeg==,100000,IXNxT6RwDu3BnoFB,7khAMRKSLcE6nAcxdUsQbQ==,FMv3gUuO5Q2HVwetr/uo73ph4UOuA+Z3IOiXEg==
  1. 將所有這些資訊儲存在同一個地方是否安全?
  2. 一個日誌文件通常會包含成百上千個這樣的條目。隨著條目數的增加,加密是否會顯著變弱?
  3. 出於實際原因,時間戳必須以明文形式儲存。但是,我想驗證它沒有被篡改。最好的方法是什麼?
  1. 將所有這些資訊儲存在同一個地方是否安全?

列出的所有資訊(salt、pbkdf2、迭代、iv、GCM 標籤、加密有效負載)都可以視為公共資訊。我們已經考慮到攻擊者除了知道Kerckhoffs 原理的加密密鑰之外的所有這些知識。

  1. 一個日誌文件通常會包含成百上千個這樣的條目。隨著條目數的增加,加密是否會顯著變弱?

IV是隨機生成的。如果隨機生成器很弱,​​那麼它可能會導致 IV 重用,這對於 AES-GCM 來說是一個很大的安全問題,因為底層的 CTR 模式可以通過拖拽顯示明文,甚至更多可能導致偽造品

可以按照 NIST 800-38d 8.2 IV 結構的建議使用計數器或 LFSR 生成 IV ,這樣它就不會重複。一個更好的主意是半計數器/LFSR 半隨機。

$$ \text{nonce} = \text{random} \mathbin| \text{LFSR} $$ 這可以防止系統故障問題,即計數器/LFSR 的最後階段未儲存,然後可能導致隨機數重複。儘管可能會重複計數器/LFSR 階段,但新的隨機數將防止 IV 重用問題。

AES-GCM 具有 IND-CCA2,它並沒有變弱,尤其是 256 位密鑰大小。但是,在一段時間內更改密鑰可能是個好主意。這可以使用主密鑰和使用HKDF的派生密鑰形式或對 PBKDF2 使用不同的鹽來完成。

  1. 出於實際原因,時間戳必須以明文形式儲存。但是,我想驗證它沒有被篡改。最好的方法是什麼?

認證加密 (AE) 也稱為帶有關聯數據的認證加密 (AEAD)。您可以提供時間戳作為關聯數據,AES-GCM將在完整性部分使用它。這是為此類目的而設計的。這可以形式化為

$$ (C,T) \leftarrow \operatorname{AES-GCM-}\mathcal{E}^{N,A}_K (M) $$在哪裡

$ \mathcal{E} $ 代表加密, $ K $ 代表鑰匙, $ N $ 代表隨機數, $ A $ 代表相關數據。C是密文,T是認證標籤。同理解密;

$$ (M | \perp) \leftarrow \operatorname{AES-GCM-}\mathcal{D}^{N,A}_K (C) $$在哪裡 $ \mathcal{D} $ 是解密和 $ \perp $ 是標籤不匹配停止。

每條評論更新

如果攻擊者擁有該日誌文件的一行,以及相應的明文負載會怎樣。例如,知道上面範例的第 1 行表示“初始日誌條目”。這會損害密鑰嗎?

AES 是原始的,它應該是一個偽隨機排列。它可以通過使用適當的操作模式與AES一起實現IND-CPAIND-CCA或認證加密。

我們假設已經解決了 IV 重用,那麼在 AES-GCM 的 CTR 加密中,我們有;

$$ C_i = P_i \oplus \operatorname{AES}(k, \text{nonce}\mathbin|\text{counter}_i) $$這意味著攻擊者將知道明文和密文塊。這實際上是已知的明文攻擊 ( KPA ),並且 AES 被認為是安全的。您還可以在此處閱讀遠離它的對 AES-128 和 AES-256 的可能攻擊。

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