Encryption
驗證大文件的完整性
我正在尋找最有效的記憶體和時間方法來驗證也必須加密的大文件的完整性。
- 在整個加密文件上使用 SHA256 和其他加密雜湊?
- 將其拆分為塊並分別加密+散列每個塊?
- 使用經過身份驗證的加密?再一次,是逐塊還是作為一個整體?GCM 還是今天有更好的選擇?
- 還有什麼?
謝謝!
我不得不說把它分成塊。儘管您對 large 的定義可能與我的不同,但 GCM 不適合大文件,並且散列整個文件可能會出現問題,特別是如果文件分佈在儲存設備上,並且其中的一部分目前無法按您的順序讀取想。
將其拆分為塊,例如一次 4-16MB,儲存散列的成本非常小,允許您以目前可用的任何順序一次加密多個塊,並允許您驗證所選數據的完整性的順序。
每個大文件都會有一個索引文件,其中包含每個塊的 IV 和完整性雜湊,然後可以獨立於塊進行加密和驗證。如果您已經驗證了索引數據,您可以通過驗證它們的雜湊並解密它們來執行塊的隨機讀取。
只要您使用安全方法進行散列、身份驗證和加密(例如 SHA-512、HMAC-SHA-512、AES-CTR),整個系統就應該是安全的,並且實施起來非常簡單,除了非常快並且能夠處理非常大的文件。根據實現,每個塊至少需要 36 個索引字節,因此具有 16MB 塊的 1TB 文件將需要 2.25MB 索引文件、100TB 225MB 等,並且能夠擴展到每個大文件 64PB,使用144GB索引,必要時也可以用同樣的方法分塊。
如果索引文件已經過身份驗證,由於加密/散列成本,您將看到大約 60 毫秒或更短的延遲來訪問大文件的任何 16MB 塊。較小的塊將提供較低的延遲但較大的索引文件。旋轉儲存延遲較大,讀取和解密之間存在重疊,因此現代 cpu 上的性能影響會小得多,可能遠低於每塊 10 毫秒,因為解密可以與使用相同讀取的散列同時執行,以 1KB 為增量,解密速度不是限制因素。當使用 NVME 驅動器等更快的儲存時,如果您有空閒的 CPU 核心,雜湊樹模式將提高性能。