其他已驗證資料

其他已驗證資料 (AAD) 是您傳送到 Cloud Key Management Service 做為加密或解密要求一部分的任何字串。AAD 可做為完整性檢查使用,並且可協助避免資料遭受「混淆代理攻擊」。AAD 字串不得超過 64 KiB。

除非針對加密與解密使用相同的 AAD 值,否則 Cloud KMS 不會解密密文。

AAD 會繫結至加密資料,因為如果您不知道 AAD 就無法解密密文,但系統不會將 AAD 儲存為密文的一部分。此外,AAD 不會增加密文的密碼編譯強度,而會做為 Cloud KMS 提供的額外檢查,用來驗證解密要求。

在 Cloud KMS 中,AAD 一律會在您呼叫加密或解密時顯示,如果您未提供 AAD 的值,則會使用空白字串。如果使用空白字串做為 AAD 來加密明文,則只能使用空白字串來解密密文。

Cloud 稽核記錄不會記錄 AAD。

何時使用 AAD

當您將應用程式做為包裝/解除包裝的 Proxy,與單一金鑰和無限數量的用戶端搭配使用,且每個用戶端都在明確安全界線內時,可以使用 AAD。例如,應用程式可以是允許使用者保存私人日誌的日誌應用程式。當使用者需要查看私人日誌項目時,應用程式可使用專屬使用者名稱做為解除包裝 (解密) 要求的 AAD,來明確驗證使用者。在這種情況下,您可以使用單一金鑰來為多個 (不受限) 使用者提供服務。最主要的優點是,您不需要再保留個別使用者的狀態。

再舉一個例子,如果您的應用程式需要使用不記名憑證,其中包含一些私人資訊 (例如電子郵件地址),您也可以使用 ADD。不記名憑證的輸入內容是用於不記名憑證的已驗證資料,以及明文電子郵件地址。這些輸入內容會被加密,所以不記名憑證會以其他加密驗證資料 (AEAD) 的形式交換。

混淆代理攻擊範例

此範例會說明應用程式如何被誘騙,為惡意使用者解密密文。在此範例中,應用程式是一個混淆代理,因為應用程式不知道攻擊者誘騙其濫用權限。結果就是攻擊者可以查看最初為其他使用者加密的解密資料。請注意,在此類攻擊中,攻擊者不需要知道加密金鑰,因為它依賴混淆代理執行解密。

  1. 日誌應用程式允許使用者保存私人日誌。每個日誌項目都會加密,並且只能由建立日誌項目的使用者解密。

  2. Alice 建立了日誌項目。應用程式會加密該日誌項目,然後將加密的日誌項目儲存在保留供 Alice 的日誌項目使用的位置。

  3. Alice 傳送要求,以查看她的日誌項目。由於加密的日誌項目位於保留供 Alice 使用的位置,因此,應用程式會解密資料,並將其做為回應傳回至 Alice 的要求。這是應用程式的預期行為。

  4. Mallory 將 Alice 的日誌項目從保留供 Alice 使用的位置複製到保留供 Mallory 使用的位置。

  5. Mallory 傳送要求,以查看 Mallory 所複製的 Alice 日誌項目。由於 Alice 日誌項目的複本位於保留供 Mallory 使用的位置,因此,應用程式會解密日誌項目,並將明文做為回應傳回至 Mallory 的要求。然後,Mallory 就可以查看 Alice 的日誌項目,而這並不是應用程式的預期行為。

如要防範此類型的攻擊,應用程式可以使用非空白字串做為 AAD,來進行加密與解密。AAD 會為解密要求提供額外檢查。當 Mallory 傳送解密要求以查看 Mallory 複製的 Alice 日誌項目時,除非 Mallory 也能夠誘騙應用程式使用正確的 AAD,否則 Mallory 的要求將不會成功。

儲存或重新產生 AAD

使用 AAD 加密之前,請先決定您將並行「儲存」AAD 和加密資料,還是「重新產生」AAD,以用於後續解密。

儲存 AAD 的原因是,當您需要解密密文時,可以直接使用 AAD。例如,資料庫列包含加密明文時使用的密文和 AAD。收到解密要求時,應用程式可從資料庫擷取 AAD 和密文。然後,應用程式可使用 AAD 進行密文解密程序。

重新產生 AAD 的原因是,這樣可以驗證任何非私人資料,同時也可以避免儲存 AAD。例如,如果您要確保加密檔案的檔案路徑和檔案名稱並未變更,可在加密檔案時加入檔案路徑和檔案名稱做為 AAD。然後,針對檔案傳送解密要求時,您可以檢查檔案路徑和檔案名稱,以重新產生 AAD。

儲存 AAD

儲存 AAD 的意思是系統會儲存 AAD,然後應用程式可隨時取用,以供日後使用。例如,資料庫資料表包含密文資料欄,以及建立密文時使用的 AAD 資料欄。解密密文時,應用程式會擷取 AAD 並將其用於解密。

以日誌應用程式為例,這類應用程式的設計目的在於僅為建立日誌的使用者顯示日誌項目。當建立日誌項目時,系統會將其加密,然後儲存到資料庫的 ENCRYPTED_DIARY_ENTRY 資料欄中。針對查看日誌項目的每個要求,應用程式都會驗證使用者,然後為使用者提供日誌項目。

假設未使用 AAD (預設空白字串除外),並且假設 Mallory 能夠將 Alice 的 ENCRYPTED_DIARY_ENTRY 資料複製到 Mallory 的 ENCRYPTED_DIARY_ENTRY 資料。當 Mallory 針對 Mallory 的 ENCRYPTED_DIARY_ENTRY 資料 (從 Alice 的資料複製而來) 傳送解密要求時,應用程式會執行解密,而不會意識到已經遭到了誘騙。這樣 Mallory 就能夠以明文的形式看到 Alice 的日誌項目。

現在,我們來假設加密日誌項目時,使用使用者電子郵件地址做為 AAD。當 Alice 建立日誌項目時,應用程式會將她的未加密電子郵件地址和 ENCRYPTED_DIARY_ENTRY 資料並行儲存在 EMAIL 資料欄中。再次假設 Mallory 能夠將 Alice 的 ENCRYPTED_DIARY_ENTRY 資料複製到 Mallory 的 ENCRYPTED_DIARY_ENTRY 資料。當 Mallory 傳送解密要求時,應用程式會從 EMAIL 資料欄擷取 Mallory 的電子郵件地址,做為解密要求的 AAD 使用。Mallory 的電子郵件地址將無法成功做為解密的 AAD,因此,應用程式不會讓 Mallory 以明文的形式查看 Alice 的日誌項目。

重新產生 AAD

重新產生 AAD 的意思是不會將 ADD 儲存在任何位置,但您可以在解密時重新產生。

例如,您可以使用檔案路徑和檔案名稱做為 AAD。解密程序期間,假設加密檔案已儲存至 MY_PATH\MY_FILE1.enc,則系統會使用 "MY_PATH\MY_FILE1.enc" 做為 AAD,且不會儲存此 AAD。當收到解密要求時,應用程式會檢查要解密檔案的檔案路徑與檔案名稱,以重新產生 AAD。如果加密檔案未移至其他位置,解密期間將使用 "MY_PATH\MY_FILE1.enc" 做為 AAD,這與加密時使用的 AAD 相同,因此解密程序可以繼續執行。

如果加密檔案移動了,例如移動到 SOME_OTHER_PATH\MY_FILE1.enc,則將使用 "SOME_OTHER_PATH\MY_FILE1.enc" 做為 AAD 進行解密。此 AAD 值與加密時使用的 AAD 值不相符,因此解密程序將失敗。