第 7 章 安全與加密

7.1 安全模型

DTP 實作 必須 提供端對端加密。安全模型 必須 滿足以下不變量:

  1. 僅目標 iFay 實例 必須 能夠解密接收到的 Payload。
  2. FayGer 執行階段環境 不得 在任何情況下存取明文資料。
  3. 中間網路節點 不得 讀取 Payload 明文。
  4. DTP 實作 不得 自行管理加密金鑰。

7.2 加密範圍

加密範圍 必須 嚴格限定於 LogicalFrame 的 Payload。

7.2.1 必須加密的內容

以下資料 必須 加密:

  • LogicalFrame 的 payload 欄位(即 Fragment 的 data 欄位以及(若以 Frame 方式承載的)RequestFrame、ResponseFrame、ControlFrame 的內容)。

7.2.2 不得加密的內容

以下資料 不得 加密,必須 以明文傳輸:

  • LogicalFrame 的 header(包括 protocolVersionframeTypefragmentIdagreementIdoriginTimestampdagDependenciesencryptionMetadatasequenceNumber)。

加密中繼資料本身 不得 加密,以使接收方能在解密前確定解密參數。

7.3 金鑰管理

7.3.1 金鑰來源

DTP 實作 必須 使用 CAP 預協商的金鑰。具體要求:

  1. CAP 必須 在連線建立階段完成身分驗證與金鑰交換。
  2. DTP 實作 必須 使用 CAP 提供的 sessionKey 進行 Payload 加密/解密。
  3. DTP 實作 不得 自行產生、協商或交換加密金鑰。

7.3.2 CAPContext 介面

DTP 實作 必須 透過以下介面接收 CAP 提供的上下文:

interface CAPContext {
  identity: string;
  sessionKey: Uint8Array;
  verified: boolean;
}
欄位規範性要求
identity必須 為對端身分標識
sessionKey必須 為 CAP 協商出的會話金鑰的位元組序列
verified必須 反映 CAP 驗證狀態

7.3.3 CAP 前置條件

DTP 實作 必須 在開始資料傳輸前驗證 CAPContext:

  1. verified === false必須 拒絕傳送任何資料訊框並返回 KEY_NOT_READY 錯誤(2002)。
  2. sessionKey 為空或長度無效,必須 返回 KEY_NOT_READY 錯誤。
  3. 協商訊框(Request_Frame、Response_Frame)的傳輸 同樣 受此前置條件約束。

7.4 加密中繼資料

每個 LogicalFrame 的訊框標頭 必須 攜帶 EncryptionMetadata:

interface EncryptionMetadata {
  algorithm: string;
  keyVersion: number;
}

7.4.1 演算法識別碼

algorithm 欄位 必須 為加密演算法的識別字串。 使用以下標準化命名之一:

識別碼演算法狀態
"AES-256-GCM"AES-256 in Galois/Counter Mode推薦
"ChaCha20-Poly1305"ChaCha20 with Poly1305推薦
"AES-128-GCM"AES-128 in Galois/Counter Mode 使用

實作 必須 至少支援 AES-256-GCMChaCha20-Poly1305 中的一種。推薦 同時支援兩種以增強互通性。

實作 不得 使用:

  • ECB 模式(不安全)
  • 無認證的加密模式(CBC、CTR 不帶 MAC)
  • 已知存在弱點的演算法(DES、3DES、RC4)

7.4.2 金鑰版本號

keyVersion 必須 為非負整數,用於支援金鑰輪替:

  1. 當 CAP 觸發金鑰輪替時,新金鑰的 keyVersion 必須 嚴格大於上一個版本。
  2. 接收方 必須 使用 keyVersion 選擇對應的解密金鑰。
  3. 實作 維護至少一個舊金鑰版本以支援飛行中(in-flight)的 Fragment。

7.5 加密往返一致性

實作 必須 滿足以下加密往返一致性屬性:

  1. 使用正確金鑰(與傳送方使用的金鑰相符)加密後再解密,必須 產生與原始 Payload 位元組級相同的輸出。
  2. 使用錯誤金鑰解密 必須 失敗,必須 返回 DECRYPTION_FAILED 錯誤(2001)。
  3. 解密失敗時,實作 不得 返回部分解密結果或損壞的資料。

7.6 終端側解密

當終端作為接收方時(資料注入情境):

  1. DTP_Slave 必須 使用終端在 CAP 連線建立階段提交的金鑰進行解密。
  2. 該金鑰 必須 與終端在 CAP 中提交的私鑰/會話金鑰對應。
  3. 終端 不得 接受任何其他金鑰的解密結果。

7.7 解密失敗處理

實作 必須 按以下規則處理解密失敗:

  1. 單次解密失敗:丟棄訊框,傳送 DECRYPTION_FAILED 錯誤通知(2001)。
  2. 連續解密失敗超過閾值(實作定義,推薦 為 3 次): a. 觸發 CAP 重新金鑰交換。 b. 通知上層應用安全異常。
  3. 實作 不得 在多次解密失敗後無限重試同一訊框。

7.8 安全威脅防護

實作 必須 透過協定設計防護以下威脅:

威脅防護機制
中間人竊聽Payload 端對端加密
FayGer 窺探Payload 加密,FayGer 僅可見密文
金鑰洩漏金鑰版本號機制支援金鑰輪替
身分偽造委派給 CAP 驗證
重放攻擊序列號單調遞增 + 會話繫結
訊框竄改使用認證加密(AEAD)演算法

7.9 重放保護

實作 必須 透過以下機制防護重放攻擊:

  1. 序列號單調遞增:接收方 必須 拒絕序列號小於或等於已確認最高序列號的訊框(除非處於續傳情境)。
  2. 會話繫結:序列號空間 必須 與具體會話繫結。新會話 必須 重置序列號。
  3. AEAD 認證:加密演算法 必須 提供訊息認證(GCM、Poly1305 等)。

7.10 中繼資料隱私

實作 注意:訊框標頭中的明文中繼資料 可能 洩漏以下資訊:

  • 通訊對端身分(透過 agreementId 關聯)
  • 通訊時間模式(透過 originTimestampsequenceNumber
  • 資料傳輸頻率(透過訊框之間的時間差)

實作 透過以下方式增強中繼資料隱私:

  1. 啟用流量填充(實作定義)。
  2. 使用混淆傳輸層(如基於 TLS 1.3 的 ECH)。

但本規範 不要求 實作提供中繼資料隱私保護。