加密 h(k) 以擊敗分區預言機攻擊
正在加密 $ h(k) $ (甚至只是 $ k $ ) 並在檢查 MAC 足以擊敗分區預言攻擊之前對其進行驗證,從而使整個方案健壯/送出(不依賴於密碼的屬性,不像 0 填充)?
更新1:
基本上 $ E_k(h(k)\mathbin|m) $ 或者 $ E_k(k\mathbin|m) $ 在哪裡 $ E $ 是一種 AEAD 模式,如 $ (x)chacha20poly1305 $ . 這 $ k $ 源自 pkdf 的密碼,例如 argon2/scrypt/etc。在開始時,它在兩端進行計算,但隨後解密密文的一方也檢查是否 $ h(k) $ (要不就 $ k $ ) 正確附加在消息之前。
如果預言機返回標籤正確與否等資訊,分區預言機攻擊就會起作用。沒有回應,就根本沒有 Oracle。這些資訊也可以從旁道獲得。
分區預言機只是通過對密碼進行分組來加速密碼攻擊。密碼是從一組可能的密碼列表中選擇的 $ \mathcal{D} $ 對應的密鑰由 PBKDF 生成。相應的密鑰被分組在可以正確解密**的密文下。**這裡必須注意,正確解密的密文根本不需要有一些有意義的明文。攻擊者只要求在分組密鑰下,密文有有效或無效的標籤資訊返回給他們。這種攻擊是有效的,因為 GCM 和 Poly1305 是非送出的,即找到一對密鑰和在兩個密鑰下解密的密文(及其標籤)在計算上是可行的。
對於更新 1
基本上 $ E_k(h(k)\mathbin|m) $ 或者 $ E_k(k\mathbin|m) $ 在哪裡 $ E $ 是一種 AEAD 模式,如 $ (x)chacha20poly1305 $ . 這 $ k $ 源自 pkdf 的密碼,例如 argon2/scrypt/etc。在開始時,它在兩端進行計算,但隨後解密密文的一方也檢查是否 $ h(k) $ (要不就 $ k $ ) 正確附加在消息之前。
如果一個使用 $ E_k(h(k)\mathbin|m) $ 或者 $ E_k(k\mathbin|m) $ ,則可能出現兩種情況;
- **標籤無效。**這意味著預言機必須返回 $ \texttt{tag invalid} $ 回复。現在,這就是分區預言機攻擊的核心。他們向伺服器發送了一個密文,該密文有一個有效的標籤 $ k $ 密碼。返回無效只是消除了 $ k $ 可通過已知密碼列表中的密碼 $ \mathcal{D} $ .
如果通信是單向的,則不需要返回任何標籤。但這實際上取決於協議。通常的協議必須響應。 2. **標籤有效。**在這種情況下,我們將返回您的修改。現在您將響應消息格式無效。Viola,分區oracle依然得到目前測試的資訊 $ k $ password 包含標籤通過後的有效密碼。
當然,對於這兩種情況,攻擊者都需要消除誤報。這些發生的可能性很小。
主要的緩解措施是使用尚未標準化的送出 AEAD,或者使用帶有一個密鑰的 HMAC 作為 Encrypt-Then-HMAC。請記住,始終建議使用強密碼。
對於更新 2
第一個塊也包含 $ k $ 或者 $ h(k) $ 將在檢查 MAC 標籤之前被解密(作為例外,與以下塊不同)。這是為了驗證是否 $ k $ 或者 $ h(k) $ 在消息中加密的 k 與我們在驗證 MAC 標籤之前解密時使用的 k 匹配(為了不洩露有關 MAC 標籤是否無效的資訊)。如果加密的 k 或 $ h(k) $ 與解密 k 不匹配,則解密中止(在檢查任何 MAC 標籤之前)
在這種情況下,我看不出分區預言攻擊會起作用。攻擊者仍然可以分組,但隨機文本具有密鑰雜湊的機率為 $ 1/2^{256} $ 如果使用 SHA-256。因此沒有可行的攻擊。
標準的線上密碼攻擊仍然有效。因此,仍然採用具有良好強度密碼的通常建議。
我不喜歡在同一個密鑰下加密密鑰的想法,儘管我們預計 AES 或 ChaCha20 不會出現問題。如果我對此有誤,有人可以糾正我。