

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

# 静态材料提供程序
<a name="static-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)。

*静态材料提供商*（Static CMP）是一个非常简单的[加密材料提供商](DDBEC-legacy-concepts.md#concept-material-provider)（CMP），用于测试、 proof-of-concept演示和传统兼容性。

要使用静态 CMP 加密表项目，请提供[高级加密标准](https://en.wikipedia.org/wiki/Advanced_Encryption_Standard) (AES) 对称加密和签名密钥或密钥对。必须提供相同的密钥才能解密加密的项目。静态 CMP 不会执行任何加密操作。相反，它会将提供的加密密钥原封不动地传递给项目加密程序。项目加密程序将直接使用此加密密钥加密项目。然后，它将直接使用签名密钥为项目签名。

由于静态 CMP 不会生成任何唯一加密材料，因此将使用同一加密密钥加密且通过同一签名密钥签名您处理的所有表项目。当使用同一密钥加密众多项目中的属性值或使用同一密钥或密钥对为所有项目签名时，将面临超出密钥加密限制的风险。

**注意**  
Java 库中的[非对称静态提供程序](https://aws.github.io/aws-dynamodb-encryption-java/com/amazonaws/services/dynamodbv2/datamodeling/encryption/providers/AsymmetricStaticProvider.html)不是一种静态提供程序。它仅提供[已包装的 CMP](wrapped-provider.md) 的替代构造函数。它对生产使用是安全的，但应尽可能直接使用已包装的 CMP。

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

**有关示例代码，请参阅：**
+ Java：[SymmetricEncryptedItem](https://github.com/aws/aws-dynamodb-encryption-java/blob/master/examples/src/main/java/com/amazonaws/examples/SymmetricEncryptedItem.java)

**Topics**
+ [使用方法](#static-cmp-how-to-use)
+ [工作原理](#static-cmp-how-it-works)

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

要创建静态提供程序，请提供加密密钥或密钥对和签名密钥或密钥对。需要提供密钥材料才能加密和解密表项目。

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

```
// To encrypt
SecretKey cek = ...;        // Encryption key
SecretKey macKey =  ...;    // Signing key
EncryptionMaterialsProvider provider = new SymmetricStaticProvider(cek, macKey);

// To decrypt
SecretKey cek = ...;        // Encryption key
SecretKey macKey =  ...;    // Verification key
EncryptionMaterialsProvider provider = new SymmetricStaticProvider(cek, macKey);
```

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

```
# You can provide encryption materials, decryption materials, or both
encrypt_keys = EncryptionMaterials(
    encryption_key = ...,
    signing_key = ...
)

decrypt_keys = DecryptionMaterials(
    decryption_key = ...,
    verification_key = ...
)

static_cmp = StaticCryptographicMaterialsProvider(
    encryption_materials=encrypt_keys
    decryption_materials=decrypt_keys
)
```

------

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

静态提供程序将提供的加密和签名密钥传递到项目加密程序，而后项目加密程序直接使用这些密钥为表项目加密和签名。除非为每个项目提供了不同的密钥，否则对所有项目使用相同的密钥。

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


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

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

**输入**（来自应用程序）
+ 加密密钥 – 这必须是对称密钥（如[高级加密标准](https://tools.ietf.org/html/rfc3394.html)（AES）密钥）。
+ 签名密钥 – 这可以是对称密钥或非对称密钥对。

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

**输出**（至项目加密程序）
+ 作为输入传递的加密密钥。
+ 作为输入传递的签名密钥。
+ 实际材料描述：[请求的材料描述](DDBEC-legacy-concepts.md#legacy-material-description)（如有），不做更改。

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

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

尽管它获取加密材料和获取解密材料的方法不同，但此行为是相同的。

**输入**（来自应用程序）
+ 加密密钥 – 这必须是对称密钥（如[高级加密标准](https://tools.ietf.org/html/rfc3394.html)（AES）密钥）。
+ 签名密钥 – 这可以是对称密钥或非对称密钥对。

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

**输出**（至项目加密程序）
+ 作为输入传递的加密密钥。
+ 作为输入传递的签名密钥。