

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

# 密钥环
<a name="choose-keyring"></a>

支持的编程语言实现使用*密钥环*来执行[信封加密](concepts.md#envelope-encryption)。密钥环生成、加密和解密数据密钥。密钥环确定保护每条消息的唯一数据密钥的来源，以及加密该数据密钥的[包装密钥](concepts.md#master-key)。您在加密时指定一个密钥环，并在解密时指定相同或不同的密钥环。您可以使用开发工具包提供的密钥环，也可以编写您自己的兼容自定义密钥环。

您可以单独使用每个密钥环，也可以将多个密钥环合并为一个[多重密钥环](use-multi-keyring.md)。虽然大多数密钥环可以生成、加密和解密数据密钥，但您也可以创建只执行一项特定操作的密钥环，例如只生成数据密钥的密钥环，并将此密钥环与其他密钥环结合使用。

我们建议您使用可保护包装密钥并在安全边界内执行加密操作的密钥环，例如密 AWS KMS 钥环，它使用永不保密 [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/)() AWS KMS keys AWS KMS的密钥环。您还可以编写一个使用封装密钥的密钥环，这些密钥存储在硬件安全模块 (HSMs) 中或受其他主密钥服务保护。有关详细信息，请参阅 *AWS Encryption SDK Specification* 中的 [Keyring Interface](https://github.com/awslabs/aws-encryption-sdk-specification/blob/master/framework/keyring-interface.md) 主题。

密钥环起着其他编程语言实现中使用的[主密钥](concepts.md#master-key)[和主密钥提供者的](concepts.md#master-key-provider)作用。如果您使用 AWS Encryption SDK 的不同语言实施来加密和解密数据，请务必使用兼容密钥环和主密钥提供程序。有关更多信息，请参阅 [密钥环兼容性](#keyring-compatibility)。

本主题说明如何使用的密钥环功能 AWS Encryption SDK 以及如何选择密钥环。

## 密钥环的工作方式
<a name="using-keyrings"></a>

加密数据时，会 AWS Encryption SDK 要求密钥环提供加密材料。密钥环返回一个明文数据密钥以及由密钥环中的每个包装密钥加密的数据密钥副本。 AWS Encryption SDK 使用明文密钥加密数据，然后销毁纯文本数据密钥。然后， AWS Encryption SDK 返回[一条包含加密](concepts.md#message)数据密钥和加密数据的加密消息。

![\[使用包含多个包装密钥的密钥环进行加密。\]](http://docs.aws.amazon.com/zh_cn/encryption-sdk/latest/developer-guide/images/keyring-encrypt.png)


解密数据时，您可以使用加密数据所用的密钥环，也可以使用其他密钥环。要解密数据，解密密钥环必须包含（或有权访问）加密密钥环中的至少一个包装密钥。

将加密的数据密钥从加密的消息 AWS Encryption SDK 传递到密钥环，并要求密钥环解密其中任何一个。密钥环使用其包装密钥以解密一个加密的数据密钥，并返回明文数据密钥。 AWS Encryption SDK 使用明文数据密钥以解密数据。如果密钥环中的所有包装密钥都无法解密任何加密的数据密钥，解密操作将失败。

![\[使用密钥环进行解密。\]](http://docs.aws.amazon.com/zh_cn/encryption-sdk/latest/developer-guide/images/keyring-decrypt.png)


您可以使用一个密钥环，也可以将相同类型或不同类型的密钥环组合到一个[多重密钥环](use-multi-keyring.md)中。当您加密数据时，多重密钥环返回使用构成该多重密钥环的所有密钥环中的所有包装密钥加密的数据密钥副本。您可以使用包含多重密钥环中任一包装密钥的密钥环解密数据。

## 密钥环兼容性
<a name="keyring-compatibility"></a>

尽管不同的语言实现 AWS Encryption SDK 有一些架构差异，但它们完全兼容，但受语言限制的约束。您可以使用一种语言实施加密数据，用其他语言实施进行解密。不过，您必须使用相同或相应的包装密钥加密和解密数据密钥。有关语言限制的信息，请参阅有关每种语言实现的主题，例如 AWS Encryption SDK for JavaScript 主题[的兼容性 AWS Encryption SDK for JavaScript](javascript-compatibility.md)中的主题。

以下编程语言支持密钥环：
+ AWS Encryption SDK for C
+ AWS Encryption SDK for JavaScript
+ AWS Encryption SDK 对于.NET
+ 版本 3。 的 *x* AWS Encryption SDK for Java
+ 版本 4。 的 *x* AWS Encryption SDK for Python，与可选的[加密材料提供程序库](https://github.com/aws/aws-cryptographic-material-providers-library) (MPL) 依赖项一起使用时。
+ AWS Encryption SDK 对于 Rust
+ AWS Encryption SDK for Go

### 对加密密钥环的不同要求
<a name="encrypt-keyring-requirements"></a>

在除之外的 AWS Encryption SDK 语言实现中 AWS Encryption SDK for C，所有封装在加密密钥环（或多密钥环）或主密钥提供程序中的密钥都必须能够加密数据密钥。如有任何包装密钥无法加密，此加密方法将失败。因此，调用方必须拥有密钥环中所有密钥的[所需权限](use-kms-keyring.md#kms-keyring-permissions)。如果您单独或在多重密钥环中使用 Discovery 密钥环加密数据，加密操作将失败。

唯一的例外是 AWS Encryption SDK for C，加密操作会忽略标准发现密钥环，但是如果您单独或在多密钥环中指定多区域发现密钥环，则会失败。

### 兼容的密钥环和主密钥提供程序
<a name="keyring-compat-table"></a>

下表显示了哪些主密钥和主密钥提供程序与它们提供的密钥环兼容。 AWS Encryption SDK 有关语言实施的主题中解释了由于语言约束而导致的任何轻微不兼容情况。


| 密钥环： | 主密钥提供程序： | 
| --- | --- | 
| [AWS KMS 钥匙圈](use-kms-keyring.md) |  [KMSMaster密钥 (Java)](https://aws.github.io/aws-encryption-sdk-java/com/amazonaws/encryptionsdk/kms/KmsMasterKey.html) [KMSMasterKeyProvider (Java)](https://aws.github.io/aws-encryption-sdk-java/com/amazonaws/encryptionsdk/kms/KmsMasterKeyProvider.html) [KMSMaster密钥 (Python)](https://aws-encryption-sdk-python.readthedocs.io/en/latest/generated/aws_encryption_sdk.key_providers.kms.html) [KMSMasterKeyProvider （Python）](https://aws-encryption-sdk-python.readthedocs.io/en/latest/generated/aws_encryption_sdk.key_providers.kms.html#aws_encryption_sdk.key_providers.kms.KMSMasterKeyProvider)   AWS Encryption SDK for Python 和 AWS Encryption SDK for Java 不包括等同于[AWS KMS 区域发现密钥环的主密钥或主密钥](use-kms-keyring.md#kms-keyring-regional)提供程序。   | 
| [AWS KMS 分层钥匙圈](use-hierarchical-keyring.md) | 由以下编程语言和版本支持： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/encryption-sdk/latest/developer-guide/choose-keyring.html) | 
| [AWS KMS ECDH 钥匙圈](use-kms-ecdh-keyring.md) | 由以下编程语言和版本支持： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/encryption-sdk/latest/developer-guide/choose-keyring.html) | 
| [原始 AES 密钥环](use-raw-aes-keyring.md) | 与对称加密密钥一起使用时：[JceMasterKey](https://aws.github.io/aws-encryption-sdk-java/com/amazonaws/encryptionsdk/jce/JceMasterKey.html)(Java)[RawMasterKey](https://aws-encryption-sdk-python.readthedocs.io/en/latest/generated/aws_encryption_sdk.key_providers.raw.html#aws_encryption_sdk.key_providers.raw.RawMasterKey)（Python） | 
| [原始 RSA 密钥环](use-raw-rsa-keyring.md) | 与非对称加密密钥一起使用时：[JceMasterKey](https://aws.github.io/aws-encryption-sdk-java/com/amazonaws/encryptionsdk/jce/JceMasterKey.html)(Java)[RawMasterKey](https://aws-encryption-sdk-python.readthedocs.io/en/latest/generated/aws_encryption_sdk.key_providers.raw.html#aws_encryption_sdk.key_providers.raw.RawMasterKey)（Python） 原始 RSA 密钥环不支持非对称 KMS 密钥。如果要使用非对称 RSA KMS 密钥，请使用版本 4。 .NET 的 * AWS Encryption SDK x* 及更高版本支持使用对称加密 (`SYMMETRIC_DEFAULT`) 或非对称 RSA 的密 AWS KMS 钥环。 AWS KMS keys  | 
| [未加工的 ECDH 钥匙圈](use-raw-ecdh-keyring.md) | 由以下编程语言和版本支持： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/encryption-sdk/latest/developer-guide/choose-keyring.html) | 