

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

# 資料金鑰快取詳細資訊
<a name="data-caching-details"></a>

大多數應用程式可以使用預設的資料金鑰快取實作，無須撰寫自訂程式碼。本節說明預設實作和一些選項詳細資訊。

**Topics**
+ [資料金鑰快取的運作方式](#how-caching-works)
+ [建立密碼編譯資料快取](#simplecache)
+ [建立快取密碼編譯資料管理員](#caching-cmm)
+ [資料金鑰快取項目中有什麼項目？](#cache-entries)
+ [加密內容：如何選擇快取項目](#caching-encryption-context)
+ [我的應用程式是否使用快取的資料金鑰？](#caching-effect)

## 資料金鑰快取的運作方式
<a name="how-caching-works"></a>

當您在請求中使用資料金鑰快取來加密或解密資料時， AWS Encryption SDK 會先搜尋快取中是否有符合請求的資料金鑰。如果找到有效的相符項目，則使用快取的資料金鑰來加密資料。否則，它會產生一個新的資料金鑰，就像沒有快取一樣。

資料金鑰快取不會用於不明大小的資料，例如串流資料。這可讓快取 CMM 正確強制執行[最大位元組閾值](thresholds.md)。若要避免這種行為，請將訊息大小新增至加密請求。

除了快取之外，資料金鑰快取使用[快取密碼編譯資料管理員](#caching-cmm) （快取 CMM)。快取 CMM 是專門[的密碼編譯資料管理員 (CMM)](concepts.md#crypt-materials-manager)，可與[快取](#simplecache)和基礎 [CMM](concepts.md#crypt-materials-manager) 互動。（當您指定[主金鑰提供者](concepts.md#master-key-provider)或 keyring 時， AWS Encryption SDK 會為您建立預設 CMM。) 快取 CMM 會快取其基礎 CMM 傳回的資料金鑰。快取 CMM 也會強制執行您設定的快取安全閾值。

為避免從快取選取錯誤的資料金鑰，所有相容的快取 CMM 都要求快取的密碼編譯資料的下列屬性符合資料請求。
+ [演算法套件](concepts.md#crypto-algorithm)
+ [加密內容](#caching-encryption-context) (即使為空)
+ 分割區名稱 （識別快取 CMM 的字串）
+ (僅限解密) 加密的資料金鑰

**注意**  
只有在[演算法套件](concepts.md#crypto-algorithm)使用金鑰衍生函數時， 才會 AWS Encryption SDK 快取資料金鑰。 [https://en.wikipedia.org/wiki/Key_derivation_function](https://en.wikipedia.org/wiki/Key_derivation_function)

以下工作流程示範在有和沒有資料金鑰快取的情形下，請求如何處理加密資料。它們顯示如何在程序中使用您建立的快取元件，包括快取和快取 CMM。

### 加密資料，不使用快取
<a name="workflow-wo-cache"></a>

若要取得加密資料，但不透過快取：

1. 應用程式 AWS Encryption SDK 會要求 加密資料。

   請求會指定主金鑰提供者或 keyring。 AWS Encryption SDK 會建立與您的主金鑰提供者或 keyring 互動的預設 CMM。

1.  AWS Encryption SDK 會向 CMM 要求加密資料 （取得密碼編譯資料）。

1. CMM 會要求其 [keyring](concepts.md#keyring) (C 和 JavaScript) 或[主金鑰提供者](concepts.md#master-key-provider) (Java 和 Python) 提供密碼編譯資料。這可能包括呼叫密碼編譯服務，例如 AWS Key Management Service (AWS KMS)。CMM 會將加密資料傳回至 AWS Encryption SDK。

1.  AWS Encryption SDK 使用純文字資料金鑰來加密資料。它將加密的資料和加密的資料金鑰存放它傳回給使用者的[已加密訊息](concepts.md#message)中。

![\[加密資料，不使用快取\]](http://docs.aws.amazon.com/zh_tw/encryption-sdk/latest/developer-guide/images/encrypt-workflow-no-cache.png)


### 加密資料，使用快取
<a name="workflow-with-cache"></a>

若要透過資料金鑰快取來取得加密資料：

1. 應用程式 AWS Encryption SDK 會要求 加密資料。

   請求會指定[與基礎密碼編譯資料管理員 (CMM) 相關聯的快取密碼編譯資料管理員 （快取](#caching-cmm) CMM)。當您指定主金鑰提供者或 keyring 時， AWS Encryption SDK 會為您建立預設 CMM。

1. SDK 會向指定的快取 CMM 要求加密資料。

1. 快取 CMM 會從快取請求加密資料。

   1. 如果快取找到相符項目，則會更新存留期並使用相符快取項目的值，並將快取的加密資料傳回快取 CMM。

      如果快取項目符合其[安全閾值](thresholds.md)，快取 CMM 會將其傳回 SDK。否則，它會通知快取移出項目，並依沒有相符項目的情形繼續進行。

   1. 如果快取找不到有效的相符項目，快取 CMM 會要求其基礎 CMM 產生新的資料金鑰。

      基礎 CMM 會從其 keyring (C 和 JavaScript) 或主金鑰提供者 (Java 和 Python) 取得密碼編譯資料。這可能牽涉到呼叫服務，例如 AWS Key Management Service。基礎 CMM 會將資料金鑰的純文字和加密複本傳回快取 CMM。

      快取 CMM 會將新的加密資料儲存在快取中。

1. 快取 CMM 會將加密資料傳回 AWS Encryption SDK。

1.  AWS Encryption SDK 使用純文字資料金鑰來加密資料。它將加密的資料和加密的資料金鑰存放它傳回給使用者的[已加密訊息](concepts.md#message)中。

![\[加密資料，使用資料金鑰快取\]](http://docs.aws.amazon.com/zh_tw/encryption-sdk/latest/developer-guide/images/encrypt-workflow-with-cache.png)


## 建立密碼編譯資料快取
<a name="simplecache"></a>

 AWS Encryption SDK 定義用於資料金鑰快取的密碼編譯資料快取需求。它還提供本機快取，這是可設定、記憶體內、[最近最少使用的 (LRU) 快取](https://en.wikipedia.org/wiki/Cache_replacement_policies#Least_Recently_Used_.28LRU.29)。若要建立本機快取的執行個體，請使用 Java `LocalCryptoMaterialsCache` 和 Python 中的建構函數、JavaScript 中的 getLocalCryptographicMaterialsCache 函數，或 C `aws_cryptosdk_materials_cache_local_new` 中的建構函數。

本機快取包含基本快取管理的邏輯，包括新增、移出和比對快取項目，以及維護快取。您不需要撰寫任何自訂快取管理邏輯。您可以正常使用本機快取、自訂快取，或取代任何相容的快取。

建立本機快取時，您可以設定其*容量*，也就是快取可保留的項目數量上限。此設定可協助您以有限的資料金鑰重複使用來設計有效快取。

 適用於 JAVA 的 AWS Encryption SDK 和 適用於 Python 的 AWS Encryption SDK 也提供 *null 密碼編譯資料快取* (NullCryptoMaterialsCache)。NullCryptoMaterialsCache 會傳回所有`GET`操作的遺漏，而不會回應`PUT`操作。您可以使用 NullCryptoMaterialsCache 進行測試，或暫時停用包含快取程式碼之應用程式中的快取。

在 中 AWS Encryption SDK，每個密碼編譯資料快取都與[快取密碼編譯資料管理員](#caching-cmm) （快取 CMM) 相關聯。快取 CMM 會從快取取得資料金鑰、將資料金鑰放入快取，以及強制執行您設定[的安全閾值](thresholds.md)。當您建立快取 CMM 時，您可以指定其使用的快取，以及產生其快取之資料金鑰的基礎 CMM 或主金鑰提供者。

## 建立快取密碼編譯資料管理員
<a name="caching-cmm"></a>

若要啟用資料金鑰快取，您可以建立[快取](#simplecache)和*快取密碼編譯資料管理員* （快取 CMM)。然後，在加密或解密資料的請求中，您可以指定快取 CMM，而不是標準[密碼編譯資料管理器 (CMM)](concepts.md#crypt-materials-manager)，或[主金鑰提供者](concepts.md#master-key-provider)或 [keyring](concepts.md#keyring)。

CMMs有兩種類型。兩者都會取得資料金鑰 (以及相關密碼編譯資料)，但使用的方法不同，如下所示：
+ CMM 與 keyring (C 或 JavaScript) 或主金鑰提供者 (Java 和 Python) 相關聯。當 SDK 向 CMM 要求加密或解密資料時，CMM 會從其 keyring 或主金鑰提供者取得資料。在 Java 和 Python 中，CMM 使用主金鑰來產生、加密或解密資料金鑰。在 C 和 JavaScript 中， keyring 會產生、加密和傳回密碼編譯資料。
+ 快取 CMM 與一個快取相關聯，例如[本機快取](#simplecache)和基礎 CMM。當 SDK 向快取 CMM 要求密碼編譯資料時，快取 CMM 會嘗試從快取取得資料。如果找不到相符項目，快取 CMM 會向其基礎 CMM 要求材料。接著，它在將新的密碼編譯資料傳回給發起人之前會快取資料。

快取 CMM 也會強制執行您為每個快取項目設定[的安全閾值](thresholds.md)。由於安全閾值是在 中設定並由快取 CMM 強制執行，因此即使快取不是針對敏感材料而設計，您也可以使用任何相容的快取。

## 資料金鑰快取項目中有什麼項目？
<a name="cache-entries"></a>

資料金鑰快取會在快取中存放資料金鑰和相關密碼編譯資料。每個項目都包含下面列出的元素。當您決定是否使用資料金鑰快取功能，以及在快取密碼編譯資料管理員 （快取 CMM) 上設定安全閾值時，您可能會發現此資訊很有用。

**加密請求的快取項目**  
由於加密操作而加入資料金鑰快取的項目包含下列元素：
+ 純文字資料金鑰
+ 加密的資料金鑰 (一或多個)
+ [加密內容](#caching-encryption-context) 
+ 訊息簽署金鑰 (如果使用)
+ [演算法套件](concepts.md#crypto-algorithm)
+ 用於強制執行安全性閾值的中繼資料，包括用量計數器

**解密請求的快取項目**  
由於解密操作而加入資料金鑰快取的項目包含下列元素：
+ 純文字資料金鑰
+ 簽章驗證金鑰 (如果使用)
+ 用於強制執行安全性閾值的中繼資料，包括用量計數器

## 加密內容：如何選擇快取項目
<a name="caching-encryption-context"></a>

您可以在加密資料的請求中指定加密內容。不過，加密內容在資料金鑰快取中扮演特殊角色。它可讓您在快取中建立資料金鑰的子群組，即使資料金鑰來自相同的快取 CMM。

[加密內容](concepts.md#encryption-context)是一組金鑰/值對，其中包含任意非私密資料。在加密期間，加密內容會以密碼演算法繫結至加密的資料，因此在解密資料時需要相同的加密內容。在 中 AWS Encryption SDK，加密內容會存放在具有加密資料和資料金鑰的加密[訊息](concepts.md#message)中。

使用資料金鑰快取時，您也可以使用快取內容來為您的加密操作選擇特定的快取資料金鑰。加密內容會與會資料金鑰一起儲存在快取項目中 (屬於快取項目 ID 的一部分)。快取的資料金鑰只在其加密內容符合時才會重複使用。如果您想對加密請求重複使用特定的資料金鑰，請指定相同的加密內容。如果您想避免使用這些資料金鑰，請指定不同的加密內容。

加密內容一律是選用的，但建議使用。如果您不在請求中指定加密內容，則會在快取項目識別符中加入空的加密內容，並符合每個請求。

## 我的應用程式是否使用快取的資料金鑰？
<a name="caching-effect"></a>

資料金鑰快取是對某些應用程式和工作負載非常有效的最佳化策略。不過，因為它需要一些風險，請務必判斷它對您的情況如何有效，然後決定優點是否大於風險。

因為資料金鑰快取會重複使用資料金鑰，最明顯的效果就是減少產生新資料金鑰的呼叫次數。實作資料金鑰快取時， 只會 AWS Encryption SDK 呼叫 AWS KMS `GenerateDataKey`操作來建立初始資料金鑰，以及快取遺漏時。但是，快取只有在會產生多個具有相同特性 (包括相同加密內容和演算法套件) 的資料金鑰應用程式中，才能明顯地改善效能。

若要判斷您的 實作是否 AWS Encryption SDK 實際使用快取中的資料金鑰，請嘗試下列技術。
+ 在主金鑰基礎設施的日誌中，檢查呼叫的頻率，以建立新的資料金鑰。當資料金鑰快取有效時，建立新金鑰的呼叫次數應該會明顯下降。例如，如果您使用 AWS KMS 主金鑰提供者或 keyring，請在 CloudTrail 日誌中搜尋 [GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) 呼叫。
+ 比較 AWS Encryption SDK 傳回以回應不同加密請求的加密[訊息](concepts.md#message)。例如，如果您使用的是 適用於 JAVA 的 AWS Encryption SDK，請比較來自不同加密呼叫的 [ParsedCiphertext](https://aws.github.io/aws-encryption-sdk-java/com/amazonaws/encryptionsdk/ParsedCiphertext.html) 物件。在 中 適用於 JavaScript 的 AWS Encryption SDK，比較 [MessageHeader](https://github.com/aws/aws-encryption-sdk-javascript/blob/master/modules/serialize/src/types.ts#L21) `encryptedDataKeys` 屬性的內容。重複使用資料金鑰時，加密訊息中的加密資料金鑰是相同的。