大文件的並行文件加密和身份驗證
對於雲儲存上傳客戶端,我想在上傳期間加密文件,以便雲服務提供商或任何有權訪問該帳戶的人都無法讀取它們。我想使用一些標準格式,而不是滾動我自己的加密貨幣,但我找不到任何我想要的東西。
主要問題是我想拆分大文件並並行上傳以最大化頻寬。如果部分上傳失敗,我可能不得不返回並再次上傳相同的部分。因此,我需要一個加密方案,它只允許加密文件中的某些部分。此外,應避免在上傳之前進行完整的身份驗證。
在過去兩天大量閱讀之後,我想出了以下方案:將文件拆分為固定大小(幾 KB)的塊。計算每個單獨塊的 SHA-1 雜湊並將其附加到明文中。在 CBC 模式下使用 AES 加密明文和以下雜湊,每個塊都有一個隨機 IV。這類似於RFC 4880為對稱加密指定的內容,只是使用了塊。這為每個單獨的塊提供了身份驗證。為了保護整個文件,使用相同的技術處理一個附加的最後一個塊,其中包含所有塊雜湊的串聯。
從 RFC 4880 文件中可以清楚地看出,這僅提供適度的安全性以防止修改。所以我正在考慮進一步的改進。可以用 HMAC 代替簡單散列函式的使用。從本文件中可以清楚地看出,先驗證後加密通常並不安全。但是,對於 CBC 模式,這不適用,因此我想保留先驗證後加密,因為它可以輕鬆檢查加密密鑰,而無需解密整個文件。我也不是很高興,最後一個塊重複了所有以前的雜湊。也許一個 HMAC 關閉所有以前的雜湊就足夠了?我希望有人可以闡明這種技術的實際安全性。
我還偶然發現了 GCM,這似乎正是我想要的。但是,我知道有 ~68GB 的限制,可以為給定的 IV/密鑰對加密。接近這個限制是安全的,還是應該遠遠低於這個限制?此外,我沒有找到任何好的 Python 庫,它實際上允許使用 GCM 進行並行加密。
回答你的想法:
- “我使用雜湊然後加密”和 CBC + SHA-1
- “我使用 MAC-then-encrypt” 與 CBC + HMAC
- “由於使用指南不明確,我不會使用 GCM”
首先,hash-then-encrypt 是一個非常糟糕的主意。如果可能的話,你真的應該避免它。詳細資訊在 Crypto.SE 上的相關問題中進行了解釋。
其次,MAC-then-encrypt 是一個你也應該避免的概念。不僅通用的組合安全證明通常不成立,而且它還允許在某些情況下填充 oracle 攻擊,因此 encrypt-then-MAC 更好,並且與更通用的安全相比,使用 authenticate-then-encrypt 沒有顯著優勢加密然後驗證。另請參閱我們關於此主題的規範問題。
第三:GCM。您確實只應該在給定的 key-nonce 對下加密少於 60GiB 的數據。但是,您可以為您的數據塊(每個數 kB)分配(升序)隨機數,並使用不同的隨機數對其進行身份驗證加密。通過這種方式,您可以保持低於 60GB 的限制,並且可以確定地生成您的 nonce(使用計數器增量),這也將非常可靠地保護您免受基於 nonce 衝突的 nonce 重用。在檢索數據後,您可以檢查所有塊是否有效以及是否缺少一個塊(因為隨機數中有一個間隙),也許您希望將塊的數量編碼到每個塊中以允許正確驗證。