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

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

加密是在區段中進行,系統會將其繫結至其位置在密文中的位置,且無法移除或重新排序。某個密文的區段無法插入其他密文。如要修改現有的密文,則必須重新加密整個資料串流1

由於只有部分密文會一次解密及驗證,因此解密速度相當快。您不必處理整個密文,即可取得部分明文。

串流 AEAD 實作會完成 AEAD 定義,並且具有 OAE2 安全。這些元件具有以下屬性:

  • 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 則訊息。