

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

# 中的概念 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