

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 已包装的材料提供程序
<a name="wrapped-provider"></a>

**注意**  
我们的客户端加密库已[重命名为 AWS 数据库加密 SDK](DDBEC-rename.md)。以下主题提供有关适用于 Java 的 DynamoDB 加密客户端版本 1.*x*—2.*x* 以及适用于 Python 的 DynamoDB 加密客户端版本 1.*x*—3.*x* 的信息。有关更多信息，请参阅[适用于 DynamoDB 的AWS 数据库加密 SDK 版本支持](legacy-dynamodb-encryption-client.md#legacy-support)。

利用*已包装的材料提供程序*（已包装的 CMP），您可以通过 DynamoDB 加密客户端的任何源使用包装密钥和签名密钥。Wrapped CMP 不依赖于任何 AWS 服务。但是，必须在客户端之外生成和管理包装密钥与签名密钥，包括提供正确的密钥来验证和解密项目。

已包装的 CMP 将为每个项目生成一个唯一项目加密密钥。它使用提供的包装密钥包装项目加密密钥并将已包装的项目加密密钥保存在项目的[材料描述属性](DDBEC-legacy-concepts.md#legacy-material-description)中。由于包装密钥和签名密钥是您提供的，因此由您确定包装密钥和签名密钥的生成方式以及这些密钥对每个项目是否唯一或是否会重复使用。

已包装的 CMP 是安全实现，并且是可管理加密材料的应用程序的不二选择。

Wrapped CMP 是 DynamoDB [加密客户端支持的几个加密材料提供程序](DDBEC-legacy-concepts.md#concept-material-provider) (CMPs) 之一。有关另一个的信息 CMPs，请参阅[加密材料提供程序](crypto-materials-providers.md)。

**有关示例代码，请参阅：**
+ Java：[AsymmetricEncryptedItem](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/AsymmetricEncryptedItem.java)
+ Python: [wrapped-rsa-encrypted-table](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/wrapped_rsa_encrypted_table.py)，[wrapped-symmetric-encrypted-table](https://github.com/aws/aws-dynamodb-encryption-python/blob/master/examples/src/dynamodb_encryption_sdk_examples/wrapped_symmetric_encrypted_table.py)

**Topics**
+ [

## 使用方法
](#wrapped-cmp-how-to-use)
+ [

## 工作原理
](#wrapped-cmp-how-it-works)

## 使用方法
<a name="wrapped-cmp-how-to-use"></a>

要创建已包装的 CMP，请指定包装密钥（加密时需要）、解开包装密钥（解密时需要）以及签名密钥。加密和解密项目时，必须提供密钥。

包装密钥、解开包装密钥和签名密钥可以是对称密钥或非对称密钥对。

------
#### [ Java ]

```
// This example uses asymmetric wrapping and signing key pairs
final KeyPair wrappingKeys = ...
final KeyPair signingKeys = ...

final WrappedMaterialsProvider cmp = 
    new WrappedMaterialsProvider(wrappingKeys.getPublic(),
                                 wrappingKeys.getPrivate(),
                                 signingKeys);
```

------
#### [ Python ]

```
# This example uses symmetric wrapping and signing keys
wrapping_key = ...
signing_key  = ...

wrapped_cmp = WrappedCryptographicMaterialsProvider(
    wrapping_key=wrapping_key,
    unwrapping_key=wrapping_key,
    signing_key=signing_key
)
```

------

## 工作原理
<a name="wrapped-cmp-how-it-works"></a>

已包装的 CMP 将为每个项目生成一个新的项目加密密钥。它将使用提供的包装密钥、解开包装密钥和签名密钥，如下图中所示。

![\[DynamoDB 加密客户端中已包装材料提供程序的输入、处理和输出\]](http://docs.aws.amazon.com/zh_cn/database-encryption-sdk/latest/devguide/images/wrappedCMP.png)


### 获取加密材料
<a name="wrapped-cmp-get-encryption-materials"></a>

本部分详述了已包装的材料提供程序（已包装的 CMP）在收到加密材料请求时的输入、输出和处理。

**输入**（来自应用程序）
+ 包装密钥：[高级加密标准](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) (AES) 对称密钥或 [RSA](https://en.wikipedia.org/wiki/RSA_(cryptosystem)) 公钥。在加密任何属性值时都需要。否则，它为可选项，将忽略。
+ 解开包装密钥：可选，将忽略。
+ 签名密钥

**输入**（来自项目加密程序）
+ [DynamoDB 加密上下文](concepts.md#encryption-context)

**输出**（至项目加密程序）：
+ 明文项目加密密钥
+ 签名密钥（保持不变）
+ [实际材料描述](DDBEC-legacy-concepts.md#legacy-material-description)：这些值保存在客户端添加到项目的[材料描述属性](DDBEC-legacy-concepts.md#legacy-material-description)中。
  + `amzn-ddb-env-key`：Base64 编码的已包装项目加密密钥
  + `amzn-ddb-env-alg`：用于加密项目的加密算法。默认值为 AES-256-CBC。
  + `amzn-ddb-wrap-alg`：已包装的 CMP 用于包装项目加密密钥的包装算法。如果包装密钥为 AES 密钥，则将使用未填充的 `AES-Keywrap` 包装此密钥，如 [RFC 3394](https://tools.ietf.org/html/rfc3394.html) 中所定义。如果包装密钥是 RSA 密钥，则使用带填充的 RSA OAEP 对密钥进行加密。 MGF1 

**Processing**

加密项目时，将传入包装密钥和签名密钥。解开包装密钥为可选项，将忽略。

1. 已包装的 CMP 将为每个表项目生成一个唯一对称项目加密密钥。

1. 它使用指定的包装密钥包装项目加密密钥。之后，它将尽快从内存中删除此密钥。

1. 它将返回明文项目加密密钥、提供的签名密钥、包含已包装项目加密密钥的[实际材料描述](DDBEC-legacy-concepts.md#legacy-material-description)以及加密算法和包装算法。

1. 项目加密程序将使用此明文加密密钥加密项目。它使用提供的签名密钥为项目签名。之后，它将尽快从内存中删除明文密钥。它将实际材料描述中的字段（包括已包装的加密密钥 (`amzn-ddb-env-key`)）复制到项目的材料描述属性中。

### 获取解密材料
<a name="wrapped-cmp-get-decryption-materials"></a>

本部分详述了已包装的材料提供程序（已包装的 CMP）在收到解密材料请求时的输入、输出和处理。

**输入**（来自应用程序）
+ 包装密钥：可选，将忽略。
+ 解开包装密钥：同一[高级加密标准](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) (AES) 对称密钥或对应加密所用 RSA 公有密钥的 [RSA](https://en.wikipedia.org/wiki/RSA_(cryptosystem)) 私有密钥。在加密任何属性值时都需要。否则，它为可选项，将忽略。
+ 签名密钥

**输入**（来自项目加密程序）
+ 包含材料描述属性内容的 [DynamoDB 加密上下文](concepts.md#encryption-context)的副本。

**输出**（至项目加密程序）
+ 明文项目加密密钥
+ 签名密钥（保持不变）

**Processing**

解密项目时，将传入解开包装密钥和签名密钥。包装密钥为可选项，将忽略。

1. 已包装的 CMP 将从项目的材料描述属性中获取已包装的项目加密密钥。

1. 它使用解开包装密钥和算法解开包装项目加密密钥。

1. 它将明文项目加密密钥、签名密钥以及加密和签名算法返回项目加密程序。

1. 项目加密程序将使用此签名密钥验证项目。如果验证成功，则项目加密程序将使用项目加密密钥解密项目。之后，它将尽快从内存中删除明文密钥。