

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

# 的最佳實務 AWS Encryption SDK
<a name="best-practices"></a>

 AWS Encryption SDK 旨在讓您使用產業標準和最佳實務輕鬆保護資料。雖然在預設值中為您選取了許多最佳實務，但有些實務是選用的，但建議在可行時執行。

**使用最新版本**  
當您開始使用 時 AWS Encryption SDK，請使用您偏好的[程式設計語言](programming-languages.md)提供的最新版本。如果您一直使用 AWS Encryption SDK，請盡快升級至每個最新版本。這可確保您使用建議的組態，並利用新的安全屬性來保護您的資料。如需支援版本的詳細資訊，包括遷移和部署的指引，請參閱 [支援和維護](introduction.md#support)和 [的版本 AWS Encryption SDK](about-versions.md)。  
如果新版本取代程式碼中的元素，請盡快取代它們。棄用警告和程式碼註解通常會建議理想的替代方案。  
為了讓重大升級更容易且較不容易出錯，我們偶爾會提供暫時或過渡版本。使用這些版本及其隨附的文件，以確保您可以升級應用程式，而不會中斷您的生產工作流程。

**使用預設值**  
將最佳實務 AWS Encryption SDK 設計為其預設值。盡可能使用它們。對於預設值不切實際的情況，我們會提供替代方案，例如無需簽署的演算法套件。我們也為進階使用者提供自訂的機會，例如自訂 keyring、主金鑰提供者和密碼編譯資料管理員 CMMs)。請謹慎使用這些進階替代方案，並盡可能讓安全工程師驗證您的選擇。

**使用加密內容**  
為了提高密碼編譯操作的安全性，請在加密資料的所有請求中包含具有有意義的值的加密[內容](concepts.md#encryption-context)。使用加密內容是選用的，但卻是建議的密碼編譯最佳實務。加密內容為 中的已驗證加密提供額外的已驗證資料 (AAD) AWS Encryption SDK。雖然它不是秘密，但加密內容可協助您[保護加密資料的完整性和真實性](https://aws.amazon.com/blogs/security/how-to-protect-the-integrity-of-your-encrypted-data-by-using-aws-key-management-service-and-encryptioncontext/)。  
在 中 AWS Encryption SDK，您只能在加密時指定加密內容。解密時， AWS Encryption SDK 會使用 AWS Encryption SDK 傳回之加密訊息標頭中的加密內容。在應用程式傳回純文字資料之前，請確認您用來加密訊息的加密內容包含在用來解密訊息的加密內容中。如需詳細資訊，請參閱程式設計語言中的範例。  
當您使用命令列界面時， AWS Encryption SDK 會為您驗證加密內容。

**保護您的包裝金鑰**  
 AWS Encryption SDK 會產生唯一的資料金鑰來加密每個純文字訊息。然後，它會使用您提供的包裝金鑰來加密資料金鑰。如果您的包裝金鑰遺失或遭到刪除，您的加密資料將無法復原。如果您的金鑰未受保護，您的資料可能會容易受到攻擊。  
使用受到安全金鑰基礎設施保護的包裝金鑰，例如 [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/)(AWS KMS)。使用原始 AES 或原始 RSA 金鑰時，請使用符合您安全需求的隨機和耐用儲存來源。在硬體安全模組 (HSM) 或提供 HSMs的服務中產生和儲存包裝金鑰 AWS CloudHSM是最佳實務。  
使用金鑰基礎設施的授權機制，將對包裝金鑰的存取限制為僅需要它的使用者。實作最佳實務原則，例如最低權限。使用 時 AWS KMS keys，請使用實作[最佳實務原則](https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html#iam-policies-best-practices)的金鑰政策和 IAM 政策。

**指定您的包裝金鑰**  <a name="strict-discovery-mode"></a>
最佳實務是在解密和加密時明確[指定您的包裝金鑰](configure.md#config-keys)。當您這麼做時， 只會 AWS Encryption SDK 使用您指定的金鑰。此實務可確保您只使用您想要的加密金鑰。對於 AWS KMS 包裝金鑰，它還透過防止您不小心在不同 AWS 帳戶 或 區域中使用金鑰，或嘗試使用您沒有使用許可的金鑰解密來改善效能。  
加密時， AWS Encryption SDK 供應項目所需的 keyring 和主金鑰提供者會要求您指定包裝金鑰。它們只會使用您指定的包裝金鑰。使用原始 AES keyring、原始 RSA keyring 和 JCEMasterKeys 加密和解密時，您也需要指定包裝金鑰。  
不過，使用 AWS KMS keyring 和主金鑰提供者解密時，您不需要指定包裝金鑰。 AWS Encryption SDK 可以從加密資料金鑰的中繼資料取得金鑰識別符。但是，指定包裝金鑰是我們建議的最佳實務。  
若要在使用 AWS KMS 包裝金鑰時支援此最佳實務，我們建議下列事項：  
+ 使用指定包裝 AWS KMS 金鑰的 keyring。加密和解密時，這些 keyring 只會使用您指定的包裝金鑰。
+ 使用 AWS KMS 主金鑰和主金鑰提供者時，請使用 [1.7.*x* 版中引入](about-versions.md#version-1.7)的嚴格模式建構函數。 AWS Encryption SDK他們建立的提供者只會使用您指定的包裝金鑰來加密和解密。在 1.7.*x* 版中，一律以任何包裝金鑰解密的主金鑰提供者建構函式已棄用，並在 2.0.*x* 版中刪除。
當指定用於解密的 AWS KMS 包裝金鑰不切實際時，您可以使用探索提供者。C 和 JavaScript AWS Encryption SDK 中的 支援[AWS KMS 探索 keyring](use-kms-keyring.md#kms-keyring-discovery)。具有探索模式的主金鑰提供者適用於 1.7.*x* 版和更新版本的 Java 和 Python。這些探索提供者僅用於使用 AWS KMS 包裝金鑰進行解密，明確指示 AWS Encryption SDK 使用任何加密資料金鑰的包裝金鑰。  
如果您必須使用探索提供者，請使用其*探索篩選條件*功能來限制其使用的包裝金鑰。例如，[AWS KMS 區域探索 keyring](use-kms-keyring.md#kms-keyring-regional) 只使用特定中的包裝金鑰 AWS 區域。您也可以將 AWS KMS keyring 和 AWS KMS [master 金鑰提供者](migrate-mkps-v2.md#migrate-mkp-discovery-mode)設定為僅使用特定 的[包裝金鑰](migrate-keyrings-v2.md) AWS 帳戶。此外，一如往常一樣，使用金鑰政策和 IAM 政策來控制 AWS KMS 對包裝金鑰的存取。

**使用數位簽章**  
最佳實務是使用演算法套件進行簽署。[數位簽章](concepts.md#digital-sigs)會驗證訊息寄件者已獲授權傳送訊息，並保護訊息的完整性。根據預設， 的所有版本 AWS Encryption SDK 都會使用演算法套件搭配簽署。  
如果您的安全需求不包含數位簽章，您可以選擇沒有數位簽章的演算法套件。不過，我們建議您使用數位簽章，尤其是當一組使用者加密資料，另一組使用者解密該資料時。

**使用金鑰承諾**  
最佳實務是使用金鑰承諾安全功能。透過驗證加密資料的唯一[資料金鑰](concepts.md#DEK)的身分，[金鑰承諾](concepts.md#key-commitment)可防止您解密任何可能導致多個純文字訊息的加密文字。  
 AWS Encryption SDK 提供從 [2.0.*x* 版](about-versions.md#version-2)開始的金鑰承諾加密和解密的完整支援。根據預設，您的所有訊息都會使用金鑰承諾進行加密和解密。[1.7.*x* 版](about-versions.md#version-1.7) AWS Encryption SDK 可以透過金鑰承諾解密加密文字。它旨在協助較早版本的使用者成功部署 2.0.*x* 版。  
對金鑰承諾的支援包括[新的演算法套件](supported-algorithms.md)和[新的訊息格式](message-format.md)，該格式只會產生比加密文字大 30 個位元組的加密文字，無需金鑰承諾。設計可將對效能的影響降至最低，讓大多數使用者都能享受金鑰承諾的優勢。如果您的應用程式對大小和效能非常敏感，您可以決定使用[承諾政策](concepts.md#commitment-policy)設定來停用金鑰承諾，或允許 在沒有承諾的情況下 AWS Encryption SDK 解密訊息，但前提是您必須這樣做。

**限制加密資料金鑰的數量**  
最佳實務是[限制您解密的訊息中加密資料金鑰的數量](configure.md#config-limit-keys)，尤其是來自不受信任來源的訊息。使用許多您無法解密的加密資料金鑰來解密訊息，可能會導致延長延遲、執行費用、調節您的應用程式和其他共用您帳戶的人，並可能耗盡您的金鑰基礎設施。如果沒有限制，加密的訊息最多可以有 65，535 個 (2^16 - 1) 加密的資料金鑰。如需詳細資訊，請參閱[限制加密的資料金鑰](configure.md#config-limit-keys)。

如需這些最佳實務下 AWS Encryption SDK 的安全功能詳細資訊，請參閱 *AWS 安全部落格*中的[改善用戶端加密：明確 KeyIds 和金鑰承諾](https://aws.amazon.com/blogs/security/improved-client-side-encryption-explicit-keyids-and-key-commitment/)。