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

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

加密作業會以區段進行,這些區段會綁定在密文內的特定位置,且無法移除或重新排序。一個密文的片段無法插入另一個密文。如要修改現有的密文,必須重新加密整個資料串流。1

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

串流 AEAD 實作符合 AEAD 定義,且為 nOAE 安全。其屬性如下:

  • Secrecy:除了長度之外,沒有人知道明文的任何內容。
  • Authenticity:系統會偵測出加密文字底層的加密明文是否遭到竄改。
  • Symmetric:使用相同的金鑰加密明文和解密密文。
  • 隨機化:加密方式為隨機。兩則含有相同明文的訊息會產生不同的密文。攻擊者無法得知哪個密文對應至特定明文。

相關資料

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

選擇金鑰類型

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

  • AES-GCM-HKDF
    • AES128_GCM_HKDF_1MB (或 AES256_GCM_HKDF_1MB) 是較快的選項。可將 264 個檔案加密,每個檔案最多可達 264 位元組。在加密和解密程序中,系統會耗用約 1 MB 的記憶體。
    • AES128_GCM_HKDF_4KB 會消耗約 4 KB 的記憶體,如果系統記憶體不多,這是不錯的選擇。
  • AES-CTR HMAC
    • 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 則。