

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

# 常見問答集
<a name="faq"></a>

**Topics**
+ [與 AWS SDKs有何 AWS Encryption SDK 不同？](#aws-sdks)
+ [與 Amazon S3 加密用戶端有何 AWS Encryption SDK 不同？](#s3-encryption-client)
+ [支援哪些密碼編譯演算法 AWS Encryption SDK，而哪個是預設值？](#supported-algorithms-faq)
+ [初始化向量 (IV) 如何產生？存放在哪裡？](#iv-generation)
+ [每個資料金鑰如何產生、加密及解密？](#key-generation)
+ [如何追蹤用來加密資料的資料金鑰？](#track-keys)
+ [AWS Encryption SDK 儲存加密資料金鑰及其加密資料的方式為何？](#store-encrypted-keys)
+ [AWS Encryption SDK 訊息格式會為我的加密資料增加多少額外負荷？](#overhead)
+ [我是否可以使用自己的主金鑰提供者？](#own-provider)
+ [我可以在多個包裝金鑰下加密資料嗎？](#multiple-master-keys)
+ [我可以使用 加密哪些資料類型 AWS Encryption SDK？](#data-types)
+ [如何 AWS Encryption SDK 加密和解密輸入/輸出 (I/O) 串流？](#streams)

## 與 AWS SDKs有何 AWS Encryption SDK 不同？
<a name="aws-sdks"></a>

[AWS SDKs](https://aws.amazon.com/tools/)提供與 Amazon Web Services (AWS) 互動的程式庫，包括 AWS Key Management Service ()AWS KMS。的某些語言實作 AWS Encryption SDK，例如[AWS Encryption SDK 適用於 .NET ](dot-net.md#dot-net-install)的 ，一律需要相同程式設計語言的 AWS SDK。只有當您在 AWS KMS keyring 或主金鑰提供者中使用金鑰時，其他語言實作才需要對應的 AWS SDK。如需詳細資訊，請參閱 中有關程式設計語言的主題[AWS Encryption SDK 程式設計語言](programming-languages.md)。

您可以使用 AWS SDKs與 互動 AWS KMS，包括加密和解密少量資料 （使用對稱加密金鑰最多 4，096 個位元組），以及為用戶端加密產生資料金鑰。不過，當您產生資料金鑰時，您必須管理整個加密和解密程序、使用外部的資料金鑰來加密資料 AWS KMS、安全地捨棄純文字資料金鑰、儲存加密的資料金鑰，然後解密資料金鑰並解密資料。會為您 AWS Encryption SDK 處理此程序。

 AWS Encryption SDK 提供程式庫，可使用業界標準和最佳實務來加密和解密資料。它會產生資料金鑰、在您指定的包裝金鑰下加密資料金鑰，並傳回*加密的訊息*、包含加密資料和解密資料金鑰的可攜式資料物件。解密時，您會傳入加密的訊息和至少一個包裝金鑰 （選用），而 AWS Encryption SDK 會傳回您的純文字資料。

您可以使用 AWS KMS keys 做為 中的包裝金鑰 AWS Encryption SDK，但並非必要。您可以使用您產生的加密金鑰，以及來自金鑰管理器或內部部署硬體安全模組的加密金鑰。 AWS Encryption SDK 即使您沒有 AWS 帳戶，也可以使用 。

## 與 Amazon S3 加密用戶端有何 AWS Encryption SDK 不同？
<a name="s3-encryption-client"></a>

 AWS SDKs 中的 [Amazon S3 加密用戶端](https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingClientSideEncryption.html)為您存放在 Amazon Simple Storage Service (Amazon S3) 中的資料提供加密和解密。這些用戶端與 Amazon S3 緊密結合，且僅適用於存放在該處的資料。

為您可以存放在任何地方的資料 AWS Encryption SDK 提供加密和解密。 AWS Encryption SDK 和 Amazon S3 加密用戶端不相容，因為它們會產生不同資料格式的加密文字。

## 支援哪些密碼編譯演算法 AWS Encryption SDK，而哪個是預設值？
<a name="supported-algorithms-faq"></a>

 AWS Encryption SDK 使用稱為 AES-GCM 的 Galois/計數器模式 (GCM) 中的進階加密標準 (AES) 對稱演算法來加密您的資料。它可讓您從數個對稱和非對稱演算法中選擇，以加密加密資料的資料金鑰。

對於 AES-GCM，預設演算法套件是具有 256 位元金鑰、金鑰衍生 (HKDF)、[數位簽章](concepts.md#digital-sigs)和[金鑰承諾](concepts.md#key-commitment)的 AES-GCM。 AWS Encryption SDK 也支援 192 位元和 128 位元加密金鑰，以及沒有數位簽章和金鑰承諾的加密演算法。

在所有情況下，初始化向量 (IV) 的長度一律為 12 個位元組；身分驗證標籤的長度一律為 16 個位元組。根據預設，開發套件使用資料金鑰做為輸入到 HMAC 式擷取和擴展金鑰衍生函數 (HKDF)，來衍生 AES-GCM 加密金鑰，也可以新增 Elliptic Curve 數位簽章演算法 (ECDSA) 簽章。

如需選擇使用哪個演算法的相關資訊，請參閱[支援的演算法套件](supported-algorithms.md)。

如需受支援演算法的詳細資訊，請參閱[演算法參考](algorithms-reference.md)。

## 初始化向量 (IV) 如何產生？存放在哪裡？
<a name="iv-generation"></a>

 AWS Encryption SDK 使用決定性方法來建構每個影格的不同 IV 值。此程序保證絕不會在訊息中重複 IVs。（在 適用於 JAVA 的 AWS Encryption SDK 和 1.3.0 版之前 適用於 Python 的 AWS Encryption SDK， AWS Encryption SDK 會隨機為每個影格產生唯一的 IV 值。)

IV 會存放在 AWS Encryption SDK 傳回的加密訊息中。如需更多資訊，請參閱[AWS Encryption SDK 訊息格式參考](message-format.md)。

## 每個資料金鑰如何產生、加密及解密？
<a name="key-generation"></a>

方法取決於您使用的 keyring 或主金鑰提供者。

中的 AWS KMS keyring 和主金鑰提供者 AWS Encryption SDK 會使用 AWS KMS [GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) API 操作來產生每個資料金鑰，並在其包裝金鑰下加密。若要在其他 KMS 金鑰下加密資料金鑰的副本，它們會使用 AWS KMS [加密](https://docs.aws.amazon.com/kms/latest/APIReference/API_Encrypt.html)操作。若要解密資料金鑰，它們會使用 AWS KMS [Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) 操作。如需詳細資訊，請參閱 GitHub AWS Encryption SDK 中規格中的 [AWS KMS keyring](https://github.com/awslabs/aws-encryption-sdk-specification/blob/master/framework/aws-kms/aws-kms-keyring.md)。

其他 keyring 會使用每種程式設計語言的最佳實務方法來產生資料金鑰、加密和解密。如需詳細資訊，請參閱 GitHub 中規格的[架構區段](https://github.com/awslabs/aws-encryption-sdk-specification/tree/master/framework)中 keyring AWS Encryption SDK 或主金鑰提供者的規格。

## 如何追蹤用來加密資料的資料金鑰？
<a name="track-keys"></a>

會為您 AWS Encryption SDK 執行此操作。當您加密資料時，軟體開發套件會加密資料金鑰並將加密的金鑰與加密的資料一起存放在它傳回的[已加密訊息](concepts.md#message)中。當您解密資料時， AWS Encryption SDK 會從加密的訊息中擷取加密的資料金鑰、將其解密，然後使用它來解密資料。

## AWS Encryption SDK 儲存加密資料金鑰及其加密資料的方式為何？
<a name="store-encrypted-keys"></a>

中的加密操作會 AWS Encryption SDK 傳回[加密的訊息](concepts.md#message)，這是包含加密資料及其加密資料金鑰的單一資料結構。訊息格式包含兩個部分：*標題*與*本文*。訊息標題會包含加密的資料金鑰，以及說明訊息標題組成方式的資訊。訊息內文包含加密的資料。如果演算法套件包含[數位簽章](concepts.md#digital-sigs)，訊息格式會包含包含簽章的*頁尾*。如需詳細資訊，請參閱[AWS Encryption SDK 訊息格式參考](message-format.md)。

## AWS Encryption SDK 訊息格式會為我的加密資料增加多少額外負荷？
<a name="overhead"></a>

增加的額外負荷取決於 AWS Encryption SDK 幾個因素，包括下列項目：
+ 純文字資料的大小
+ 所使用的支援演算法
+ 是否提供額外的驗證資料 (AAD)，以及該 AAD 的長度
+ 包裝金鑰或主金鑰的數量和類型
+ 框架大小 (使用[具框架資料](message-format.md#body-framing)時)

當您使用 AWS Encryption SDK 搭配其預設組態 （一個 AWS KMS key 做為包裝金鑰 （或主金鑰）、沒有 AAD、非影格資料，以及具有簽署的加密演算法） 時，額外負荷約為 600 個位元組。一般而言，您可以合理假設 AWS Encryption SDK 增加 1 KB 或更少的負擔，不包含提供的 AAD。如需詳細資訊，請參閱[AWS Encryption SDK 訊息格式參考](message-format.md)。

## 我是否可以使用自己的主金鑰提供者？
<a name="own-provider"></a>

是。實作詳細資訊會根據您使用的[支援程式設計語言](programming-languages.md)而有所不同。不過，所有支援的語言都可讓您定義自訂[密碼編譯資料管理員 (CMMs)M)](concepts.md#crypt-materials-manager)、主金鑰提供者、 keyring、主金鑰和包裝金鑰。

## 我可以在多個包裝金鑰下加密資料嗎？
<a name="multiple-master-keys"></a>

是。您可以使用其他包裝金鑰 （或主金鑰） 加密資料金鑰，以便在金鑰位於不同區域或無法解密時新增備援。

若要在多個包裝金鑰下加密資料，請使用多個包裝金鑰建立 keyring 或主金鑰提供者。使用 keyring 時，您可以建立[具有多個包裝金鑰的單一 keyring](use-kms-keyring.md#kms-keyring-encrypt) 或[多個 keyring](use-multi-keyring.md)。

當您使用多個包裝金鑰加密資料時， AWS Encryption SDK 會使用一個包裝金鑰來產生純文字資料金鑰。資料金鑰是唯一的，在數學上與包裝金鑰無關。操作會傳回純文字資料金鑰和包裝金鑰加密的資料金鑰複本。然後， 加密方法會使用其他包裝金鑰來加密資料金鑰。產生的[加密訊息](concepts.md#message)包含加密的資料，以及每個包裝金鑰的一個加密資料金鑰。

您可以使用加密操作中使用的任一包裝金鑰來解密加密的訊息。 AWS Encryption SDK 使用包裝金鑰來解密加密的資料金鑰。然後，它會使用純文字資料金鑰來解密資料。

## 我可以使用 加密哪些資料類型 AWS Encryption SDK？
<a name="data-types"></a>

的大多數程式設計語言實作 AWS Encryption SDK 都可以加密原始位元組 （位元組陣列）、I/O 串流 （位元組串流） 和字串。 AWS Encryption SDK for .NET 不支援 I/O 串流。我們提供每個[受支援程式設計語言](programming-languages.md)的範例程式碼。

## 如何 AWS Encryption SDK 加密和解密輸入/輸出 (I/O) 串流？
<a name="streams"></a>

 AWS Encryption SDK 會建立加密或解密串流，以包裝基礎 I/O 串流。加密或解密串流會在讀取或寫入呼叫上執行密碼編譯操作。例如，它可以讀取基礎串流上的純文字資料，並將其加密再傳回結果。或者，它可以讀取基礎串流的加密文字，並將其解密再傳回結果。我們提供範例程式碼，用於加密和解密每個支援串流的[支援程式設計語言](programming-languages.md)的串流。

 AWS Encryption SDK for .NET 不支援 I/O 串流。