

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

# AWS 資料庫加密 SDK 的運作方式
<a name="how-it-works"></a>


****  

|  | 
| --- |
| 我們的用戶端加密程式庫已重新命名為 AWS 資料庫加密 SDK。此開發人員指南仍提供有關 [DynamoDB 加密用戶端](legacy-dynamodb-encryption-client.md)的資訊。 | 

 AWS Database Encryption SDK 提供用戶端加密程式庫，專為保護您存放在資料庫中的資料而設計。程式庫包括您可以擴展或以原狀使用的安全實作。如需定義和使用自訂元件的詳細資訊，請參閱資料庫實作的 GitHub 儲存庫。

本節中的工作流程說明 AWS Database Encryption SDK 如何加密和簽署和解密和驗證資料庫中的資料。這些工作流程使用抽象元素和預設功能描述基本程序。如需 AWS 資料庫加密 SDK 如何搭配資料庫實作運作的詳細資訊，請參閱資料庫的*「加密*」主題。

 AWS Database Encryption SDK 使用[信封加密](concepts.md#envelope-encryption)來保護您的資料。每個記錄都會以唯一的[資料金鑰](concepts.md#data-key)加密。資料金鑰用於為密碼編譯動作`ENCRYPT_AND_SIGN`中標記的每個欄位衍生唯一的*資料加密金鑰*。然後，您指定的包裝金鑰會加密資料金鑰的副本。若要解密加密的記錄， AWS 資料庫加密 SDK 會使用您指定的包裝金鑰來解密至少一個加密的資料金鑰。然後，它可以解密加密文字並傳回純文字項目。

如需 AWS 資料庫加密 SDK 中所用詞彙的詳細資訊，請參閱 [AWS 資料庫加密 SDK 概念](concepts.md)。

## 加密和簽署
<a name="encrypt-and-sign"></a>

資料庫 AWS 加密 SDK 的核心是記錄加密程式，可加密、簽署、驗證和解密資料庫中的記錄。它需要有關您的記錄的資訊，以及有關要加密和簽署哪些欄位的指示。它會從您指定的包裝金鑰中設定的[加密資料管理員取得加密資料](concepts.md#crypt-materials-manager)，以及如何使用這些資料的指示。

下列逐步解說說明 AWS Database Encryption SDK 如何加密和簽署您的資料項目。

1. 密碼編譯資料管理員為 AWS 資料庫加密 SDK 提供唯一的資料加密金鑰：一個純文字[資料金鑰](concepts.md#data-key)、由指定[包裝](concepts.md#wrapping-key)金鑰加密的資料金鑰複本，以及 MAC 金鑰。
**注意**  
您可以在多個包裝金鑰下加密資料金鑰。每個包裝金鑰都會加密個別的資料金鑰複本。 AWS Database Encryption SDK 會將所有加密的資料金鑰存放在[材料描述](concepts.md#material-description)中。 AWS 資料庫加密 SDK 會將新欄位 (`aws_dbe_head`) 新增至存放材料描述的記錄。  
系統會針對每個資料金鑰的加密複本衍生 MAC 金鑰。MAC 金鑰不會存放在材料描述中。反之，解密方法會使用包裝金鑰來再次衍生 MAC 金鑰。

1. 加密方法會加密您指定的[密碼編譯動作](concepts.md#crypt-actions)`ENCRYPT_AND_SIGN`中標記為 的每個欄位。

1. 加密方法`commitKey`會從資料金鑰衍生 ，並使用它來產生[金鑰承諾值](concepts.md#key-commitment)，然後捨棄資料金鑰。

1. 加密方法會將[材料描述](concepts.md#material-description)新增至記錄。材料描述包含加密的資料金鑰，以及有關加密記錄的其他資訊。如需材料描述中包含的資訊完整清單，請參閱[材料描述格式](reference.md#material-description-format)。

1. 加密方法使用**步驟 1 **中傳回的 MAC 金鑰，透過資料描述、[加密內容](concepts.md#encryption-context)和密碼編譯動作`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`中標記為 `ENCRYPT_AND_SIGN`、 `SIGN_ONLY`或 的每個欄位的標準化來計算雜湊型訊息驗證碼 (HMAC) 值。HMAC 值會儲存在加密方法新增至記錄的新欄位 (`aws_dbe_foot`) 中。

1. 加密方法會計算資料描述、加密內容和每個標示為 `ENCRYPT_AND_SIGN`、 或 欄位的正式化的 [ECDSA 簽章](concepts.md#digital-sigs)`SIGN_ONLY`，`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`並將 ECDSA 簽章存放在 `aws_dbe_foot` 欄位中。
**注意**  
ECDSA 簽章預設為啟用，但並非必要。

1. 加密方法會將加密和簽章的記錄存放在您的資料庫中

## 解密並驗證
<a name="decrypt-and-verify"></a>

1. 密碼編譯資料管理員 (CMM) 提供解密方法，其中包含儲存在資料描述中的解密資料，包括純文字[資料金鑰](concepts.md#data-key)和相關聯的 MAC 金鑰。

   1. CMM 會使用指定 keyring 中的[包裝金鑰](concepts.md#wrapping-key)解密加密的資料金鑰，並傳回純文字資料金鑰。

1. 解密方法會比較並驗證材料描述中的金鑰承諾值。

1. 解密方法會驗證簽章欄位中的簽章。

   它會`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`從您定義的[允許未驗證](ddb-java-using.md#allowed-unauth)欄位清單中，識別哪些欄位標示為 `ENCRYPT_AND_SIGN``SIGN_ONLY`、 或 。解密方法使用**步驟 1 **中傳回的 MAC 金鑰來重新計算和比較標示為 `ENCRYPT_AND_SIGN`、 `SIGN_ONLY`或 之欄位的 HMAC 值`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`。然後，它會使用存放在[加密內容](concepts.md#encryption-context)中的公有金鑰來驗證 [ECDSA 簽章](concepts.md#digital-sigs)。

1. 解密方法使用純文字資料金鑰來解密標示為 的每個值`ENCRYPT_AND_SIGN`。 AWS 資料庫加密 SDK 接著會捨棄純文字資料金鑰。

1. 解密方法會傳回純文字記錄。