

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

# Amazon DynamoDB 加密用戶端概念
<a name="DDBEC-legacy-concepts"></a>

**注意**  
我們的用戶端加密程式庫已[重新命名為 AWS 資料庫加密 SDK](DDBEC-rename.md)。下列主題提供有關適用於 Java 的 DynamoDB 加密用戶端 1.*x*-2.*x* 版和適用於 Python 的 DynamoDB 加密用戶端 1.*x*-3.*x* 版的資訊。如需詳細資訊，請參閱[AWS 資料庫加密 SDK for DynamoDB 版本支援](legacy-dynamodb-encryption-client.md#legacy-support)。

本主題說明 Amazon DynamoDB 加密用戶端中使用的概念和術語。

若要了解 DynamoDB 加密用戶端的元件如何互動，請參閱 [DynamoDB 加密用戶端的運作方式](DDBEC-legacy-how-it-works.md)。

**Topics**
+ [密碼編譯資料提供者 (CMP)](#concept-material-provider)
+ [項目加密程式](#item-encryptor)
+ [屬性動作](#legacy-attribute-actions)
+ [資料描述](#legacy-material-description)
+ [DynamoDB 加密內容](#legacy-encryption-context)
+ [提供者存放區](#provider-store)

## 密碼編譯資料提供者 (CMP)
<a name="concept-material-provider"></a>

實作 DynamoDB 加密用戶端時，您的第一個任務之一是[選取密碼編譯資料提供者](crypto-materials-providers.md) (CMP) （也稱為*加密資料提供者*)。您的選擇會決定其餘的大部分實作。

*密碼編譯資料提供者* (CMP) 會收集、整合及傳回[項目加密程式](#item-encryptor)用來加密並簽署資料表項目的密碼編譯資料。CMP 會決定要使用的加密演算法，以及如何產生及保護加密和簽署金鑰。

CMP 會與項目加密程式互動。項目加密程式會請求 CMP 提供加密和解密資料，而 CMP 會將這些資料傳回給項目加密程式。然後，項目加密程式會使用密碼編譯資料將項目加密並簽署，或驗證並解密。

您會在設定用戶端時指定 CMP。您可以建立相容的自訂 CMP，或使用程式庫的其中一個 CMP。大多數 CMP 都適用於多種程式設計語言。

## 項目加密程式
<a name="item-encryptor"></a>

*項目加密程式*是執行 DynamoDB 加密用戶端密碼編譯操作的較低層級元件。其將請求[密碼編譯資料提供者](#concept-material-provider) (CMP) 提供密碼編譯資料，然後使用 CMP 傳回的資料將資料表項目加密並簽署，或驗證並解密。

您可以直接與項目加密程式互動，或使用您的程式庫所提供的協助程式。例如，適用於 Java 的 DynamoDB 加密用戶端包含可與 搭配使用的`AttributeEncryptor`協助程式類別`DynamoDBMapper`，而不是直接與`DynamoDBEncryptor`項目加密程式互動。Python 程式庫包括 `EncryptedTable`、`EncryptedClient` 和 `EncryptedResource` 協助程式類別，這些類別會替您與項目加密程式互動。

## 屬性動作
<a name="legacy-attribute-actions"></a>

*屬性動作*會告知項目加密程式要對項目的每個屬性執行什麼動作。

屬性動作值可以是下列其中一項：
+ **加密和簽署** – 加密屬性值。在項目簽章中包含屬性 (名稱和值)。
+ **僅限簽署** – 在項目簽章中包含 屬性。
+ **什麼都不做** – 請勿加密或簽署 屬性。

對於可以儲存敏感資料的任何屬性，請使用**加密並簽署**。針對主索引鍵屬性 (分割區索引鍵和排序索引鍵)，使用**僅簽署**。[資料描述屬性](#legacy-material-description)和簽章屬性不會進行簽署或加密。您不需要指定這些屬性的屬性動作。

請仔細選擇屬性動作。如有疑問，請使用**加密並簽署**。使用 DynamoDB 加密用戶端來保護資料表項目之後，您就無法在沒有簽章驗證錯誤風險的情況下變更屬性的動作。如需詳細資訊，請參閱[變更您的資料模型](data-model.md)。

**警告**  
請勿加密主索引鍵的屬性。它們必須保持純文字，以便 DynamoDB 可以在不執行完整資料表掃描的情況下找到項目。

如果 [DynamoDB 加密內容](concepts.md#encryption-context)識別您的主要金鑰屬性，當您嘗試加密它們時，用戶端會擲回錯誤。

您用來為每種程式設計語言指定屬性動作的技巧都不同。而且，該技巧可以專屬於您所使用的協助程式類別。

如需詳細資訊，請參閱程式設計語言的文件。
+ [Python](python-using.md#python-attribute-actions)
+ [Java](java-using.md#attribute-actions-java)

## 資料描述
<a name="legacy-material-description"></a>

已加密資料表項目的*資料描述*包含資料表項目加密和簽署方式的相關資訊 (例如加密演算法)。[密碼編譯資料提供者](#concept-material-provider) (CMP) 會在整合可供加密和簽署的密碼編譯資料時記錄資料描述。稍後，當它需要整合密碼編譯資料來驗證和解密項目時，它會使用資料描述作為其指南。

在 DynamoDB 加密用戶端中，材料描述是指三個相關元素：

**請求的資料描述**  
有些[密碼編譯資料提供者](#concept-material-provider) (CMP) 可讓您指定進階選項，例如加密演算法。若要指出您的選擇，請將名稱值對新增至請求中 [DynamoDB 加密內容](concepts.md#encryption-context)的資料描述屬性，以加密資料表項目。此元素又稱為*請求的資料描述*。請求的資料描述中的有效值由您所選的 CMP 定義。  
由於資料描述可能覆寫安全的預設值，除非您有充分理由要使用請求的資料描述，否則建議您將其省略。

**實際資料描述**  
[密碼編譯資料提供者](#concept-material-provider) (CMP) 傳回的資料描述又稱為*實際資料描述*。它會描述 CMP 在整合密碼編譯資料時所用的實際值。通常包含請求的資料描述及新增和變更 (如果有)。

**資料描述屬性**  
用戶端會在已加密項目的*資料描述屬性*中儲存實際資料描述。資料描述屬性名稱為 `amzn-ddb-map-desc`，而其值為實際資料描述。用戶端會使用資料描述屬性中的值來驗證並解密項目。

## DynamoDB 加密內容
<a name="legacy-encryption-context"></a>

*DynamoDB 加密內容*會將資料表和項目的相關資訊提供給[密碼編譯資料提供者](#concept-material-provider) (CMP)。在進階實作中，DynamoDB 加密內容可以包含[請求的資料描述](#legacy-material-description)。

當您加密資料表項目時，DynamoDB 加密內容會以密碼編譯方式繫結至加密的屬性值。當您解密時，如果 DynamoDB 加密內容與用來加密的 DynamoDB 加密內容不完全、區分大小寫相符，解密操作會失敗。如果您直接與[項目加密程式](#item-encryptor)互動，您必須在呼叫加密或解密方法時提供 DynamoDB 加密內容。大多數協助程式會為您建立 DynamoDB 加密內容。

**注意**  
*DynamoDB 加密用戶端*中的 DynamoDB 加密內容與 AWS Key Management Service (AWS KMS) 和 中的*加密內容*無關 AWS Encryption SDK。

DynamoDB 加密內容可包含下列欄位。所有欄位和值都是選用的。
+ 資料表名稱
+ 分割區索引鍵名稱
+ 排序索引鍵名稱
+ 屬性名稱值組
+ [請求的資料描述](#legacy-material-description)

## 提供者存放區
<a name="provider-store"></a>

*提供者存放區* 是一個可傳回[密碼編譯資料提供者](#concept-material-provider) (CMP) 的元件。提供者存放區可以建立 CMP，或從另一個來源 (例如另一個提供者存放區) 取得。提供者存放區會在持久性儲存體中儲存其建立的 CMP 版本，而存放的每個 CMP 都是依照請求者的資料名稱與版本號碼進行識別。

DynamoDB 加密用戶端中的[最近提供者](most-recent-provider.md)會從提供者存放區取得其 CMPs，但您可以使用提供者存放區將 CMPs 提供給任何元件。每個最近提供者都與一個提供者存放區相關聯，但提供者存放區可以將 CMP 提供給多部主機上的許多請求者。

提供者存放區會隨需建立新的 CMP 版本，並傳回新的和現有版本。它也會傳回特定資料名稱的最新版本號碼。這使請求者能夠得知提供者存放區何時有可請求的新版 CMP。

DynamoDB 加密用戶端包含[ MetaStore](most-recent-provider.md#about-metastore)，這是使用存放在 DynamoDB 中的金鑰建立包裝 CMPs 並使用內部 DynamoDB 加密用戶端加密的提供者存放區。

**進一步了解**：
+ 提供者存放區：[Java](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/store/ProviderStore.html)、[Python](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/src/dynamodb_encryption_sdk/material_providers/store/__init__.py)
+ 中繼存放區：[Java](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/store/MetaStore.html)、[Python](https://aws-dynamodb-encryption-python.readthedocs.io/en/latest/lib/materials_providers/metastore.html#module-dynamodb_encryption_sdk.material_providers.store.meta)