

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

# Keyring
<a name="choose-keyring"></a>

支援的程式設計語言實作使用 *keyring *來執行[信封加密](concepts.md#envelope-encryption)。Keyring 會產生、加密及解密資料金鑰。Keyring 會決定保護每個訊息的唯一資料金鑰的來源，以及加密該資料金鑰的[包裝金鑰](concepts.md#master-key)。您可以在加密時指定 keyring，並在解密時指定相同或不同的 keyring。您可以使用 SDK 提供的 keyring，或編寫您自己的相容自訂 keyring。

您可以個別使用每個 keyring 或是結合 keyring 成為[多重 keyring](use-multi-keyring.md)。雖然多數 keyring 可以產生、加密及解密資料金鑰，您可能想要建立僅執行一個特定操作的 keyring，例如只會產生資料金鑰的 keyring，並將該 keyring 與其他 keyring 結合使用。

我們建議您使用 keyring 來保護您的包裝金鑰，並在安全界限內執行密碼編譯操作，例如 AWS KMS keyring，其使用 AWS KMS keys 永遠不會讓 [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/)(AWS KMS) 處於未加密狀態。您也可以編寫 keyring，該 keyring 使用存放在硬體安全模組 (HSMs) 中的包裝金鑰，或受其他主金鑰服務保護。如需詳細資訊，請參閱 規格中的 [Keyring Interface](https://github.com/awslabs/aws-encryption-sdk-specification/blob/master/framework/keyring-interface.md) 主題。 *AWS Encryption SDK *

Keyring 扮演其他程式設計語言實作中使用的[主金鑰](concepts.md#master-key)和[主金鑰提供者](concepts.md#master-key-provider)的角色。如果您使用 的不同語言實作 AWS Encryption SDK 來加密和解密資料，請務必使用相容的 keyring 和主金鑰提供者。如需詳細資訊，請參閱[Keyring 相容性](#keyring-compatibility)。

本主題說明如何使用 的 keyring 功能， AWS Encryption SDK 以及如何選擇 keyring。

## keyring 如何運作
<a name="using-keyrings"></a>

當您加密資料時， 會 AWS Encryption SDK 向 keyring 要求加密資料。keyring 會傳回純文字資料金鑰和由 keyring 中每個包裝金鑰加密的資料金鑰複本。 AWS Encryption SDK 使用純文字金鑰來加密資料，然後銷毀純文字資料金鑰。然後， AWS Encryption SDK 會傳回[加密訊息](concepts.md#message)，其中包含加密的資料金鑰和加密的資料。

![\[使用具有多個包裝金鑰的 keyring 加密。\]](http://docs.aws.amazon.com/zh_tw/encryption-sdk/latest/developer-guide/images/keyring-encrypt.png)


當您解密資料時，您可以使用與用來加密資料相同的 keyring，或不同的 keyring。若要解密資料，解密 keyring 必須在加密 keyring 中包含 （或可存取） 至少一個包裝金鑰。

會將加密的資料金鑰從加密的訊息 AWS Encryption SDK 傳遞至 keyring，並要求 keyring 解密其中任何一個。keyring 使用其包裝金鑰來解密其中一個加密的資料金鑰，並傳回純文字資料金鑰。 AWS Encryption SDK 使用純文字金鑰來解密資料。如果 keyring 中沒有任何包裝金鑰可以解密任何加密的資料金鑰，則解密操作會失敗。

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


您可以使用單一 keyring，也可以將相同類型或不同類型的 keyring 結合成[多重 keyring](use-multi-keyring.md)。當您加密資料時，多重 keyring 會傳回由所有包裝金鑰 (在構成多重 keyring 的所有 keyring 中) 所加密的資料金鑰的副本。您可以使用 keyring 搭配多 keyring 中的任何一個包裝金鑰來解密資料。

## Keyring 相容性
<a name="keyring-compatibility"></a>

雖然 的不同語言實作 AWS Encryption SDK 有一些架構差異，但它們完全相容，但受限於語言限制。您可以使用一種語言實作來加密資料，並使用任何其他語言實作來解密資料。不過，您必須使用相同或對應的包裝金鑰來加密和解密資料金鑰。如需有關語言限制的資訊，請參閱每個語言實作的 主題，例如 適用於 JavaScript 的 AWS Encryption SDK 主題[的相容性 適用於 JavaScript 的 AWS Encryption SDK](javascript-compatibility.md)中的 。

下列程式設計語言支援 Keyring：
+ 適用於 C 的 AWS Encryption SDK
+ 適用於 JavaScript 的 AWS Encryption SDK
+ AWS Encryption SDK 適用於 .NET 的
+ 3.*x* 版 適用於 JAVA 的 AWS Encryption SDK
+ 4.*x* 版 適用於 Python 的 AWS Encryption SDK，與選用[的加密材料提供者程式庫](https://github.com/aws/aws-cryptographic-material-providers-library) (MPL) 相依性搭配使用時。
+ AWS Encryption SDK for Rust
+ AWS Encryption SDK for Go

### 加密 keyring 的不同需求
<a name="encrypt-keyring-requirements"></a>

在 以外的 AWS Encryption SDK 語言實作中 適用於 C 的 AWS Encryption SDK，加密 keyring （或多 keyring) 或主金鑰提供者中的所有包裝金鑰都必須能夠加密資料金鑰。如果任何包裝金鑰無法加密，加密方法會失敗。因此，發起人必須擁有 keyring 中所有金鑰[的必要許可](use-kms-keyring.md#kms-keyring-permissions)。如果您使用探索 keyring 單獨加密資料或在多 keyring 中加密資料，加密操作會失敗。

例外是 適用於 C 的 AWS Encryption SDK，其中加密操作會忽略標準探索 keyring，但如果您單獨或在多區域 keyring 中指定多區域探索 keyring，則會失敗。

### 相容 Keyring 和主金鑰提供者
<a name="keyring-compat-table"></a>

下表顯示哪些主金鑰和主金鑰提供者與 AWS Encryption SDK 提供的 keyring 相容。任何由於語言限制而導致的輕微不相容，將在語言實作的相關主題中說明。


| Keyring： | 主金鑰提供者： | 
| --- | --- | 
| [AWS KMS keyring](use-kms-keyring.md) |  [KMSMasterKey (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) [KMSMasterKey (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)   適用於 Python 的 AWS Encryption SDK 和 適用於 JAVA 的 AWS Encryption SDK 不包含等同於[AWS KMS 區域探索 keyring](use-kms-keyring.md#kms-keyring-regional) 的主金鑰或主金鑰提供者。   | 
| [AWS KMS 階層式 keyring](use-hierarchical-keyring.md) | 受下列程式設計語言和版本支援： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/encryption-sdk/latest/developer-guide/choose-keyring.html) | 
| [AWS KMS ECDH keyring](use-kms-ecdh-keyring.md) | 受下列程式設計語言和版本支援： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/encryption-sdk/latest/developer-guide/choose-keyring.html) | 
| [原始 AES keyring](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 keyring](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 keyring 不支援非對稱 KMS 金鑰。如果您想要使用非對稱 RSA KMS 金鑰， AWS Encryption SDK 適用於 .NET 的 4.*x* 版和更新版本支援使用對稱加密 (`SYMMETRIC_DEFAULT`) 或非對稱 RSA 的 AWS KMS keyring AWS KMS keys。  | 
| [原始 ECDH keyring](use-raw-ecdh-keyring.md) | 受下列程式設計語言和版本支援： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/encryption-sdk/latest/developer-guide/choose-keyring.html) | 