AWS 資料庫加密 SDK 概念 - AWS 資料庫加密 SDK

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

AWS 資料庫加密 SDK 概念

我們的用戶端加密程式庫已重新命名為 AWS 資料庫加密 SDK。此開發人員指南仍會提供 DynamoDB Encryption Client 的相關資訊。

本主題說明 AWS 資料庫加密 SDK 中使用的概念和術語。

若要了解 AWS 資料庫加密 SDK 的元件如何互動,請參閱 AWS 資料庫加密 SDK 的運作方式

若要進一步了解 AWS 資料庫加密 SDK,請參閱下列主題。

封套加密

加密資料的安全性有一部分取決於保護能夠解密資料的資料金鑰。加密處理金鑰是保護資料金鑰的一種最佳實務。若要這樣做,您需要另一個加密金鑰,稱為金鑰加密金鑰包裝金鑰。使用包裝金鑰加密資料金鑰的做法稱為信封加密

保護資料金鑰

AWS Database Encryption SDK 會使用唯一的資料金鑰加密每個欄位。然後,它會在您指定的包裝金鑰下加密每個資料金鑰。它會將加密的資料金鑰存放在材料描述中。

若要指定包裝金鑰,請使用 keyring

使用 AWS 資料庫加密 SDK 進行信封加密
在多個包裝金鑰下加密相同的資料

您可以使用多個包裝金鑰來加密資料金鑰。您可能想要為不同的使用者提供不同的包裝金鑰,或包裝不同類型的金鑰,或在不同的位置。每個包裝金鑰都會加密相同的資料金鑰。 AWS Database Encryption SDK 會將所有加密的資料金鑰與材料描述中的加密欄位一起存放。

若要解密資料,您需要提供至少一個可解密加密資料金鑰的包裝金鑰。

結合多種演算法的優勢

為了加密您的資料, AWS 資料庫加密 SDK 預設會使用具有 AES-GCM 對稱加密的演算法套件、HMAC 型金鑰衍生函數 (HKDF) 和 ECDSA 簽署。若要加密資料金鑰,您可以指定適合您包裝金鑰的對稱或非對稱加密演算法

一般而言,相較於非對稱或公有金鑰加密,對稱金鑰加密演算法速度較快,產生的加密文字較小。但公有金鑰演算法提供固有的角色區隔。若要結合每個 的優勢,您可以使用公有金鑰加密來加密資料金鑰。

我們建議您盡可能使用其中一個 AWS KMS keyring。當您使用 AWS KMS keyring 時,您可以選擇透過指定非對稱 RSA AWS KMS key 做為包裝金鑰來結合多個演算法的強度。您也可以使用對稱加密 KMS 金鑰。

資料金鑰

資料金鑰是一種加密金鑰, AWS 資料庫加密 SDK 用來加密在密碼編譯動作ENCRYPT_AND_SIGN中標記的記錄中的欄位。每個資料金鑰是符合密碼編譯金鑰需求的位元組陣列。 AWS Database Encryption SDK 使用唯一的資料金鑰來加密每個屬性。

您不需要指定、產生、實作、延伸、保護或使用資料金鑰。當您呼叫加密和解密操作時, AWS 資料庫加密 SDK 會為您執行。

為了保護您的資料金鑰, AWS 資料庫加密 SDK 會使用一或多個稱為包裝金鑰的金鑰加密金鑰來加密它們。在 AWS 資料庫加密 SDK 使用您的純文字資料金鑰加密您的資料後,它會盡快將其從記憶體中移除。然後將加密的資料金鑰存放在材料描述中。如需詳細資訊,請參閱 AWS 資料庫加密 SDK 的運作方式

提示

在 AWS Database Encryption SDK 中,我們將資料金鑰資料加密金鑰區分開來。最佳實務是,所有支援的演算法套件都使用金鑰衍生函數。金鑰衍生函數會採用資料金鑰做為輸入,並傳回實際用來加密記錄的資料加密金鑰。因此,我們通常會說資料是在資料金鑰「底下」加密,而不是「由」資料金鑰加密。

每個加密的資料金鑰都包含中繼資料,包括加密它的包裝金鑰的識別符。此中繼資料可讓 AWS 資料庫加密 SDK 在解密時識別有效的包裝金鑰。

包裝金鑰

包裝金鑰是金鑰加密金鑰, AWS 資料庫加密 SDK 用來加密加密記錄的資料金鑰。每個資料金鑰都可以在一或多個包裝金鑰下加密。當您設定 keyring 時,您可以決定使用哪些包裝金鑰來保護資料。

使用多個包裝金鑰加密一個資料金鑰

AWS Database Encryption SDK 支援數個常用的包裝金鑰,例如 AWS Key Management Service(AWS KMS) 對稱加密 KMS 金鑰 (包括多區域 AWS KMS 金鑰) 和非對稱 RSA KMS 金鑰、原始 AES-GCM (進階加密標準/Galois 計數器模式) 金鑰,以及原始 RSA 金鑰。我們建議您盡可能使用 KMS 金鑰。若要決定應使用哪個包裝金鑰,請參閱選取包裝金鑰

當您使用信封加密時,您需要保護包裝金鑰免於未經授權的存取。您可以透過下列任何方式執行此操作:

如果您沒有金鑰管理系統,建議您使用 AWS KMS。 AWS Database Encryption SDK 與 整合 AWS KMS ,可協助您保護和使用您的包裝金鑰。

Keyrings

若要指定用於加密和解密的包裝金鑰,請使用 keyring。您可以使用 AWS Database Encryption SDK 提供的 keyring 或設計您自己的實作。

Keying 會產生、加密和解密資料金鑰。它也會產生 MAC 金鑰,用來計算簽章中的雜湊型訊息驗證碼 (HMACs)。當您定義 keyring 時,您可以指定用來加密資料金鑰的包裝金鑰。大多數 keyring 會指定至少一個包裝金鑰,或提供和保護包裝金鑰的服務。加密時, AWS 資料庫加密 SDK 會使用 keyring 中指定的所有包裝金鑰來加密資料金鑰。如需選擇和使用 AWS Database Encryption SDK 定義的 keyring 的說明,請參閱使用 keyring。

密碼編譯動作

密碼編譯動作會告知加密程式要在記錄中的每個欄位執行哪些動作。

密碼編譯動作值可以是下列其中一項:

  • 加密和簽署 – 加密 欄位。在簽章中包含加密的欄位。

  • 僅限簽署 – 在簽章中包含 欄位。

  • 在加密內容中簽署並包含 - 在簽章和加密內容中包含 欄位。

    根據預設,分割區和排序索引鍵是加密內容中包含的唯一屬性。您可以考慮定義其他欄位,SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT以便AWS KMS 階層式 keyring 的分支金鑰 ID 供應商可以識別從加密內容解密所需的分支金鑰。如需詳細資訊,請參閱分支金鑰 ID 供應商

    注意

    若要使用SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT密碼編譯動作,您必須使用 3.3 版或更新版本的 AWS 資料庫加密 SDK。將您的資料模型更新為包含 之前,先將新版本部署至所有讀者SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT

  • 什麼都不做 – 請勿加密或包含簽章中的 欄位。

對於任何可以存放敏感資料的欄位,請使用加密和簽署。對於主索引鍵值 (例如 DynamoDB 資料表中的分割區索引鍵和排序索引鍵),請使用僅簽署簽署,並包含在加密內容中。如果您指定任何 Sign 並包含在加密內容屬性中,則分割區和排序屬性也必須是 Sign 並包含在加密內容中。您不需要為材料描述指定密碼編譯動作。 AWS Database Encryption SDK 會自動在儲存材料描述的 欄位上簽署。

請謹慎選擇您的密碼編譯動作。如有疑問,請使用加密並簽署。使用 AWS Database Encryption SDK 保護您的記錄後,您無法將現有的 ENCRYPT_AND_SIGNSIGN_ONLYSIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT 欄位變更為 DO_NOTHING,或變更指派給現有DO_NOTHING欄位的密碼編譯動作。不過,您仍然可以對資料模型進行其他變更。例如,您可以在單一部署中新增或移除加密的欄位。

資料描述

材料描述做為加密記錄的標頭。當您使用 AWS 資料庫加密 SDK 加密和簽署欄位時,加密程式會在組合密碼編譯材料時記錄材料描述,並將材料描述存放在加密程式新增至記錄的新欄位 (aws_dbe_head) 中。

材料描述是一種可攜式格式化資料結構,其中包含資料金鑰的加密副本和其他資訊,例如加密演算法、加密內容,以及加密和簽署指示。加密程式會在資料描述組合加密和簽署的密碼編譯資料時記錄資料描述。稍後,當它需要組合密碼編譯材料來驗證和解密欄位時,它會使用材料描述作為其指南。

將加密的資料金鑰與加密欄位一起存放,可簡化解密操作,讓您不必獨立於加密的資料存放和管理加密的資料金鑰。

如需材料描述的技術資訊,請參閱 材質描述格式

加密內容

為了提高密碼編譯操作的安全性, AWS 資料庫加密 SDK 會在所有加密和簽署記錄的請求中包含加密內容。

加密內容是一組名稱/值對,其中包含任意非私密的額外驗證資料。 AWS Database Encryption SDK 包含資料庫的邏輯名稱,以及加密內容中的主索引鍵值 (例如 DynamoDB 資料表中的分割區索引鍵和排序索引鍵)。當您加密並簽署欄位時,加密內容會以加密方式繫結至加密記錄,因此解密欄位時需要相同的加密內容。

如果您使用 AWS KMS keyring, AWS 資料庫加密 SDK 也會使用加密內容,在 keyring 進行的呼叫中提供其他已驗證的資料 (AAD) AWS KMS。

每當您使用預設演算法套件時,密碼編譯資料管理員 (CMM) 會將名稱值對新增至加密內容,其中包含預留名稱 aws-crypto-public-key和代表公有驗證金鑰的值。公有驗證金鑰會存放在材料描述中。

密碼編譯資料管理員

密碼編譯資料管理員 (CMM) 會組合用於加密、解密和簽署資料的密碼編譯資料。每當您使用預設演算法套件時,密碼編譯材料包含純文字和加密的資料金鑰、對稱簽署金鑰和非對稱簽署金鑰。您永遠不會直接與 CMM 互動。加密和解密方法會為您代勞。

由於 CMM 充當 AWS 資料庫加密 SDK 與 keyring 之間的聯絡點,因此它是自訂和延伸的理想點,例如支援政策強制執行。您可以明確指定 CMM,但並非必要。當您指定 keyring 時, AWS 資料庫加密 SDK 會為您建立預設 CMM。預設 CMM 會從您指定的 keyring 取得加密或解密資料。這可能牽涉到呼叫密碼編譯服務,例如 AWS Key Management Service (AWS KMS)。

對稱和非對稱加密

對稱加密使用相同的金鑰來加密和解密資料。

非對稱加密使用數學上相關的資料金鑰對。對中的一個金鑰會加密資料;只有對中的另一個金鑰可以解密資料。

AWS Database Encryption SDK 使用信封加密。它使用對稱資料金鑰加密您的資料。它會使用一或多個對稱或非對稱包裝金鑰來加密對稱資料金鑰。它會將資料描述新增至記錄,其中包含至少一個資料金鑰的加密複本。

加密您的資料 (對稱加密)

為了加密您的資料, AWS 資料庫加密 SDK 使用對稱資料金鑰和包含對稱加密演算法的演算法套件。若要解密資料, AWS 資料庫加密 SDK 會使用相同的資料金鑰和相同的演算法套件。

加密您的資料金鑰 (對稱或非對稱加密)

您提供給加密和解密操作的 keyring 會決定對稱資料金鑰的加密和解密方式。您可以選擇使用對稱加密的 keyring,例如具有對稱加密 KMS 金鑰的 AWS KMS keyring,或使用非對稱加密的 keyring,例如 AWS KMS 具有非對稱 RSA KMS 金鑰的 keyring。

金鑰承諾

AWS Database Encryption SDK 支援金鑰承諾 (有時稱為穩健性),這是一種安全屬性,可確保每個加密文字只能解密為單一純文字。若要這樣做,金鑰承諾可確保只會使用加密您記錄的資料金鑰來解密它。 AWS Database Encryption SDK 包含所有加密和解密操作的金鑰承諾。

大多數現代對稱密碼 (包括 AES) 會在單一私密金鑰下加密純文字,例如 AWS 資料庫加密 SDK 用來加密ENCRYPT_AND_SIGN記錄中標記的每個純文字欄位的唯一資料金鑰。使用相同的資料金鑰解密此記錄會傳回與原始相同的純文字。使用不同金鑰進行解密通常會失敗。雖然很困難,但在技術上可以在兩個不同的金鑰下解密加密文字。在極少數情況下,您可以找到能夠部分解密加密文字為不同但仍然無法理解的純文字的金鑰。

AWS Database Encryption SDK 一律會在一個唯一的資料金鑰下加密每個屬性。它可能會在多個包裝金鑰下加密該資料金鑰,但包裝金鑰一律會加密相同的資料金鑰。不過,複雜的手動製作加密記錄實際上可能包含不同的資料金鑰,每個金鑰都由不同的包裝金鑰加密。例如,如果一個使用者解密加密的記錄,則傳回 0x0 (false),而另一個解密相同加密記錄的使用者則得到 0x1 (true)。

為了防止這種情況, AWS 資料庫加密 SDK 會在加密和解密時包含金鑰承諾。加密方法以密碼編譯方式將產生加密文字的唯一資料金鑰繫結至金鑰承諾,這是使用資料金鑰衍生,根據資料描述計算的雜湊型訊息驗證碼 (HMAC)。然後,它會將金鑰承諾存放在材料描述中。當它使用金鑰承諾解密記錄時, AWS 資料庫加密 SDK 會驗證資料金鑰是該加密記錄的唯一金鑰。如果資料金鑰驗證失敗,解密操作會失敗。

數位簽章

AWS Database Encryption SDK 會使用已驗證的加密演算法 AES-GCM 加密您的資料,而解密程序會驗證加密訊息的完整性和真實性,而無需使用數位簽章。但由於 AES-GCM 使用對稱金鑰,任何可以解密用於解密加密文字的資料金鑰的人,也可以手動建立新的加密加密加密文字,造成潛在的安全問題。例如,如果您使用 AWS KMS key 做為包裝金鑰,具有 kms:Decrypt 許可的使用者可以建立加密的密碼文字,而無需呼叫 kms:Encrypt

為了避免此問題,預設演算法套件會將橢圓曲線數位簽章演算法 (ECDSA) 簽章新增至加密的記錄。預設演算法套件ENCRYPT_AND_SIGN會使用已驗證的加密演算法 AES-GCM 來加密記錄中標示的欄位。然後,它會在記錄標示為 ENCRYPT_AND_SIGN、 和 的欄位上,計算雜湊型訊息驗證碼 (HMACs) SIGN_ONLY和非對稱 ECDSA 簽章SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT。解密程序會使用簽章來驗證授權使用者是否已加密記錄。

使用預設演算法套件時, AWS 資料庫加密 SDK 會為每個加密的記錄產生臨時私有金鑰和公有金鑰對。 AWS Database Encryption SDK 會將公有金鑰存放在材料描述中,並捨棄私有金鑰。這可確保沒有人可以建立另一個使用公有金鑰驗證的簽章。演算法會將公有金鑰繫結至加密的資料金鑰,作為材料描述中的其他已驗證資料,防止只能解密欄位的使用者更改公有金鑰或影響簽章驗證。

AWS 資料庫加密 SDK 一律包含 HMAC 驗證。ECDSA 數位簽章預設為啟用,但並非必要。如果加密資料的使用者和解密資料的使用者同樣受信任,您可以考慮使用不包含數位簽章的演算法套件來改善效能。如需選取替代演算法套件的詳細資訊,請參閱選擇演算法套件

注意

如果 keyring 沒有在加密程式和解密程式之間劃定,數位簽章不會提供密碼編譯值。

AWS KMS keyring,包括非對稱 RSA AWS KMS keyring,可以根據 AWS KMS 金鑰政策和 IAM 政策,在加密程式和解密程式之間劃定。

由於其密碼編譯性質,下列 keyring 無法在加密程式和解密程式之間描述:

  • AWS KMS 階層式 keyring

  • AWS KMS ECDH keyring

  • 原始 AES keyring

  • 原始 RSA keyring

  • 原始 ECDH keyring