使用關聯資料進行串流驗證加密 (串流 AEAD)

串流 AEAD 原始功能可為串流資料提供經過驗證的加密功能。當要加密的資料過大,無法在單一步驟中處理時,這項功能就很實用。常見用途包括加密大型檔案或即時資料串流。

系統會分段加密,並將該區段繫結至密文中的其位置,因此無法移除或重新排序。來自一個密文的片段無法插入另一個密文。如要修改現有的密文,必須重新加密整個資料串流。1

解密速度快,因為系統只會一次解密及驗證密文的一部分。您不必處理整個密文,即可取得部分明文。

串流 AEAD 實作符合 AEAD 定義,且為 nOAE 安全。這些屬性包括:

  • Secrecy:除了長度以外,任何明文皆無已知的資訊。
  • 真實性:如果沒有偵測到,就無法變更基礎加密的明文。
  • 對稱式:以相同的金鑰加密明文與解密密文。
  • 隨機:加密方式為隨機。具有相同明文的兩則訊息會產生不同的密文。攻擊者無法得知哪個密文對應至特定明文。

相關資料

您可以使用串流 AEAD 將密文繫結至特定相關資料。假設您有一個資料庫,欄位為 user-idencrypted-medical-history。在這種情況下,user-id 可用於加密 encrypted-medical-history 時做為相關聯資料。這可防止攻擊者將醫療記錄從一位使用者轉移至另一位使用者。

選擇金鑰類型

我們建議您在大多數情況下使用 AES128_GCM_HKDF_1MB。一般而言:

  • AES128_GCM_HKDF_1MB (或 AES256_GCM_HKDF_1MB) 是較快的選項。可將 264 個檔案加密,每個檔案最多可達 264 位元組。在加密和解密程序中,系統會耗用約 1 MB 的記憶體。
  • AES128_GCM_HKDF_4KB 會消耗約 4 KB 的記憶體,如果系統記憶體不多,這是不錯的選擇。
  • AES128_CTR_HMAC_SHA256_1MB (或 AES256_CTR_HMAC_SHA256_1MB) 是較保守的做法。

安全性保證

串流 AEAD 實作方式提供:

  • CCA2 安全性。
  • 至少 80 位元驗證強度。
  • 能夠加密至少 264 則訊息3,總共 251 位元組2。在選取的明文或密文中,最多 232 個攻擊的成功機率大於 2-32

用途範例

請參閱「我想加密大型檔案或資料串流」。


  1. 這項限制的原因是使用了 AES-GCM 加密。在相同位置加密不同的明文區段,等同於重複使用 IV,這會違反 AES-GCM 的安全保證。另一個原因是,這可防止回溯攻擊,攻擊者可能會嘗試還原先前版本的檔案,而不會被偵測到。 

  2. 系統支援 232 個區段,每個區段包含 segment_size - tag_size 個純文字位元組。對於 1 MB 區段,純文字的總大小為 232 * (220-16) ~= 251 個位元組。

  3. 重複使用衍生金鑰 (128 位元) 和 Nonce 前置字 (獨立的隨機 7 個位元值) 組合時,串流 AEAD 就會變得不安全。我們採用 184 位元碰撞抵抗力,如果希望成功機率低於 2-32,則大致等同於 264 則。