

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

# 什麼是 AWS Encryption SDK？
<a name="introduction"></a>

 AWS Encryption SDK 是用戶端加密程式庫，旨在讓每個人都能輕鬆地使用產業標準和最佳實務來加密和解密資料。這樣一來，您就能夠專注於應用程式的核心功能，而不用擔心如何讓資料獲得最好的加密與解密操作。根據 Apache 2.0 授權 AWS Encryption SDK 免費提供 。

這些會為您 AWS Encryption SDK 解答下列問題：
+ 我應該使用哪種加密演算法？
+ 這種演算法應該如何使用？或是我該使用哪種模式？
+ 我應該如何產生加密金鑰？
+ 我應該如何保護加密金鑰？還有這份金鑰該存放在哪裡？
+ 我可以如何製作可攜式的加密資料？
+ 我應該如何確保預定收件人可以讀取我的加密資料？
+ 我應該如何確保已加密資料在寫入和讀取的這段期間不會遭到竄改？
+ 如何使用 AWS KMS 傳回的資料金鑰？

使用 AWS Encryption SDK，您可以定義[主金鑰提供者](concepts.md#master-key-provider)或 [keyring](concepts.md#keyring)，以決定您用來保護資料的包裝金鑰。然後，您可以使用 提供的簡單方法來加密和解密資料 AWS Encryption SDK。會 AWS Encryption SDK 執行其餘動作。

如果沒有 AWS Encryption SDK，您可能會花費比應用程式核心功能更多的精力來建置加密解決方案。提供下列項目來 AWS Encryption SDK 回答這些問題。

**符合加密最佳實務的預設實作**  
根據預設， 會為其加密的每個資料物件 AWS Encryption SDK 產生唯一的資料金鑰。這個做法符合使用唯一資料金鑰進行每次加密操作的加密最佳實務要求。  
會使用安全、經過驗證的對稱金鑰演算法來 AWS Encryption SDK 加密您的資料。如需詳細資訊，請參閱[中支援的演算法套件 AWS Encryption SDK](supported-algorithms.md)。

**使用包裝金鑰保護資料金鑰的架構**  
 AWS Encryption SDK 會在一或多個包裝金鑰下加密資料，以保護加密資料的資料金鑰。透過提供架構來加密具有多個包裝金鑰的資料金鑰， AWS Encryption SDK 有助於讓您的加密資料成為可攜式。  
例如， AWS KMS key 在 下的加密資料， AWS KMS 以及來自現場部署 HSM 的金鑰。您可以使用任一包裝金鑰來解密資料，以防資料無法使用，或發起人沒有同時使用這兩個金鑰的許可。

**儲存已加密資料金鑰和已加密資料的格式化訊息**  
會將加密的資料和加密的資料金鑰一起 AWS Encryption SDK 存放在使用定義資料格式的[加密訊息](concepts.md#message)中。這表示您不需要追蹤或保護加密資料的資料金鑰，因為 會為您 AWS Encryption SDK 執行。

的某些語言實作 AWS Encryption SDK 需要 AWS 開發套件，但 AWS Encryption SDK 不需要 ， AWS 帳戶 也不依賴任何 AWS 服務。 AWS 帳戶 只有在您選擇使用 [AWS KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms-keys) 來保護資料時，才需要 。

## 在開放原始碼儲存庫中開發
<a name="esdk-repos"></a>

 AWS Encryption SDK 是在 GitHub 上的開放原始碼儲存庫中開發。您可以使用這些儲存庫來檢視程式碼、讀取和提交問題，以及尋找您語言實作的特定資訊。
+ 適用於 C 的 AWS Encryption SDK — [aws-encryption-sdk-c](https://github.com/aws/aws-encryption-sdk-c/)
+ AWS Encryption SDK for .NET — `aws-encryption-sdk`儲存庫的 [.NET](https://github.com/aws/aws-encryption-sdk/tree/mainline/AwsEncryptionSDK/runtimes/net/) 目錄。
+ AWS 加密 CLI — [aws-encryption-sdk-cli](https://github.com/aws/aws-encryption-sdk-cli/)
+ 適用於 JAVA 的 AWS Encryption SDK — [aws-encryption-sdk-java](https://github.com/aws/aws-encryption-sdk-java/)
+ 適用於 JavaScript 的 AWS Encryption SDK — [aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/)
+ 適用於 Python 的 AWS Encryption SDK — [aws-encryption-sdk-python](https://github.com/aws/aws-encryption-sdk-python/)
+ AWS Encryption SDK for Rust — `aws-encryption-sdk`儲存庫的 [Rust](https://github.com/aws/aws-encryption-sdk-dafny/tree/mainline/AwsEncryptionSDK/runtimes/rust/) 目錄。
+ AWS Encryption SDK for Go — `aws-encryption-sdk`儲存庫的 [Go](https://github.com/aws/aws-encryption-sdk/tree/mainline/releases/go/encryption-sdk/) 目錄

## 與加密程式庫和服務的相容性
<a name="intro-compatibility"></a>

 AWS Encryption SDK 支援多種[程式設計語言](programming-languages.md)的 。所有語言實作都是可互通的。您可以使用一種語言實作加密，並使用另一種語言進行解密。互通性可能受到語言限制。如果是這樣，這些限制會在語言實作的主題中加以說明。此外，加密和解密時，您必須使用相容的 Keyring，或主金鑰和主金鑰提供者。如需詳細資訊，請參閱[Keyring 相容性](choose-keyring.md#keyring-compatibility)。

不過， AWS Encryption SDK 無法與其他程式庫互通。由於每個程式庫都會以不同的格式傳回加密資料，因此您無法使用一個程式庫加密，並使用另一個程式庫解密。

**DynamoDB 加密用戶端和 Amazon S3 用戶端加密**  <a name="ESDK-DDBEC"></a>
 AWS Encryption SDK 無法解密 [DynamoDB 加密用戶端](https://docs.aws.amazon.com/dynamodb-encryption-client/latest/devguide/)或 [Amazon S3 用戶端加密](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingClientSideEncryption.html)所加密的資料。這些程式庫無法解密 AWS Encryption SDK 傳回的[加密訊息](concepts.md#message)。 

**AWS Key Management Service (AWS KMS)**  <a name="ESDK-KMS"></a>
 AWS Encryption SDK 可以使用 [AWS KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)和 [資料金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#data-keys)來保護您的資料，包括多區域 KMS 金鑰。例如，您可以設定 AWS Encryption SDK 在 AWS KMS keys 中的一或多個 下加密資料 AWS 帳戶。不過，您必須使用 AWS Encryption SDK 來解密該資料。  
 AWS Encryption SDK 無法解密 AWS KMS [Encrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Encrypt.html) 或 [ReEncrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_ReEncrypt.html) 操作傳回的加密文字。同樣地， AWS KMS [解密](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)操作無法解密 AWS Encryption SDK 傳回的[加密訊息](concepts.md#message)。  
僅 AWS Encryption SDK 支援[對稱加密 KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/symm-asymm-concepts.html#symmetric-cmks)。您無法使用[非對稱 KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/symm-asymm-concepts.html#asymmetric-cmks)來加密或登入 AWS Encryption SDK。 AWS Encryption SDK 會針對簽署訊息的[演算法套件](supported-algorithms.md)產生自己的 ECDSA 簽署金鑰。

## 支援和維護
<a name="support"></a>

 AWS Encryption SDK 使用與 AWS SDK 和工具相同的[維護政策](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html)，包括其版本控制和生命週期階段。[最佳實務](best-practices.md)是，建議您 AWS Encryption SDK 針對程式設計語言使用 的最新可用版本，並在發行新版本時升級。當版本需要重大變更時，例如從 1.7.*x* 之前的 AWS Encryption SDK 版本升級至 2.0.*x* 及更新版本，我們會提供[詳細說明](migration.md)來協助您。

的每個程式設計語言實作 AWS Encryption SDK 都是在個別的開放原始碼 GitHub 儲存庫中開發。每個版本的生命週期和支援階段可能因儲存庫而異。例如，指定版本的 AWS Encryption SDK 可能處於一種程式設計語言的一般可用性 （完整支援） 階段，但處於不同程式設計語言的end-of-support階段。我們建議您盡可能使用完全支援的版本，並避免不再支援的版本。

若要尋找程式設計語言 AWS Encryption SDK 版本生命週期階段，請參閱每個 AWS Encryption SDK 儲存庫中的 `SUPPORT_POLICY.rst` 檔案。
+ 適用於 C 的 AWS Encryption SDK — [SUPPORT\$1POLICY.rst](https://github.com/aws/aws-encryption-sdk-c/blob/master/SUPPORT_POLICY.rst)
+ AWS Encryption SDK for .NET — [SUPPORT\$1POLICY.rst](https://github.com/aws/aws-encryption-sdk-dafny/blob/mainline/SUPPORT_POLICY.rst)
+ AWS 加密 CLI — [SUPPORT\$1POLICY.rst](https://github.com/aws/aws-encryption-sdk-cli/blob/master/SUPPORT_POLICY.rst)
+ 適用於 JAVA 的 AWS Encryption SDK — [SUPPORT\$1POLICY.rst](https://github.com/aws/aws-encryption-sdk-java/blob/master/SUPPORT_POLICY.rst)
+ 適用於 JavaScript 的 AWS Encryption SDK — [SUPPORT\$1POLICY.rst](https://github.com/aws/aws-encryption-sdk-javascript/blob/master/SUPPORT_POLICY.rst)
+ 適用於 Python 的 AWS Encryption SDK — [SUPPORT\$1POLICY.rst](https://github.com/aws/aws-encryption-sdk-python/blob/master/SUPPORT_POLICY.rst)

如需詳細資訊，請參閱《SDK 和工具參考指南》中的 和 [的版本 AWS Encryption SDK](about-versions.md) SDK 和工具維護政策。 [AWS SDKs ](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html) AWS SDKs 

## 進一步了解
<a name="intro-see-also"></a>

如需 AWS Encryption SDK 和用戶端加密的詳細資訊，請嘗試這些來源。
+ 如需這個 SDK 中所用名詞和概念的說明資訊，請參閱 [中的概念 AWS Encryption SDK](concepts.md)。
+ 如需最佳實務準則，請參閱 [的最佳實務 AWS Encryption SDK](best-practices.md)。
+ 如需這項 SDK 運作方式的詳細資訊，請參閱 [SDK 如何運作](how-it-works.md)。
+ 如需示範如何在 中設定選項的範例 AWS Encryption SDK，請參閱 [設定 AWS Encryption SDK](configure.md)。
+ 如需技術層面的詳細資訊，請參閱 [AWS Encryption SDK 參考](reference.md)。
+ 如需 的技術規格 AWS Encryption SDK，請參閱 GitHub 中的[AWS Encryption SDK 規格](https://github.com/awslabs/aws-encryption-sdk-specification/)。
+ 如需有關使用 之問題的解答 AWS Encryption SDK，請閱讀並張貼在 [AWS Crypto Tools 開發論壇](https://forums.aws.amazon.com/forum.jspa?forumID=302)。

如需 AWS Encryption SDK 不同程式設計語言之 實作的相關資訊。
+ **C**：請參閱 GitHub 上的 [適用於 C 的 AWS Encryption SDK](c-language.md)、 AWS Encryption SDK [C 文件](https://aws.github.io/aws-encryption-sdk-c/html/)和 [aws-encryption-sdk-c](https://github.com/aws/aws-encryption-sdk-c/) 儲存庫。
+ **C\$1/。NET**：請參閱 [AWS Encryption SDK 適用於 .NET 的](dot-net.md)和 GitHub 上`aws-encryption-sdk`儲存庫的 [aws-encryption-sdk-net](https://github.com/aws/aws-encryption-sdk/tree/mainline/AwsEncryptionSDK/runtimes/net/) 目錄。
+ **命令列界面**：請參閱 [AWS Encryption SDK 命令列界面](crypto-cli.md)、[閱讀加密 CLI 的文件](https://aws-encryption-sdk-cli.readthedocs.io/en/latest/)，以及 GitHub 上的 [aws-encryption-sdk-cli](https://github.com/aws/aws-encryption-sdk-cli/) 儲存庫。 AWS 
+ **Java**：請參閱 GitHub 上的 [適用於 JAVA 的 AWS Encryption SDK](java.md)、 AWS Encryption SDK [Javadoc](https://aws.github.io/aws-encryption-sdk-java/) 和 [aws-encryption-sdk-java](https://github.com/aws/aws-encryption-sdk-java/) 儲存庫。

  **JavaScript**：請參閱 [適用於 JavaScript 的 AWS Encryption SDK](javascript.md) 和 GitHub 上的 [aws-encryption-sdk-javascript](https://github.com/aws/aws-encryption-sdk-javascript/) 儲存庫。
+ **Python**：請參閱 GitHub 上的 [適用於 Python 的 AWS Encryption SDK](python.md)、 AWS Encryption SDK [Python 文件](https://aws-encryption-sdk-python.readthedocs.io/en/latest/)和 [aws-encryption-sdk-python](https://github.com/aws/aws-encryption-sdk-python/) 儲存庫。

## 傳送意見回饋
<a name="report-issues"></a>

我們誠摯歡迎您提供意見回饋。如果您有問題或意見、問題或報告，請使用以下資源。
+ 如果您在 中發現潛在的安全性漏洞 AWS Encryption SDK，請[通知 AWS 安全性](https://aws.amazon.com/security/vulnerability-reporting/)。請勿建立公有 GitHub 問題。
+ 若要提供 的意見回饋 AWS Encryption SDK，請在 GitHub 儲存庫中針對您正在使用的程式設計語言提出問題。
+ 若要提供本文件的意見回饋，請使用此頁面上的**意見回饋**連結。您也可以對 [aws-encryption-sdk-docs](https://github.com/awsdocs/aws-encryption-sdk-docs) (GitHub 上此文件的開放原始碼儲存庫) 提出問題或使其更加完善。

# 中的概念 AWS Encryption SDK
<a name="concepts"></a>

本節介紹 中使用的概念 AWS Encryption SDK，並提供詞彙表和參考。它旨在協助您了解 AWS Encryption SDK 的運作方式，以及我們用來描述它的術語。

需要幫助？ 
+ 了解 如何使用 AWS Encryption SDK [信封加密](#envelope-encryption)來保護您的資料。
+ 了解信封加密的元素：保護資料[的資料金鑰](#DEK)，以及保護資料金鑰的[包裝金鑰](#master-key)。
+ 了解決定您使用哪些包裝金鑰[的 keyring](#keyring) 和[主金鑰提供者](#master-key-provider)。
+ 了解為您的[加密程序新增完整性的加密內容](#encryption-context)。這是選用的，但我們建議的最佳實務是。
+ 了解加密方法傳回的加密[訊息](#message)。
+ 然後，您就可以在 AWS Encryption SDK 偏好的[程式設計語言](programming-languages.md)中使用 。

**Topics**
+ [封套加密](#envelope-encryption)
+ [資料金鑰](#DEK)
+ [包裝金鑰](#master-key)
+ [Keyring 和主金鑰提供者](#keyring)
+ [加密內容](#encryption-context)
+ [加密的訊息](#message)
+ [演算法套件](#crypto-algorithm)
+ [密碼編譯資料管理員](#crypt-materials-manager)
+ [對稱和非對稱加密](#symmetric-key-encryption)
+ [金鑰承諾](#key-commitment)
+ [承諾政策](#commitment-policy)
+ [數位簽章](#digital-sigs)

## 封套加密
<a name="envelope-encryption"></a>

加密資料的安全性有一部分取決於保護能夠解密資料的資料金鑰。加密處理金鑰是保護資料金鑰的一種最佳實務。若要這樣做，您需要另一個加密金鑰，稱為*金鑰加密金鑰*或[包裝金鑰](#master-key)。使用包裝金鑰加密資料金鑰的做法稱為*信封加密*。

**保護資料金鑰**  
會使用唯一的資料金鑰 AWS Encryption SDK 加密每個訊息。然後，它會在您指定的包裝金鑰下加密資料金鑰。它會將加密的資料金鑰與加密的資料存放在其傳回的加密訊息中。  
若要指定包裝金鑰，請使用 [keyring](#keyring) 或[主金鑰提供者](#master-key-provider)。  

![\[使用 進行信封加密 AWS Encryption SDK\]](http://docs.aws.amazon.com/zh_tw/encryption-sdk/latest/developer-guide/images/envelope-encryption-70.png)


**在多個包裝金鑰下加密相同的資料**  
您可以在多個包裝金鑰下加密資料金鑰。您可能想要為不同的使用者提供不同的包裝金鑰，或將不同類型的金鑰包裝在不同的位置。每個包裝金鑰都會加密相同的資料金鑰。會將所有加密的資料金鑰與加密的資料 AWS Encryption SDK 存放在加密的訊息中。  
若要解密資料，您需要提供可解密其中一個加密資料金鑰的包裝金鑰。  

![\[每個包裝金鑰都會加密相同的資料金鑰，為每個包裝金鑰產生一個加密的資料金鑰\]](http://docs.aws.amazon.com/zh_tw/encryption-sdk/latest/developer-guide/images/multiple-wrapping-keys-70.png)


**結合多種演算法的優勢**  
若要加密您的資料，根據預設， AWS Encryption SDK 會使用複雜的[演算法套件](supported-algorithms.md)搭配 AES-GCM 對稱加密、金鑰衍生函數 (HKDF) 和簽署。若要加密資料金鑰，您可以指定適合您包裝金鑰的[對稱或非對稱加密演算法](#symmetric-key-encryption)。  
一般而言，相較於非對稱或*公有金鑰加密*，對稱金鑰加密演算法速度較快，產生的加密文字較小。但是，公開金鑰演算法本質上就會區隔角色，因此金鑰管理較為方便。若要結合每個 的優點，您可以使用對稱金鑰加密來加密資料，然後使用公有金鑰加密來加密資料金鑰。

## 資料金鑰
<a name="DEK"></a>

*資料金鑰*是 AWS Encryption SDK 用來加密資料的加密金鑰。每個資料金鑰是符合密碼編譯金鑰需求的位元組陣列。除非您使用[資料金鑰快取](data-key-caching.md)，否則 AWS Encryption SDK 會使用唯一的資料金鑰來加密每則訊息。

您不需要指定、產生、實作、擴展、保護或使用資料金鑰。 AWS Encryption SDK 會在您呼叫加密和解密操作時為您代勞。

為了保護您的資料金鑰， 會使用一或多個稱為[包裝金鑰](#master-key)或主金鑰 AWS Encryption SDK 的金鑰加密金鑰進行加密。 **在 AWS Encryption SDK 使用您的純文字資料金鑰來加密您的資料後，它會盡快將其從記憶體中移除。然後，將加密的資料金鑰連同加密的資料一起存放在加密操作傳回的[已加密訊息](#message)中。如需詳細資訊，請參閱[AWS Encryption SDK 的運作方式](how-it-works.md)。

**提示**  
在 中 AWS Encryption SDK，我們將*資料金鑰*與*資料加密金鑰*區分開來。數個支援的[演算法套件](#crypto-algorithm) (包括預設套件)，使用[金鑰衍生函數](https://en.wikipedia.org/wiki/Key_derivation_function)來防止資料金鑰達到其密碼編譯限制。金鑰衍生函數採用資料金鑰做為輸入，並傳回實際用來加密資料的資料加密金鑰。因此，我們通常會說資料是在資料金鑰「底下」加密，而不是「由」資料金鑰加密。

每個加密的資料金鑰都包含中繼資料，包括加密它的包裝金鑰識別符。此中繼資料可讓 在解密時更輕鬆地 AWS Encryption SDK 識別有效的包裝金鑰。

## 包裝金鑰
<a name="master-key"></a>

*包裝金鑰*是金鑰加密金鑰， AWS Encryption SDK 用來加密加密您[資料的資料金鑰](#DEK)。每個純文字資料金鑰都可以在一或多個包裝金鑰下加密。當您設定 [keyring](#keyring) 或[主金鑰提供者時，您可以決定使用哪些包裝金鑰](#master-key-provider)來保護您的資料。

**注意**  
*包裝金鑰*是指 keyring 或主金鑰提供者中的金鑰。*主金鑰*通常與您在使用主金鑰提供者時執行個體化的`MasterKey`類別相關聯。

 AWS Encryption SDK 支援數個常用的包裝金鑰，例如 AWS Key Management Service (AWS KMS) 對稱 [AWS KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)（包括[多區域 KMS 金鑰](configure.md#config-mrks))、原始 AES-GCM （進階加密標準/Galois 計數器模式） 金鑰，以及原始 RSA 金鑰。您也可以擴展或實作自己的包裝金鑰。

使用信封加密時，您需要保護包裝金鑰免於未經授權的存取。您可以透過下列任何方式執行此操作：
+ 使用專為這個用途所設計的 Web 服務，例如 [AWS Key Management Service (AWS KMS)](https://aws.amazon.com/kms/)。
+ 使用[硬體安全模組 (HSM)](https://en.wikipedia.org/wiki/Hardware_security_module)，例如 [AWS CloudHSM](https://aws.amazon.com/cloudhsm/) 所提供的功能。
+ 使用其他金鑰管理工具和服務。

如果您沒有金鑰管理系統，建議您使用 AWS KMS。與 AWS Encryption SDK 整合 AWS KMS ，以協助您保護和使用您的包裝金鑰。不過， AWS Encryption SDK 不需要 AWS 或任何 AWS 服務。

## Keyring 和主金鑰提供者
<a name="keyring"></a>

若要指定用於加密和解密的包裝金鑰，請使用 keyring 或主金鑰提供者。您可以使用 AWS Encryption SDK 提供的 keyring 和主金鑰提供者，或設計您自己的實作。 AWS Encryption SDK 提供 keyring 和主金鑰提供者，這些提供者彼此相容，受到語言限制。如需詳細資訊，請參閱[Keyring 相容性](choose-keyring.md#keyring-compatibility)。

*Keying* 會產生、加密和解密資料金鑰。當您定義 keyring 時，您可以指定用來加密資料[金鑰的包裝](#master-key)金鑰。大多數 keyring 指定至少一個包裝金鑰或服務，提供和保護包裝金鑰。您也可以定義沒有包裝金鑰的 keyring，或使用其他組態選項定義更複雜的 keyring。如需選擇和使用 AWS Encryption SDK 定義之 keyring 的說明，請參閱 [Keyring](choose-keyring.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) 相依性搭配使用時。
+ for Rust 的 1.*x* AWS Encryption SDK 版
+ 適用於 Go 的 0.1.*x* AWS Encryption SDK 版或更新版本

*主金鑰提供者*是 keyring 的替代方案。主金鑰提供者會傳回您指定的包裝金鑰 （或主金鑰）。每個主金鑰都關聯至一個主金鑰提供者，但主金鑰提供者通常可提供多個主金鑰。Java、Python 和 AWS Encryption CLI 支援主金鑰提供者。

您必須指定 keyring （或主金鑰提供者） 以進行加密。您可以為解密指定相同的 keyring （或主金鑰提供者） 或不同的 keyring。加密時， AWS Encryption SDK 會使用您指定的所有包裝金鑰來加密資料金鑰。解密時， 只會 AWS Encryption SDK 使用您指定的包裝金鑰來解密加密的資料金鑰。指定用於解密的包裝金鑰是選用的，但這是 AWS Encryption SDK [最佳實務](best-practices.md)。

如需指定包裝金鑰的詳細資訊，請參閱 [選取包裝金鑰](configure.md#config-keys)。

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

為了改進密碼編譯操作的安全性，請在所有加密資料請求中包含加密內容。使用加密內容是選用的，但卻是建議的密碼編譯最佳實務。

*加密內容*是一組名稱/值對，其中包含任意非私密的額外驗證資料。加密內容可以包含您選擇的任何資料，但通常包含有利於記錄和追蹤的資料，例如有關檔案類型、用途或擁有權的資料。當您加密資料時，加密內容會以密碼演算法繫結至加密的資料，因此在解密資料時需要相同的加密內容。 AWS Encryption SDK 在它傳回的[已加密訊息](#message)的標頭中，以純文字包含加密內容。

 AWS Encryption SDK 使用的加密內容包含您指定的加密內容，以及[密碼編譯資料管理員](#crypt-materials-manager) (CMM) 新增的公有金鑰對。具體而言，當您使用[加密演算法搭配簽署](algorithms-reference.md)時，CMM 會將名稱/值對新增到加密內容，其中包含預留名稱 `aws-crypto-public-key` 和代表公有驗證金鑰的值。加密內容中的`aws-crypto-public-key`名稱由 保留 AWS Encryption SDK ，不能用作加密內容中任何其他對的名稱。如需詳細資訊，請參閱*訊息格式參考*中的 [AAD](message-format.md#header-aad)。

以下範例加密內容包含請求中指定的兩個加密內容對，以及 CMM 新增的公有金鑰對。

```
"Purpose"="Test", "Department"="IT", aws-crypto-public-key=<public key>
```

若要解密資料，您需傳入已加密訊息。由於 AWS Encryption SDK 可以從加密的訊息標頭擷取加密內容，因此您不需要分別提供加密內容。不過，加密內容可協助您確認您正在解密正確的已加密訊息。
+ 在 [AWS Encryption SDK 命令列界面](crypto-cli.md) (CLI)，如果您在解密命令中提供加密內容，CLI 在傳回純文字資料之前會驗證值是否存在於已加密訊息的加密內容中。
+ 在其他程式設計語言實作中，解密回應包含加密內容和純文字資料。您應用程式中的解密函數在傳回純文字資料之前，應該一律驗證解密回應中的加密內容包含解密請求中的加密內容 (或子集)。

**注意**  
下列版本支援[必要的加密內容 CMM](configure.md#config-required-encryption-context-cmm)，您可以用來在所有加密請求中要求加密內容。  
3.*x* 版 適用於 JAVA 的 AWS Encryption SDK
 AWS Encryption SDK 適用於 .NET 的 4.*x* 版和更新版本
4.*x* 版 適用於 Python 的 AWS Encryption SDK，與選用[的加密材料提供者程式庫](https://github.com/aws/aws-cryptographic-material-providers-library) (MPL) 相依性搭配使用時。
for Rust 1.*x* AWS Encryption SDK 版
適用於 Go 的 0.1.*x* AWS Encryption SDK 版或更新版本

選擇加密內容時，請記住，它不是秘密。加密內容會以純文字顯示在 AWS Encryption SDK 傳回的[加密訊息](#message)標頭中。如果您使用的是 AWS Key Management Service，加密內容也可能以純文字顯示在稽核記錄和日誌中，例如 AWS CloudTrail。

如需在程式碼中提交和驗證加密內容的範例，請參閱您偏好的[程式設計語言](programming-languages.md)範例。

## 加密的訊息
<a name="message"></a>

當您使用 加密資料時 AWS Encryption SDK，它會傳回加密的訊息。

*加密訊息*是一種可攜式[格式化的資料結構](message-format.md)，其中包含加密的資料以及加密的資料金鑰、演算法 ID，以及選擇性的[加密內容](#encryption-context)和[數位簽章](#digital-sigs)。 AWS Encryption SDK 中的加密操作會傳回已加密訊息，而解密操作會將已加密訊息當做輸入。

結合加密的資料與其加密的資料金鑰可以簡化解密操作，您也不用再將加密的資料金鑰，於其進行加密的資料分開來存放和管理。

如需已加密訊息的相關技術資訊，請參閱[加密的訊息格式](message-format.md)。

## 演算法套件
<a name="crypto-algorithm"></a>

 AWS Encryption SDK 使用演算法套件來加密和簽署加密和解密操作傳回的[加密訊息](#message)中的資料。 AWS Encryption SDK 支援數個[演算法套件](supported-algorithms.md)。所有支援的套件都使用進階加密標準 (AES) 做為主要演算法，並將它與其他演算法和值結合。

會 AWS Encryption SDK 建立建議的演算法套件，做為所有加密操作的預設值。預設套件可能隨著標準和最佳實務改進而變更。您可以在加密資料的請求中或在建立[密碼編譯資料管理員 (CMM)](#crypt-materials-manager) 時指定替代演算法套件，但除非情況需要替代演算法套件，否則最好使用預設值。目前的預設值是具有 HMAC extract-and-expand[金鑰衍生函數 ](https://en.wikipedia.org/wiki/HKDF)([HKDF](https://en.wikipedia.org/wiki/HKDF))、[金鑰承諾](#key-commitment)、[橢圓曲線數位簽章演算法 (ECDSA)](#digital-sigs) 簽章和 256 位元加密金鑰的 AES-GCM。

如果您的應用程式需要高效能，而且加密資料的使用者和解密資料的使用者同樣受信任，您可以考慮指定沒有數位簽章的演算法套件。不過，我們強烈建議使用演算法套件，其中包含金鑰承諾和金鑰衍生函數。沒有這些功能的演算法套件僅支援回溯相容性。

## 密碼編譯資料管理員
<a name="crypt-materials-manager"></a>

密碼編譯資料管理員 (CMM) 會組合用於加密和解密資料的密碼編譯資料。*密碼編譯資料*包含純文字和加密的資料金鑰，以及選用的訊息簽署金鑰。您永遠不會直接與 CMM 互動。加密和解密方法會為您代勞。

您可以使用 AWS Encryption SDK 提供的預設 CMM 或[快取 CMM](data-key-caching.md)，或撰寫自訂 CMM。您也可以指定 CMM，但這不是必要的。當您指定 keyring 或主金鑰提供者時， 會為您 AWS Encryption SDK 建立預設 CMM。預設 CMM 會從您指定的 keyring 或主金鑰提供者取得加密或解密資料。這可能牽涉到呼叫密碼編譯服務，例如 [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/) (AWS KMS)。

由於 CMM 充當 AWS Encryption SDK 與 keyring （或主金鑰提供者） 之間的聯絡人，因此它是自訂和延伸的理想點，例如支援政策強制執行和快取。 AWS Encryption SDK 提供快取 CMM 以支援[資料金鑰快取。](data-key-caching.md)

## 對稱和非對稱加密
<a name="symmetric-key-encryption"></a>

*對稱加密*使用相同的金鑰來加密和解密資料。

*非對稱加密*使用數學上相關的資料金鑰對。配對中的一個金鑰會加密資料；只有配對中的另一個金鑰可以解密資料。

 AWS Encryption SDK 使用[信封加密](#envelope-encryption)。它會使用對稱資料金鑰來加密您的資料。它會使用一或多個對稱或非對稱包裝金鑰來加密對稱資料金鑰。它會傳回[加密訊息](#message)，其中包含加密的資料和至少一個加密的資料金鑰副本。

**加密您的資料 （對稱加密）**  
為了加密您的資料， AWS Encryption SDK 使用對稱[資料金鑰](#DEK)和包含對稱加密演算法的[演算法套件](#crypto-algorithm)。若要解密資料， AWS Encryption SDK 會使用相同的資料金鑰和相同的演算法套件。

**加密您的資料金鑰 （對稱或非對稱加密）**  
您提供給加密和解密操作的 [keyring](#keyring) 或[主金鑰提供者](#master-key-provider)會決定對稱資料金鑰的加密和解密方式。您可以選擇使用對稱加密的 keyring 或主金鑰提供者，例如 AWS KMS keyring，或使用非對稱加密的 keyring 或 ，例如原始 RSA keyring 或 `JceMasterKey`。

## 金鑰承諾
<a name="key-commitment"></a>

 AWS Encryption SDK 支援*金鑰承諾* （有時稱為*穩健性*)，這是一種安全屬性，可保證每個加密文字只能解密為單一純文字。若要這樣做，金鑰承諾保證只會使用加密訊息的資料金鑰來解密訊息。使用金鑰承諾進行加密和解密是[AWS Encryption SDK 最佳實務](best-practices.md)。

大多數現代對稱密碼 （包括 AES) 會在單一私密金鑰下加密純文字，例如 AWS Encryption SDK 用來加密每個純文字訊息[的唯一資料金鑰](#DEK)。使用相同的資料金鑰解密此資料會傳回與原始資料相同的純文字。使用不同金鑰進行解密通常會失敗。不過，您可以在兩個不同的金鑰下解密加密文字。在極少數情況下，您可以找到可以解密幾個位元組加密文字的金鑰，但仍無法理解的純文字。

 AWS Encryption SDK 一律在一個唯一的資料金鑰下加密每個純文字訊息。它可能會在多個包裝金鑰 （或主金鑰） 下加密該資料金鑰，但包裝金鑰一律會加密相同的資料金鑰。不過，複雜的手動製作[加密訊息](#message)實際上可能包含不同的資料金鑰，每個金鑰都由不同的包裝金鑰加密。例如，如果一個使用者解密加密的訊息，則會傳回 0x0 (false)，而另一個解密相同加密訊息的使用者則得到 0x1 (true)。

為了防止這種情況， 在加密和解密時， AWS Encryption SDK 支援金鑰承諾。當 使用金鑰承諾 AWS Encryption SDK 加密訊息時，它會以密碼編譯方式將產生加密文字的唯一資料金鑰繫結至*金鑰承諾字串*，此為非秘密資料金鑰識別符。然後，它會將金鑰承諾字串存放在加密訊息的中繼資料中。當它使用金鑰承諾解密訊息時， AWS Encryption SDK 會驗證資料金鑰是否為該加密訊息的唯一金鑰。如果資料金鑰驗證失敗，解密操作會失敗。

在 1.7.*x* 版中引入了對金鑰承諾的支援，這可以解密具有金鑰承諾的訊息，但不會使用金鑰承諾加密。您可以使用此版本來完全部署透過金鑰承諾解密加密文字的功能。2.0.*x* 版包含金鑰承諾的完整支援。根據預設，它只會使用金鑰承諾來加密和解密。對於不需要解密舊版 加密之加密文字的應用程式，這是理想的組態 AWS Encryption SDK。

雖然使用金鑰承諾進行加密和解密是最佳實務，但我們會讓您決定何時使用它，並讓您調整採用它的步調。從 1.7.*x* 版開始， AWS Encryption SDK 支援設定[預設演算法套件](supported-algorithms.md)並限制可能使用的演算法套件[的承諾政策](#commitment-policy)。此政策會判斷您的資料是否使用金鑰承諾進行加密和解密。

金鑰承諾會產生[稍大 (\$1 30 個位元組） 的加密訊息](message-format.md)，並需要更多時間來處理。如果您的應用程式對大小或效能非常敏感，您可以選擇不接收金鑰承諾。但只有在您必須這麼做時，才能這麼做。

如需遷移至 1.7.*x* 和 2.0.*x* 版的詳細資訊，包括其主要承諾功能，請參閱 [遷移您的 AWS Encryption SDK](migration.md)。如需金鑰承諾的技術資訊，請參閱 [AWS Encryption SDK 演算法參考](algorithms-reference.md)和 [AWS Encryption SDK 訊息格式參考](message-format.md)。

## 承諾政策
<a name="commitment-policy"></a>

*承諾政策*是一種組態設定，可判斷您的應用程式是否使用[金鑰承諾](#key-commitment)來加密和解密。使用金鑰承諾進行加密和解密是[AWS Encryption SDK 最佳實務](best-practices.md)。

承諾政策有三個值。

**注意**  
您可能需要水平或垂直捲動才能查看整個資料表。


**承諾政策值**  

| Value | 使用金鑰承諾加密 | 在沒有金鑰承諾的情況下加密 | 使用金鑰承諾解密 | 在沒有金鑰承諾的情況下解密 | 
| --- | --- | --- | --- | --- | 
| ForbidEncryptAllowDecrypt | ![\[Red circle with white X inside, indicating prohibition or cancellation.\]](http://docs.aws.amazon.com/zh_tw/encryption-sdk/latest/developer-guide/images/icon-no.png)  | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/zh_tw/encryption-sdk/latest/developer-guide/images/icon-yes.png)  | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/zh_tw/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/zh_tw/encryption-sdk/latest/developer-guide/images/icon-yes.png) | 
| RequireEncryptAllowDecrypt | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/zh_tw/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Red circle with white X inside, indicating prohibition or cancellation.\]](http://docs.aws.amazon.com/zh_tw/encryption-sdk/latest/developer-guide/images/icon-no.png) | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/zh_tw/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/zh_tw/encryption-sdk/latest/developer-guide/images/icon-yes.png) | 
| RequireEncryptRequireDecrypt | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/zh_tw/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Red circle with white X inside, indicating prohibition or cancellation.\]](http://docs.aws.amazon.com/zh_tw/encryption-sdk/latest/developer-guide/images/icon-no.png) | ![\[Green checkmark icon indicating approval or confirmation.\]](http://docs.aws.amazon.com/zh_tw/encryption-sdk/latest/developer-guide/images/icon-yes.png) | ![\[Red circle with white X inside, indicating prohibition or cancellation.\]](http://docs.aws.amazon.com/zh_tw/encryption-sdk/latest/developer-guide/images/icon-no.png) | 

承諾政策設定在 1.7.*x* AWS Encryption SDK 版中推出。它適用於所有支援的[程式設計語言](programming-languages.md)。
+ `ForbidEncryptAllowDecrypt` 會在有或沒有金鑰承諾的情況下解密，但不會使用金鑰承諾加密。此值在 1.7.*x* 版中推出，旨在準備執行您應用程式的所有主機，以便在遇到使用金鑰承諾加密的加密文字之前，使用金鑰承諾進行解密。
+ `RequireEncryptAllowDecrypt` 一律使用金鑰承諾加密。它可以在有或沒有金鑰承諾的情況下解密。此值在 2.0.*x* 版中推出，可讓您使用金鑰承諾開始加密，但仍會解密舊版加密文字，而無需金鑰承諾。
+ `RequireEncryptRequireDecrypt` 僅使用金鑰承諾來加密和解密。此值是 2.0.*x* 版的預設值。當您確定所有加密文字都使用金鑰承諾加密時，請使用此值。

承諾政策設定會決定您可以使用哪些演算法套件。從 1.7.*x* 版開始， AWS Encryption SDK 支援用於金鑰承諾的[演算法套件](supported-algorithms.md)；包含和不包含簽署。如果您指定的演算法套件與您的承諾政策衝突，則 AWS Encryption SDK 會傳回錯誤。

如需設定承諾政策的說明，請參閱 [設定您的承諾政策](migrate-commitment-policy.md)。

## 數位簽章
<a name="digital-sigs"></a>

使用已驗證的 AWS Encryption SDK 加密演算法 AES-GCM 加密您的資料，解密程序會驗證已加密訊息的完整性和真實性，而無需使用數位簽章。但是，由於 AES-GCM 使用對稱金鑰，任何可以解密用於解密加密文字的資料金鑰的人，也可以手動建立新的加密加密文字，造成潛在的安全問題。例如，如果您使用 AWS KMS key 做為包裝金鑰，具有 `kms:Decrypt` 許可的使用者可以建立加密的加密文字，而無需呼叫 `kms:Encrypt`。

為了避免此問題， AWS Encryption SDK 支援將橢圓曲線數位簽章演算法 (ECDSA) 簽章新增至加密訊息的結尾。使用簽署演算法套件時， 會為每個加密的訊息 AWS Encryption SDK 產生臨時私有金鑰和公有金鑰對。會將公有金鑰 AWS Encryption SDK 存放在資料金鑰的加密內容中，並捨棄私有金鑰。這可確保沒有人可以建立另一個使用公有金鑰驗證的簽章。演算法會將公有金鑰繫結至加密的資料金鑰，做為訊息標頭中的其他已驗證資料，防止只能解密訊息的使用者更改公有金鑰或影響簽章驗證。

簽章驗證會增加解密的顯著效能成本。如果加密資料的使用者和解密資料的使用者同樣受信任，請考慮使用不包含簽署的演算法套件。

**注意**  
如果包裝密碼編譯材料的 keyring 或存取權未在加密程式和解密程式之間定義，則數位簽章不提供密碼編譯值。

[AWS KMS keyring，](use-kms-keyring.md)包括非對稱 RSA AWS KMS keyring，可以根據 AWS KMS 金鑰政策和 IAM 政策來描述加密程式和解密程式。

由於其密碼編譯性質，下列 keyring 無法在加密程式和解密程式之間描述：
+ AWS KMS 階層式 keyring
+ AWS KMS ECDH keyring
+ 原始 AES keyring
+ 原始 RSA keyring
+ 原始 ECDH keyring

# AWS Encryption SDK 的運作方式
<a name="how-it-works"></a>

本節中的工作流程說明 如何 AWS Encryption SDK 加密資料和解密[加密的訊息](concepts.md#message)。這些工作流程使用預設功能描述基本程序。如需定義和使用自訂元件的詳細資訊，請參閱每個支援[語言實作](programming-languages.md)的 GitHub 儲存庫。

 AWS Encryption SDK 使用信封加密來保護您的資料。每個訊息都會以唯一的資料金鑰加密。然後，資料金鑰會由您指定的包裝金鑰加密。若要解密加密的訊息， AWS Encryption SDK 會使用您指定的包裝金鑰來解密至少一個加密的資料金鑰。然後，它可以解密加密文字並傳回純文字訊息。

需要我們在 中使用的術語協助 AWS Encryption SDK嗎？ 請參閱 [中的概念 AWS Encryption SDK](concepts.md)。

## 如何 AWS Encryption SDK 加密資料
<a name="encrypt-workflow"></a>

 AWS Encryption SDK 提供加密字串、位元組陣列和位元組串流的方法。如需程式碼範例，請參閱每個[程式設計語言](programming-languages.md)區段中的範例主題。

1. 建立 [keyring](choose-keyring.md) （或[主金鑰提供者](concepts.md#master-key-provider))，指定保護資料的包裝金鑰。

1. 將 keyring 和純文字資料傳遞至 加密方法。我們建議您傳遞選用的非秘密[加密內容](concepts.md#encryption-context)。

1. 加密方法會向 keyring 詢問加密資料。keyring 會傳回訊息的唯一資料加密金鑰：一個純文字資料金鑰，以及每個指定包裝金鑰加密的資料金鑰複本。

1. 這項加密方法會使用純文字資料金鑰來加密資料，接著再捨棄該純文字資料金鑰。如果您提供加密內容 AWS Encryption SDK ([最佳實務](best-practices.md))，加密方法會以密碼編譯方式將加密內容繫結至加密的資料。

1. 如果您使用加密方法，加密方法會傳回加密[訊息](concepts.md#message)，其中包含加密的資料、加密的資料金鑰和其他中繼資料，包括加密內容。

## 如何 AWS Encryption SDK 解密加密的訊息
<a name="decrypt-workflow"></a>

 AWS Encryption SDK 提供解密[加密訊息](concepts.md#message)並傳回純文字的方法。如需程式碼範例，請參閱每個[程式設計語言](programming-languages.md)區段中的範例主題。

解密加密訊息的 [keyring](choose-keyring.md) （或[主金鑰提供者](concepts.md#master-key-provider)) 必須與用來加密訊息的 keyring （或主金鑰提供者） 相容。其中一個包裝金鑰必須能夠解密加密訊息中的加密資料金鑰。如需有關 keyring 和主金鑰提供者相容性的資訊，請參閱 [Keyring 相容性](choose-keyring.md#keyring-compatibility)。

1. 使用可解密資料的包裝金鑰來建立 keyring 或主金鑰提供者。您可以使用您提供給加密方法的相同 keyring 或其他 keyring。

1. 將[加密的訊息](concepts.md#message)和 keyring 傳遞至解密方法。

1. 解密方法會要求 keyring 或主金鑰提供者解密加密訊息中的其中一個加密資料金鑰。它會從加密的訊息傳入資訊，包括加密的資料金鑰。

1. keyring 使用其包裝金鑰來解密其中一個加密的資料金鑰。如果成功，回應會包含純文字資料金鑰。如果 keyring 或主金鑰提供者指定的包裝金鑰都無法解密加密的資料金鑰，解密呼叫會失敗。

1. 解密方法使用純文字資料金鑰來解密資料、捨棄純文字資料金鑰，並傳回純文字資料。

# 中支援的演算法套件 AWS Encryption SDK
<a name="supported-algorithms"></a>

*演算法套件*是加密演算法與相關數值的集合。密碼編譯系統使用演算法實作來產生加密文字訊息。

 AWS Encryption SDK 演算法套件使用 Galois/計數器模式 (GCM) 中的進階加密標準 (AES) 演算法，稱為 AES-GCM，來加密原始資料。 AWS Encryption SDK 支援 256 位元、192 位元和 128 位元加密金鑰。初始向量 (IV) 的長度一律是 12 個位元組。驗證標籤的長度一律是 16 個位元組。

根據預設， AWS Encryption SDK 使用具有 AES-GCM 的演算法套件搭配 HMAC extract-and-expand金鑰衍生函數 ([HKDF](https://en.wikipedia.org/wiki/HKDF))、簽署和 256 位元加密金鑰。如果[承諾政策](concepts.md#commitment-policy)需要[金鑰承諾](concepts.md#key-commitment)， 會 AWS Encryption SDK 選取也支援金鑰承諾的演算法套件；否則，它會選取具有金鑰衍生和簽署的演算法套件，但不會選取金鑰承諾。

## 建議：具有金鑰衍生、簽署和金鑰承諾的 AES-GCM
<a name="recommended-algorithms"></a>

 AWS Encryption SDK 建議使用演算法套件，透過將 256 位元資料加密金鑰提供給 HMAC extract-and-expand金鑰衍生函數 (HKDF) 來衍生 AES-GCM 加密金鑰。 AWS Encryption SDK 會新增橢圓曲線數位簽章演算法 (ECDSA) 簽章。為了支援[金鑰承諾](concepts.md#key-commitment)，此演算法套件也會衍生*金鑰承諾字串* – 非秘密資料金鑰識別符 – 存放在加密訊息的中繼資料中。此金鑰承諾字串也會使用類似衍生資料加密金鑰的程序，透過 HKDF 衍生。


**AWS Encryption SDK 演算法套件**  

| 加密演算法 | 資料加密金鑰長度 (以位元為單位) | 金鑰衍生演算法 | 簽章演算法 | 金鑰承諾 | 
| --- | --- | --- | --- | --- | 
| AES-GCM | 256 | HKDF，SHA-384 式 | ECDSA，P-384 和 SHA-384 式 | HKDF 搭配 SHA-512 | 

HKDF 可協助您避免意外重複使用資料加密金鑰，並降低過度使用資料金鑰的風險。

對於簽署，此演算法套件使用 ECDSA 搭配密碼編譯雜湊函數演算法 (SHA-384)。預設會使用 ECDSA，即使基礎主金鑰政策未指定使用。[訊息簽署](concepts.md#digital-sigs)會驗證訊息寄件者是否獲授權加密訊息，並提供不可否認性。當主金鑰的授權政策允許一組使用者進行資料加密，並允許另外一組使用者進行資料解密時，這種做法特別有用。

具有金鑰承諾的演算法套件可確保每個加密文字只解密為一個純文字。它們透過驗證用作加密演算法輸入的資料金鑰的身分來執行此操作。加密時，這些演算法套件會衍生金鑰承諾字串。在解密之前，他們會驗證資料金鑰是否符合金鑰承諾字串。如果沒有，解密呼叫會失敗。

## 其他支援的演算法套件
<a name="other-algorithms"></a>

為了回溯相容性， AWS Encryption SDK 支援下列替代演算法套件。一般而言，我們不建議這些演算法套件。不過，我們了解簽署可能會嚴重阻礙效能，因此我們為這些案例提供具有金鑰衍生的金鑰遞交套件。對於必須做出更重大效能權衡的應用程式，我們會繼續提供缺少簽署、金鑰承諾和金鑰衍生的套件。

**沒有金鑰承諾的 AES-GCM**  
沒有金鑰承諾的演算法套件在解密之前不會驗證資料金鑰。因此，這些演算法套件可能會將單一加密文字解密為不同的純文字訊息。不過，由於具有金鑰承諾的演算法套件會產生[稍大 (\$130 位元組） 的加密訊息](message-format.md)，且需要更長的時間來處理，因此可能不是每個應用程式的最佳選擇。  
 AWS Encryption SDK 支援具有金鑰衍生、金鑰承諾、簽署的演算法套件，以及具有金鑰衍生和金鑰承諾但不簽署的演算法套件。我們不建議在沒有金鑰承諾的情況下使用演算法套件。如果您必須這麼做，建議您使用具有金鑰衍生和金鑰承諾的演算法套件，但不要簽署。不過，如果您的應用程式效能描述檔支援使用演算法套件，則使用具有金鑰承諾、金鑰衍生和簽署的演算法套件是最佳實務。

**無需簽署的 AES-GCM**  
沒有簽署的演算法套件缺少提供真實性和不可否認性的 ECDSA 簽章。只有當加密資料的使用者和解密資料的使用者同樣受信任時，才使用這些套件。  
使用演算法套件而不簽署時，建議您選擇具有金鑰衍生和金鑰承諾的演算法套件。

**不含金鑰衍生的 AES-GCM**  
沒有金鑰衍生的演算法套件會使用資料加密金鑰做為 AES-GCM 加密金鑰，而不是使用金鑰衍生函數來衍生唯一金鑰。我們不鼓勵使用此套件來產生加密文字，但基於相容性原因， AWS Encryption SDK 支援此套件。

如需這些套件在程式庫中如何表示與使用的詳細資訊，請參閱[AWS Encryption SDK 演算法參考](algorithms-reference.md)。