SPECIFICATION
第 7 章 安全與加密
7.1 安全模型
DTP 實作 必須 提供端對端加密。安全模型 必須 滿足以下不變量:
- 僅目標 iFay 實例 必須 能夠解密接收到的 Payload。
- FayGer 執行階段環境 不得 在任何情況下存取明文資料。
- 中間網路節點 不得 讀取 Payload 明文。
- DTP 實作 不得 自行管理加密金鑰。
7.2 加密範圍
加密範圍 必須 嚴格限定於 LogicalFrame 的 Payload。
7.2.1 必須加密的內容
以下資料 必須 加密:
- LogicalFrame 的
payload欄位(即 Fragment 的data欄位以及(若以 Frame 方式承載的)RequestFrame、ResponseFrame、ControlFrame 的內容)。
7.2.2 不得加密的內容
以下資料 不得 加密,必須 以明文傳輸:
- LogicalFrame 的
header(包括protocolVersion、frameType、fragmentId、agreementId、originTimestamp、dagDependencies、encryptionMetadata、sequenceNumber)。
加密中繼資料本身 不得 加密,以使接收方能在解密前確定解密參數。
7.3 金鑰管理
7.3.1 金鑰來源
DTP 實作 必須 使用 CAP 預協商的金鑰。具體要求:
- CAP 必須 在連線建立階段完成身分驗證與金鑰交換。
- DTP 實作 必須 使用 CAP 提供的
sessionKey進行 Payload 加密/解密。 - 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:
- 如
verified === false,必須 拒絕傳送任何資料訊框並返回KEY_NOT_READY錯誤(2002)。 - 如
sessionKey為空或長度無效,必須 返回KEY_NOT_READY錯誤。 - 協商訊框(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-GCM 與 ChaCha20-Poly1305 中的一種。推薦 同時支援兩種以增強互通性。
實作 不得 使用:
- ECB 模式(不安全)
- 無認證的加密模式(CBC、CTR 不帶 MAC)
- 已知存在弱點的演算法(DES、3DES、RC4)
7.4.2 金鑰版本號
keyVersion 必須 為非負整數,用於支援金鑰輪替:
- 當 CAP 觸發金鑰輪替時,新金鑰的
keyVersion必須 嚴格大於上一個版本。 - 接收方 必須 使用
keyVersion選擇對應的解密金鑰。 - 實作 應 維護至少一個舊金鑰版本以支援飛行中(in-flight)的 Fragment。
7.5 加密往返一致性
實作 必須 滿足以下加密往返一致性屬性:
- 使用正確金鑰(與傳送方使用的金鑰相符)加密後再解密,必須 產生與原始 Payload 位元組級相同的輸出。
- 使用錯誤金鑰解密 必須 失敗,必須 返回
DECRYPTION_FAILED錯誤(2001)。 - 解密失敗時,實作 不得 返回部分解密結果或損壞的資料。
7.6 終端側解密
當終端作為接收方時(資料注入情境):
- DTP_Slave 必須 使用終端在 CAP 連線建立階段提交的金鑰進行解密。
- 該金鑰 必須 與終端在 CAP 中提交的私鑰/會話金鑰對應。
- 終端 不得 接受任何其他金鑰的解密結果。
7.7 解密失敗處理
實作 必須 按以下規則處理解密失敗:
- 單次解密失敗:丟棄訊框,傳送
DECRYPTION_FAILED錯誤通知(2001)。 - 連續解密失敗超過閾值(實作定義,推薦 為 3 次): a. 應 觸發 CAP 重新金鑰交換。 b. 應 通知上層應用安全異常。
- 實作 不得 在多次解密失敗後無限重試同一訊框。
7.8 安全威脅防護
實作 必須 透過協定設計防護以下威脅:
| 威脅 | 防護機制 |
|---|---|
| 中間人竊聽 | Payload 端對端加密 |
| FayGer 窺探 | Payload 加密,FayGer 僅可見密文 |
| 金鑰洩漏 | 金鑰版本號機制支援金鑰輪替 |
| 身分偽造 | 委派給 CAP 驗證 |
| 重放攻擊 | 序列號單調遞增 + 會話繫結 |
| 訊框竄改 | 使用認證加密(AEAD)演算法 |
7.9 重放保護
實作 必須 透過以下機制防護重放攻擊:
- 序列號單調遞增:接收方 必須 拒絕序列號小於或等於已確認最高序列號的訊框(除非處於續傳情境)。
- 會話繫結:序列號空間 必須 與具體會話繫結。新會話 必須 重置序列號。
- AEAD 認證:加密演算法 必須 提供訊息認證(GCM、Poly1305 等)。
7.10 中繼資料隱私
實作 應 注意:訊框標頭中的明文中繼資料 可能 洩漏以下資訊:
- 通訊對端身分(透過
agreementId關聯) - 通訊時間模式(透過
originTimestamp與sequenceNumber) - 資料傳輸頻率(透過訊框之間的時間差)
實作 可 透過以下方式增強中繼資料隱私:
- 啟用流量填充(實作定義)。
- 使用混淆傳輸層(如基於 TLS 1.3 的 ECH)。
但本規範 不要求 實作提供中繼資料隱私保護。
