

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

# 什麼是 AWS 資料庫加密 SDK？
<a name="what-is-database-encryption-sdk"></a>


****  

|  | 
| --- |
| 我們的用戶端加密程式庫已重新命名為 AWS 資料庫加密 SDK。此開發人員指南仍提供有關 [DynamoDB 加密用戶端](legacy-dynamodb-encryption-client.md)的資訊。 | 

 AWS Database Encryption SDK 是一組軟體程式庫，可讓您在資料庫設計中包含用戶端加密。 AWS Database Encryption SDK 提供記錄層級加密解決方案。您可以指定加密的欄位，以及簽章中包含的欄位，以確保資料的真實性。加密傳輸中和靜態的敏感資料有助於確保任何第三方都無法使用您的純文字資料，包括 AWS。 AWS Database Encryption SDK 是根據 Apache 2.0 授權免費提供。

此開發人員指南提供 AWS 資料庫加密 SDK 的概念概觀，包括[其架構的簡介](concepts.md)、[如何保護資料](how-it-works.md)的詳細資訊、它與[伺服器端加密](client-server-side.md)的差異，以及[為您的應用程式選擇關鍵元件](configure.md)以協助您開始使用的指引。

 AWS Database Encryption SDK 支援*具有屬性*層級加密的 Amazon DynamoDB。

 AWS Database Encryption SDK 具有下列優點：

**專為資料庫應用程式而設計**  
您不需要是密碼編譯專家，即可使用 AWS 資料庫加密 SDK。實作包括專為使用現有應用程式而設計的協助程式方法。  
在您建立和設定必要的元件之後，加密用戶端會在您將記錄新增至資料庫時，以透明方式加密和簽署您的記錄，並在擷取它們時加以驗證和解密。

**包含安全加密和簽署**  
 AWS Database Encryption SDK 包含安全實作，使用唯一的資料加密金鑰來加密每個記錄中的欄位值，然後簽署記錄以保護它免受未經授權的變更，例如新增或刪除欄位，或交換加密的值。

**使用來自任何來源的密碼編譯資料**  
 AWS Database Encryption SDK 使用 [keyring ](concepts.md#keyring-concept)來產生、加密和解密唯一資料加密金鑰，以保護您的記錄。Keyring 會決定加密該資料[金鑰的包裝](concepts.md#wrapping-key)金鑰。  
您可以使用來自任何來源的包裝金鑰，包括密碼編譯服務，例如 [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/)(AWS KMS) 或 [AWS CloudHSM](https://docs.aws.amazon.com/cloudhsm/latest/userguide/)。 AWS 資料庫加密 SDK 不需要 AWS 帳戶 或任何 AWS 服務。

**支援密碼編譯資料快取**  
[AWS KMS 階層式 keyring](use-hierarchical-keyring.md) 是一種密碼編譯資料快取解決方案，使用保留在 Amazon DynamoDB 資料表中的 AWS KMS 受保護*分支金鑰*，然後本機快取用於加密和解密操作的分支金鑰資料，以減少 AWS KMS 呼叫次數。它可讓您在對稱加密 KMS 金鑰下保護密碼編譯資料，而無需 AWS KMS 在每次加密或解密記錄時呼叫 。對於需要將呼叫降至最低的應用程式而言， AWS KMS 階層式 keyring 是理想的選擇 AWS KMS。

**可搜尋加密**  
您可以設計資料庫來搜尋加密的記錄，而無需解密整個資料庫。根據您的威脅模型和查詢需求，您可以使用[可搜尋的加密](searchable-encryption.md)，對加密的資料庫執行完全相符的搜尋或更自訂的複雜查詢。

**支援多租戶資料庫結構描述**  
 AWS 資料庫加密 SDK 可讓您使用不同的加密資料隔離每個租用戶，以共用結構描述保護存放在資料庫中的資料。如果您有多個使用者在資料庫中執行加密操作，請使用其中一個 AWS KMS keyring 為每位使用者提供可在其密碼編譯操作中使用的不同金鑰。如需詳細資訊，請參閱[使用多租戶資料庫](configure.md#config-multitenant-databases)。

**支援無縫結構描述更新**  
當您設定 AWS 資料庫加密 SDK 時，您會提供[密碼編譯動作](concepts.md#crypt-actions)，告訴用戶端要加密和簽署哪些欄位、要簽署哪些欄位 （但不加密），以及要忽略哪些欄位。使用 AWS 資料庫加密 SDK 保護您的記錄之後，您仍然可以[變更資料模型](ddb-update-data-model.md)。您可以在單一部署中更新您的密碼編譯動作，例如新增或移除加密的欄位。

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

 AWS Database Encryption SDK 是在 GitHub 上的開放原始碼儲存庫中開發。您可以使用這些儲存庫來檢視程式碼、讀取和提交問題，以及尋找實作特有的資訊。

**適用於 DynamoDB 的 AWS 資料庫加密 SDK**
+ GitHub 上的 [aws-database-encryption-sdk-dynamodb](https://github.com/aws/aws-database-encryption-sdk-dynamodb/) 儲存庫支援 Java、.NET 和 Rust 中適用於 DynamoDB 的 AWS 資料庫加密開發套件最新版本。

  適用於 DynamoDB 的 AWS Database Encryption SDK 是 [Dafny](https://github.com/dafny-lang/dafny/blob/master/README.md) 的產品，這是一種驗證感知語言，您可以在其中撰寫規格、實作它們的程式碼，以及測試它們的證明。結果是一個程式庫，可在確保功能正確性的架構中實作適用於 DynamoDB 的 AWS Database Encryption SDK 的功能。

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

 AWS Database Encryption SDK 使用與 AWS SDK 和工具相同的[維護政策](https://docs.aws.amazon.com/sdkref/latest/guide/maint-policy.html)，包括其版本控制和生命週期階段。根據最佳實務，我們建議您使用 AWS 資料庫加密 SDK 的最新可用版本來執行資料庫實作，並在發行新版本時升級。

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

## 傳送意見回饋
<a name="feedback"></a>

我們誠摯歡迎您提供意見回饋。如果您有問題或意見、問題或報告，請使用以下資源。

如果您在 AWS 資料庫加密 SDK 中發現潛在的安全性漏洞，請[通知 AWS 安全性](https://aws.amazon.com/security/vulnerability-reporting/)。請勿建立公有 GitHub 問題。

若要提供有關此文件的意見回饋，請使用任何頁面上的意見回饋連結。

# AWS 資料庫加密 SDK 概念
<a name="concepts"></a>


****  

|  | 
| --- |
| 我們的用戶端加密程式庫已重新命名為 AWS 資料庫加密 SDK。此開發人員指南仍提供有關 [DynamoDB 加密用戶端](legacy-dynamodb-encryption-client.md)的資訊。 | 

本主題說明 AWS 資料庫加密 SDK 中使用的概念和術語。

若要了解 AWS 資料庫加密 SDK 的元件如何互動，請參閱 [AWS 資料庫加密 SDK 的運作方式](how-it-works.md)。

若要進一步了解 AWS 資料庫加密 SDK，請參閱下列主題。
+ 了解 AWS Database Encryption SDK 如何使用[信封加密](#envelope-encryption)來保護您的資料。
+ 了解信封加密的元素：保護記錄[的資料金鑰](#data-key)，以及保護資料金鑰的[包裝金鑰](#wrapping-key)。
+ 了解決定您使用哪些包裝金鑰[的 keyring](#keyring-concept)。
+ 了解為您的[加密程序新增完整性的加密內容](#encryption-context)。
+ 了解加密方法新增至記錄[的資料描述](#material-description)。
+ 了解[密碼編譯動作](#crypt-actions)，這些動作會告訴 AWS 資料庫加密 SDK 要加密和簽署哪些欄位。

**Topics**
+ [封套加密](#envelope-encryption)
+ [資料金鑰](#data-key)
+ [包裝金鑰](#wrapping-key)
+ [Keyring](#keyring-concept)
+ [密碼編譯動作](#crypt-actions)
+ [資料描述](#material-description)
+ [加密內容](#encryption-context)
+ [密碼編譯資料管理員](#crypt-materials-manager)
+ [對稱和非對稱加密](#symmetric-key-encryption)
+ [金鑰承諾](#key-commitment)
+ [數位簽章](#digital-sigs)

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

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

**保護資料金鑰**  
 AWS Database Encryption SDK 會使用唯一的資料金鑰加密每個欄位。然後，它會在您指定的包裝金鑰下加密每個資料金鑰。它會將加密的資料金鑰存放在[材料描述](#material-description)中。  
若要指定包裝金鑰，請使用 [keyring](#keyring-concept)。  

![\[使用 AWS 資料庫加密 SDK 進行信封加密\]](http://docs.aws.amazon.com/zh_tw/database-encryption-sdk/latest/devguide/images/dbesdk-envelope.png)


**在多個包裝金鑰下加密相同的資料**  
您可以使用多個包裝金鑰來加密資料金鑰。您可能想要為不同的使用者提供不同的包裝金鑰，或將不同類型的金鑰包裝在不同的位置。每個包裝金鑰都會加密相同的資料金鑰。 AWS Database Encryption SDK 會將所有加密的資料金鑰與[材料描述](#material-description)中的加密欄位一起存放。  
若要解密資料，您需要提供至少一個可解密加密資料金鑰的包裝金鑰。

**結合多種演算法的優勢**  
為了加密您的資料，根據預設， AWS 資料庫加密 SDK 會使用具有 AES-GCM 對稱加密的[演算法套件](supported-algorithms.md)、HMAC 型金鑰衍生函數 (HKDF) 和 [ECDSA 簽署](#digital-sigs)。若要加密資料金鑰，您可以指定適合您包裝金鑰的[對稱或非對稱加密演算法](#symmetric-key-encryption)。  
一般而言，相較於非對稱或*公有金鑰加密*，對稱金鑰加密演算法速度較快，產生的加密文字較小。但公有金鑰演算法提供固有的角色區隔。若要結合每個 的優點，您可以使用公有金鑰加密來加密資料金鑰。  
我們建議您盡可能使用其中一個 AWS KMS keyring。當您使用 [AWS KMS keyring](use-kms-keyring.md) 時，您可以選擇透過指定非對稱 RSA AWS KMS key 做為包裝金鑰來結合多個演算法的強度。您也可以使用對稱加密 KMS 金鑰。

## 資料金鑰
<a name="data-key"></a>

*資料金鑰*是 AWS Database Encryption SDK 用來加密[密碼編譯動作](#crypt-actions)`ENCRYPT_AND_SIGN`中標記之記錄中的欄位的加密金鑰。每個資料金鑰是符合密碼編譯金鑰需求的位元組陣列。 AWS Database Encryption SDK 使用唯一的資料金鑰來加密每個屬性。

您不需要指定、產生、實作、延伸、保護或使用資料金鑰。 AWS 資料庫加密 SDK 會在您呼叫加密和解密操作時為您執行。

為了保護您的資料金鑰， AWS 資料庫加密 SDK 會使用一或多個稱為[包裝](#wrapping-key)*金鑰的金鑰加密*金鑰進行加密。在 AWS 資料庫加密 SDK 使用您的純文字資料金鑰加密您的資料之後，它會盡快將其從記憶體中移除。然後將加密的資料金鑰存放在[材料描述](#material-description)中。如需詳細資訊，請參閱[AWS 資料庫加密 SDK 的運作方式](how-it-works.md)。

**提示**  
在 AWS 資料庫加密 SDK 中，我們會將*資料金鑰*與*資料加密金鑰*區分開來。最佳實務是，所有支援的[演算法套件](supported-algorithms.md)都使用[金鑰衍生函數](https://en.wikipedia.org/wiki/Key_derivation_function)。金鑰衍生函數會採用資料金鑰做為輸入，並傳回實際用來加密記錄的資料加密金鑰。因此，我們通常會說資料是在資料金鑰「底下」加密，而不是「由」資料金鑰加密。

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

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

*包裝金鑰*是金鑰加密金鑰， AWS 資料庫加密 SDK 用來加密加密記錄[的資料金鑰](#data-key)。每個資料金鑰都可以在一或多個包裝金鑰下加密。當您設定 [keyring](#keyring-concept) 時，您可以決定使用哪些包裝金鑰來保護您的資料。

![\[使用多個包裝金鑰加密一個資料金鑰\]](http://docs.aws.amazon.com/zh_tw/database-encryption-sdk/latest/devguide/images/dbesdk-wrapping-key.png)


 AWS Database Encryption SDK 支援數個常用的包裝金鑰，例如 [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#master_keys)(AWS KMS) 對稱加密 KMS 金鑰 （包括[多區域 AWS KMS 金鑰](use-kms-keyring.md#config-mrks)) 和非對稱 [RSA KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/asymmetric-key-specs.html#key-spec-rsa)、原始 AES-GCM （進階加密標準/Galois 計數器模式） 金鑰，以及原始 RSA 金鑰。我們建議您盡可能使用 KMS 金鑰。若要決定應使用哪個包裝金鑰，請參閱[選取包裝金鑰](configure.md#config-keys)。

使用信封加密時，您需要保護包裝金鑰免於未經授權的存取。您可以透過下列任何方式執行此操作：
+ 使用專為此目的設計的服務，例如 [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 Database Encryption SDK 與 整合 AWS KMS ，以協助您保護和使用包裝金鑰。

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

若要指定用於加密和解密的包裝金鑰，請使用 keyring。您可以使用 AWS Database Encryption SDK 提供的 keyring 或設計您自己的實作。

*Keying* 會產生、加密和解密資料金鑰。它也會產生用於計算簽章中雜湊型訊息驗證碼 (HMACs MAC 金鑰。當您定義 keyring 時，您可以指定用來加密資料[金鑰的包裝](#wrapping-key)金鑰。大多數 keyring 指定至少一個包裝金鑰或服務，提供和保護包裝金鑰。加密時， AWS 資料庫加密 SDK 會使用 keyring 中指定的所有包裝金鑰來加密資料金鑰。如需選擇和使用 AWS 資料庫加密 SDK 定義的 keyring 的說明，請參閱[使用 keyring。](keyrings.md)

## 密碼編譯動作
<a name="crypt-actions"></a>

*密碼編譯動作*會告知加密程式要對記錄中的每個欄位執行哪些動作。

密碼編譯動作值可以是下列其中一項：
+ **加密和簽署** – 加密 欄位。在簽章中包含加密的欄位。
+ **僅限簽署** – 在簽章中包含 欄位。
+ **在加密內容中簽署並包含** - 在簽章和[加密內容](#encryption-context)中包含 欄位。

  根據預設，分割區和排序索引鍵是加密內容中包含的唯一屬性。您可以考慮定義其他欄位，`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`以便[AWS KMS 階層式 keyring](use-hierarchical-keyring.md) 的分支金鑰 ID 供應商可以識別從加密內容解密所需的分支金鑰。如需詳細資訊，請參閱[分支金鑰 ID 供應商](use-hierarchical-keyring.md#branch-key-id-supplier)。
**注意**  
若要使用`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`密碼編譯動作，您必須使用 3.3 版或更新版本的 AWS 資料庫加密 SDK。將[您的資料模型更新](ddb-update-data-model.md)為包含 之前，將新版本部署至所有讀者`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`。
+ **什麼都不做** – 請勿在簽章中加密或包含 欄位。

對於任何可以存放敏感資料的欄位，請使用**加密和簽署**。對於主索引鍵值 （例如 DynamoDB 資料表中的分割區索引鍵和排序索引鍵），請使用 **Sign only** 或 **Sign and include in encryption context**。如果您指定任何 **Sign 並包含在加密內容屬性中**，則分割區和排序屬性也必須是 **Sign 並包含在加密內容中**。您不需要為[材料描述](#material-description)指定密碼編譯動作。 AWS 資料庫加密 SDK 會自動簽署物料描述存放所在的欄位。

請仔細選擇您的密碼編譯動作。如有疑問，請使用**加密並簽署**。使用 AWS 資料庫加密 SDK 保護您的記錄後，您無法將現有的 `SIGN_ONLY`、 `ENCRYPT_AND_SIGN`或 `SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT` 欄位變更為 `DO_NOTHING`，或變更指派給現有`DO_NOTHING`欄位的密碼編譯動作。不過，您仍然可以[對資料模型進行其他變更](ddb-update-data-model.md)。例如，您可以在單一部署中新增或移除加密的欄位。

## 資料描述
<a name="material-description"></a>

材料描述做為加密記錄的 標頭。當您使用 AWS 資料庫加密 SDK 加密和簽署欄位時，加密程式會在組合密碼編譯資料時記錄資料描述，並將資料描述存放在加密程式新增至記錄的新欄位中 (`aws_dbe_head`)。

材料描述是一種可攜式[格式化資料結構](reference.md#material-description-format)，其中包含資料金鑰的加密副本和其他資訊，例如加密演算法、[加密內容](#encryption-context)，以及加密和簽署指示。加密程式會在組合用於加密和簽署的密碼編譯資料時記錄資料描述。稍後，當它需要組合密碼編譯資料來驗證和解密欄位時，它會使用資料描述作為其指南。

將加密的資料金鑰與加密欄位一起存放可簡化解密操作，讓您不必獨立於加密的資料存放和管理加密的資料金鑰。

如需材料描述的技術資訊，請參閱 [材料描述格式](reference.md#material-description-format)。

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

為了提高密碼編譯操作的安全性， AWS 資料庫加密 SDK 會在所有加密和簽署記錄的請求中包含加密內容。

*加密內容*是一組名稱/值對，其中包含任意非私密的額外驗證資料。 AWS 資料庫加密 SDK 在加密內容中包含資料庫的邏輯名稱和主索引鍵值 （例如 DynamoDB 資料表中的分割區索引鍵和排序索引鍵）。當您加密並簽署欄位時，加密內容會以加密方式繫結至加密記錄，因此解密欄位需要相同的加密內容。

如果您使用 AWS KMS keyring， AWS 資料庫加密 SDK 也會使用加密內容，在 keyring 進行的呼叫中提供額外的已驗證資料 (AAD) AWS KMS。

每當您使用[預設演算法套件](supported-algorithms.md#recommended-algorithms)時，[密碼編譯資料管理員](#crypt-materials-manager) (CMM) 會將名稱值對新增至加密內容，其中包含預留名稱 `aws-crypto-public-key`和代表公有驗證金鑰的值。公有驗證金鑰會存放在[材料描述](#material-description)中。

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

密碼編譯資料管理員 (CMM) 會組合用於加密、解密和簽署資料的密碼編譯資料。每當您使用[預設演算法套件](supported-algorithms.md#recommended-algorithms)時，*密碼編譯資料*包含純文字和加密的資料金鑰、對稱簽署金鑰和非對稱簽署金鑰。您永遠不會直接與 CMM 互動。加密和解密方法會為您代勞。

由於 CMM 充當 AWS 資料庫加密 SDK 與 keyring 之間的聯絡人，因此它是自訂和延伸的理想點，例如支援政策強制執行。您可以明確指定 CMM，但並非必要。當您指定 keyring 時， AWS 資料庫加密 SDK 會為您建立預設 CMM。預設 CMM 會從您指定的 keyring 取得加密或解密資料。這可能牽涉到呼叫密碼編譯服務，例如 [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/) (AWS KMS)。

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

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

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

 AWS Database Encryption SDK 使用[信封加密](#envelope-encryption)。它會使用對稱資料金鑰來加密您的資料。它會使用一或多個對稱或非對稱包裝金鑰來加密對稱資料金鑰。它會將[資料描述](#material-description)新增至記錄，其中包含至少一個資料金鑰的加密副本。

**加密您的資料 （對稱加密）**  
為了加密您的資料， AWS 資料庫加密 SDK 使用對稱[資料金鑰](#data-key)和包含對稱加密演算法的[演算法套件](supported-algorithms.md)。為了解密資料， AWS 資料庫加密 SDK 使用相同的資料金鑰和相同的演算法套件。

**加密您的資料金鑰 （對稱或非對稱加密）**  
您提供給加密和解密操作的 [keyring](#keyring-concept) 會決定對稱資料金鑰的加密和解密方式。您可以選擇使用對稱加密的 keyring，例如具有對稱加密 KMS 金鑰的 AWS KMS keyring，或使用非對稱加密的 keyring，例如 AWS KMS 具有非對稱 RSA KMS 金鑰的 keyring。

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

 AWS Database Encryption SDK 支援*金鑰承諾* （有時稱為*穩健性*)，這是一種安全屬性，可確保每個加密文字只能解密為單一純文字。若要這樣做，金鑰承諾可確保只會使用加密您記錄的資料金鑰來解密它。 AWS Database Encryption SDK 包含所有加密和解密操作的金鑰承諾。

大多數現代對稱密碼 （包括 AES) 在單一私密金鑰下加密純文字，例如 AWS 資料庫加密 SDK 用來加密`ENCRYPT_AND_SIGN`記錄中標記的每個純文字欄位[的唯一資料金鑰](#data-key)。使用相同的資料金鑰解密此記錄會傳回與原始金鑰相同的純文字。使用不同金鑰進行解密通常會失敗。雖然很困難，但在技術上可以在兩個不同的金鑰下解密加密文字。在極少數情況下，找到可以部分解密加密文字的金鑰是可行的，但仍然無法理解的純文字。

 AWS Database Encryption SDK 一律在一個唯一的資料金鑰下加密每個屬性。它可能會在多個包裝金鑰下加密該資料金鑰，但包裝金鑰一律會加密相同的資料金鑰。不過，複雜的手動製作加密記錄實際上可能包含不同的資料金鑰，每個金鑰都由不同的包裝金鑰加密。例如，如果一個使用者解密加密的記錄，則會傳回 0x0 (false)，而另一個解密相同加密記錄的使用者則得到 0x1 (true)。

為了避免這種情況， AWS 資料庫加密 SDK 會在加密和解密時包含金鑰承諾。加密方法以密碼編譯方式將產生加密文字的唯一資料金鑰繫結至*金鑰承諾*，這是雜湊型訊息驗證碼 (HMAC)，使用資料金鑰衍生根據資料描述計算。然後，它會將金鑰承諾存放在[材料描述](#material-description)中。當它使用金鑰承諾解密記錄時， AWS 資料庫加密 SDK 會驗證資料金鑰是否為該加密記錄的唯一金鑰。如果資料金鑰驗證失敗，解密操作會失敗。

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

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

為了避免此問題，[預設演算法套件](supported-algorithms.md#recommended-algorithms)會將橢圓曲線數位簽章演算法 (ECDSA) 簽章新增至加密的記錄。預設演算法套件`ENCRYPT_AND_SIGN`會使用已驗證的加密演算法 AES-GCM 來加密記錄中標記為 的欄位。然後，它會在記錄標記為 `ENCRYPT_AND_SIGN`、 和 的欄位上計算雜湊型訊息驗證碼 (HMACs) `SIGN_ONLY`和非對稱 ECDSA 簽章`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`。解密程序會使用簽章來驗證授權使用者已加密記錄。

使用預設演算法套件時， AWS 資料庫加密 SDK 會為每個加密的記錄產生臨時私有金鑰和公有金鑰對。 AWS Database Encryption SDK 會將公有金鑰存放在[材料描述](#material-description)中，並捨棄私有金鑰。這可確保沒有人可以建立另一個使用公有金鑰驗證的簽章。演算法會將公有金鑰繫結至加密的資料金鑰，做為資料描述中的額外驗證資料，防止只能解密欄位的使用者更改公有金鑰或影響簽章驗證。

 AWS 資料庫加密 SDK 一律包含 HMAC 驗證。ECDSA 數位簽章預設為啟用，但非必要。如果加密資料的使用者和解密資料的使用者同樣受信任，您可以考慮使用不包含數位簽章的演算法套件來改善效能。如需選取替代演算法套件的詳細資訊，請參閱[選擇演算法套件](ddb-java-using.md#config-algorithm)。

**注意**  
如果 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 資料庫加密 SDK 的運作方式
<a name="how-it-works"></a>


****  

|  | 
| --- |
| 我們的用戶端加密程式庫已重新命名為 AWS 資料庫加密 SDK。此開發人員指南仍提供有關 [DynamoDB 加密用戶端](legacy-dynamodb-encryption-client.md)的資訊。 | 

 AWS Database Encryption SDK 提供用戶端加密程式庫，專為保護您存放在資料庫中的資料而設計。程式庫包括您可以擴展或以原狀使用的安全實作。如需定義和使用自訂元件的詳細資訊，請參閱資料庫實作的 GitHub 儲存庫。

本節中的工作流程說明 AWS Database Encryption SDK 如何加密和簽署和解密和驗證資料庫中的資料。這些工作流程使用抽象元素和預設功能描述基本程序。如需 AWS 資料庫加密 SDK 如何搭配資料庫實作運作的詳細資訊，請參閱資料庫的*「加密*」主題。

 AWS Database Encryption SDK 使用[信封加密](concepts.md#envelope-encryption)來保護您的資料。每個記錄都會以唯一的[資料金鑰](concepts.md#data-key)加密。資料金鑰用於為密碼編譯動作`ENCRYPT_AND_SIGN`中標記的每個欄位衍生唯一的*資料加密金鑰*。然後，您指定的包裝金鑰會加密資料金鑰的副本。若要解密加密的記錄， AWS 資料庫加密 SDK 會使用您指定的包裝金鑰來解密至少一個加密的資料金鑰。然後，它可以解密加密文字並傳回純文字項目。

如需 AWS 資料庫加密 SDK 中所用詞彙的詳細資訊，請參閱 [AWS 資料庫加密 SDK 概念](concepts.md)。

## 加密和簽署
<a name="encrypt-and-sign"></a>

資料庫 AWS 加密 SDK 的核心是記錄加密程式，可加密、簽署、驗證和解密資料庫中的記錄。它需要有關您的記錄的資訊，以及有關要加密和簽署哪些欄位的指示。它會從您指定的包裝金鑰中設定的[加密資料管理員取得加密資料](concepts.md#crypt-materials-manager)，以及如何使用這些資料的指示。

下列逐步解說說明 AWS Database Encryption SDK 如何加密和簽署您的資料項目。

1. 密碼編譯資料管理員為 AWS 資料庫加密 SDK 提供唯一的資料加密金鑰：一個純文字[資料金鑰](concepts.md#data-key)、由指定[包裝](concepts.md#wrapping-key)金鑰加密的資料金鑰複本，以及 MAC 金鑰。
**注意**  
您可以在多個包裝金鑰下加密資料金鑰。每個包裝金鑰都會加密個別的資料金鑰複本。 AWS Database Encryption SDK 會將所有加密的資料金鑰存放在[材料描述](concepts.md#material-description)中。 AWS 資料庫加密 SDK 會將新欄位 (`aws_dbe_head`) 新增至存放材料描述的記錄。  
系統會針對每個資料金鑰的加密複本衍生 MAC 金鑰。MAC 金鑰不會存放在材料描述中。反之，解密方法會使用包裝金鑰來再次衍生 MAC 金鑰。

1. 加密方法會加密您指定的[密碼編譯動作](concepts.md#crypt-actions)`ENCRYPT_AND_SIGN`中標記為 的每個欄位。

1. 加密方法`commitKey`會從資料金鑰衍生 ，並使用它來產生[金鑰承諾值](concepts.md#key-commitment)，然後捨棄資料金鑰。

1. 加密方法會將[材料描述](concepts.md#material-description)新增至記錄。材料描述包含加密的資料金鑰，以及有關加密記錄的其他資訊。如需材料描述中包含的資訊完整清單，請參閱[材料描述格式](reference.md#material-description-format)。

1. 加密方法使用**步驟 1 **中傳回的 MAC 金鑰，透過資料描述、[加密內容](concepts.md#encryption-context)和密碼編譯動作`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`中標記為 `ENCRYPT_AND_SIGN`、 `SIGN_ONLY`或 的每個欄位的標準化來計算雜湊型訊息驗證碼 (HMAC) 值。HMAC 值會儲存在加密方法新增至記錄的新欄位 (`aws_dbe_foot`) 中。

1. 加密方法會計算資料描述、加密內容和每個標示為 `ENCRYPT_AND_SIGN`、 或 欄位的正式化的 [ECDSA 簽章](concepts.md#digital-sigs)`SIGN_ONLY`，`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`並將 ECDSA 簽章存放在 `aws_dbe_foot` 欄位中。
**注意**  
ECDSA 簽章預設為啟用，但並非必要。

1. 加密方法會將加密和簽章的記錄存放在您的資料庫中

## 解密並驗證
<a name="decrypt-and-verify"></a>

1. 密碼編譯資料管理員 (CMM) 提供解密方法，其中包含儲存在資料描述中的解密資料，包括純文字[資料金鑰](concepts.md#data-key)和相關聯的 MAC 金鑰。

   1. CMM 會使用指定 keyring 中的[包裝金鑰](concepts.md#wrapping-key)解密加密的資料金鑰，並傳回純文字資料金鑰。

1. 解密方法會比較並驗證材料描述中的金鑰承諾值。

1. 解密方法會驗證簽章欄位中的簽章。

   它會`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`從您定義的[允許未驗證](ddb-java-using.md#allowed-unauth)欄位清單中，識別哪些欄位標示為 `ENCRYPT_AND_SIGN``SIGN_ONLY`、 或 。解密方法使用**步驟 1 **中傳回的 MAC 金鑰來重新計算和比較標示為 `ENCRYPT_AND_SIGN`、 `SIGN_ONLY`或 之欄位的 HMAC 值`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`。然後，它會使用存放在[加密內容](concepts.md#encryption-context)中的公有金鑰來驗證 [ECDSA 簽章](concepts.md#digital-sigs)。

1. 解密方法使用純文字資料金鑰來解密標示為 的每個值`ENCRYPT_AND_SIGN`。 AWS 資料庫加密 SDK 接著會捨棄純文字資料金鑰。

1. 解密方法會傳回純文字記錄。

# AWS 資料庫加密 SDK 中支援的演算法套件
<a name="supported-algorithms"></a>


****  

|  | 
| --- |
| 我們的用戶端加密程式庫已重新命名為 AWS 資料庫加密 SDK。此開發人員指南仍提供有關 [DynamoDB 加密用戶端](legacy-dynamodb-encryption-client.md)的資訊。 | 

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

 AWS Database Encryption SDK 使用演算法套件來加密和簽署資料庫中的欄位。所有支援的演算法套件都使用進階加密標準 (AES) 演算法搭配稱為 AES-GCM 的 Galois/計數器模式 (GCM) 來加密原始資料。 AWS Database Encryption SDK 支援 256 位元加密金鑰。驗證標籤的長度一律是 16 個位元組。


**AWS 資料庫加密 SDK 演算法套件**  

| 演算法 | 加密演算法 | 資料金鑰長度 (以位元為單位) | 金鑰衍生演算法 | 對稱簽章演算法 | 非對稱簽章演算法 | 金鑰承諾 | 
| --- | --- | --- | --- | --- | --- | --- | 
| 預設 | AES-GCM | 256 | HKDF 搭配 SHA-512 | HMAC-SHA-384 | ECDSA，P-384 和 SHA-384 式 | HKDF 搭配 SHA-512 | 
| 不含 ECDSA 數位簽章的 AES-GCM | AES-GCM | 256 | HKDF 搭配 SHA-512 | HMAC-SHA-384 | 無 | HKDF 搭配 SHA-512 | 

**加密演算法**  
使用的加密演算法的名稱和模式。 AWS 資料庫加密 SDK 中的演算法套件使用進階加密標準 (AES) 演算法搭配 Galois/計數器模式 (GCM)。  


**資料金鑰長度**  
位元[的資料金鑰](concepts.md#data-key)長度。 AWS Database Encryption SDK 支援 256 位元資料金鑰。資料金鑰會用作 HMAC extract-and-expand金鑰衍生函數 (HKDF) 的輸入。HKDF 的輸出做為加密演算法中的資料加密金鑰。

**金鑰衍生演算法**  
用於衍生資料加密金鑰的 HMAC 式擷取和擴展金鑰衍生函數 (HKDF)。 AWS 資料庫加密 SDK 使用 [RFC 5869 ](https://tools.ietf.org/html/rfc5869)中定義的 HKDF。  
+ 使用的雜湊函數是 SHA-512
+ 對於擷取步驟：
  + 不使用 salt。根據 RFC， salt 設定為零字串。
  + 輸入金鑰材料是 [keyring](concepts.md#keyring-concept) 的資料金鑰。
+ 對於擴展步驟：
  + 輸入虛擬亂數金鑰是來自擷取步驟的輸出。
  + 金鑰標籤是以大端位元組順序UTF-8-encoded位元組。 `DERIVEKEY`
  + 輸入資訊是演算法 ID 和金鑰標籤 （依該順序） 的串連。
  + 輸出鍵控材料的長度是**資料鍵的長度**。此輸出將當做加密演算法中的資料加密金鑰。

**對稱簽章演算法**  
用於產生對稱簽章的雜湊型訊息驗證碼 (HMAC) 演算法。所有支援的演算法套件都包含 HMAC 驗證。  
 AWS 資料庫加密 SDK 會序列化材料描述和所有標示為 `ENCRYPT_AND_SIGN`、 `SIGN_ONLY`或 的欄位`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`。然後，它會使用 HMAC 搭配密碼編譯雜湊函數演算法 (SHA-384) 來簽署正式化。  
對稱 HMAC 簽章會存放在 AWS 資料庫加密 SDK 新增至記錄的新欄位 (`aws_dbe_foot`) 中。

**非對稱簽章演算法**  
用來產生非對稱數位簽章的簽章演算法。  
 AWS 資料庫加密 SDK 會序列化材料描述和所有標示為 `ENCRYPT_AND_SIGN`、 `SIGN_ONLY`或 的欄位`SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT`。然後，它會使用橢圓曲線數位簽章演算法 (ECDSA) 搭配下列詳細資訊來簽署正式化：  
+ 使用的橢圓曲線是 P-384，如[數位簽章標準 (DSS) (FIPS PUB 186-4)](http://doi.org/10.6028/NIST.FIPS.186-4) 中所定義。
+ 使用的雜湊函數是 SHA-384。
非對稱 ECDSA 簽章會與 `aws_dbe_foot` 欄位中的對稱 HMAC 簽章一起存放。  
預設包含 ECDSA 數位簽章，但並非必要。

**金鑰承諾**  
用於衍生遞交金鑰的 HMAC extract-and-expand金鑰衍生函數 (HKDF)。  
+ 使用的雜湊函數是 SHA-512
+ 對於擷取步驟：
  + 不使用 salt。根據 RFC， salt 設定為零字串。
  + 輸入金鑰材料是 [keyring](concepts.md#keyring-concept) 的資料金鑰。
+ 對於擴展步驟：
  + 輸入虛擬亂數金鑰是來自擷取步驟的輸出。
  + 輸入資訊是以大端位元組順序的`COMMITKEY`字串 UTF-8-encoded位元組。
  + 輸出鍵控材料的長度為 256 位元。此輸出會用作遞交金鑰。
遞交金鑰會計算[記錄承諾](reference.md#format-commitment)，即資料[描述](reference.md#material-description-format)上不同的 256 位元雜湊型訊息驗證碼 (HMAC) 雜湊。如需將金鑰承諾新增至演算法套件的技術說明，請參閱 Cryptology ePrint Archive 中的[金鑰承諾 AEADs](https://eprint.iacr.org/2020/1153)。

## 預設演算法套件
<a name="recommended-algorithms"></a>

根據預設， AWS 資料庫加密 SDK 使用演算法套件搭配 AES-GCM、HMAC extract-and-expand金鑰衍生函數 (HKDF)、HMAC 驗證、ECDSA 數位簽章、金鑰承諾和 256 位元加密金鑰。

預設演算法套件包含 HMAC 驗證 （對稱簽章） 和 [ECDSA 數位簽章](concepts.md#digital-sigs) （非對稱簽章）。這些簽章會存放在 AWS 資料庫加密 SDK 新增至記錄的新欄位 (`aws_dbe_foot`) 中。當授權政策允許一組使用者加密資料，以及允許另一組使用者解密資料時，ECDSA 數位簽章特別有用。

預設演算法套件也會衍生[金鑰承諾](concepts.md#key-commitment) – 將資料金鑰連結至記錄的 HMAC 雜湊。金鑰承諾值是從材料描述和遞交金鑰計算的 HMAC。然後，金鑰承諾值會儲存在材料描述中。金鑰承諾可確保每個加密文字只解密為一個純文字。它們透過驗證用作加密演算法輸入的資料金鑰來執行此操作。加密時，演算法套件會衍生金鑰承諾 HMAC。在解密之前，他們會驗證資料金鑰是否產生相同的金鑰承諾 HMAC。如果沒有，解密呼叫會失敗。

## 不含 ECDSA 數位簽章的 AES-GCM
<a name="other-algorithms"></a>

雖然預設演算法套件可能適用於大多數應用程式，但您可以選擇替代演算法套件。例如，某些信任模型將由沒有 ECDSA 數位簽章的演算法套件滿足。只有在加密資料的使用者和解密資料的使用者同樣受信任時，才使用此套件。

所有 AWS 資料庫加密 SDK 演算法套件都包含 HMAC 驗證 （對稱簽章）。唯一的差別是，沒有 ECDSA 數位簽章的 AES-GCM 演算法套件缺少非對稱簽章，可提供多一層的真偽和不可否認性。

例如，如果您的 keyring、、 `wrappingKeyA``wrappingKeyB`和 中有多個包裝金鑰`wrappingKeyC`，而且您使用 解密記錄`wrappingKeyA`，HMAC 對稱簽章會驗證記錄是否由有權存取 的使用者加密`wrappingKeyA`。如果您使用預設演算法套件，HMACs 會提供與 相同的驗證`wrappingKeyA`，並另外使用 ECDSA 數位簽章，以確保記錄是由具有 加密許可的使用者加密`wrappingKeyA`。

若要選取沒有數位簽章的 AES-GCM 演算法套件，請在加密組態中包含下列程式碼片段。

------
#### [ Java ]

下列程式碼片段指定不含 ECDSA 數位簽章的 AES-GCM 演算法套件。如需詳細資訊，請參閱[DynamoDB AWS 資料庫加密 SDK 中的加密組態](ddb-java-using.md#ddb-config-encrypt)。

```
.algorithmSuiteId(
    DBEAlgorithmSuiteId.ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY_SYMSIG_HMAC_SHA384)
```

------
#### [ C\$1 / .NET ]

下列程式碼片段指定不含 ECDSA 數位簽章的 AES-GCM 演算法套件。如需詳細資訊，請參閱[DynamoDB AWS 資料庫加密 SDK 中的加密組態](ddb-net-using.md#ddb-net-config-encrypt)。

```
AlgorithmSuiteId = DBEAlgorithmSuiteId.ALG_AES_256_GCM_HKDF_SHA512_COMMIT_KEY_SYMSIG_HMAC_SHA384
```

------
#### [ Rust ]

下列程式碼片段指定不含 ECDSA 數位簽章的 AES-GCM 演算法套件。如需詳細資訊，請參閱[DynamoDB AWS 資料庫加密 SDK 中的加密組態](ddb-rust-using.md#ddb-rust-config-encrypt)。

```
.algorithm_suite_id(
    DbeAlgorithmSuiteId::AlgAes256GcmHkdfSha512CommitKeyEcdsaP384SymsigHmacSha384,
)
```

------