本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
資料金鑰快取詳細資訊
大多數應用程式可以使用預設的資料金鑰快取實作,無須撰寫自訂程式碼。本節說明預設實作和一些選項詳細資訊。
資料金鑰快取的運作方式
當您在請求中使用資料金鑰快取來加密或解密資料時,AWS Encryption SDK 會先搜尋快取中是否有符合請求的資料金鑰。如果找到有效的相符項目,則使用快取的資料金鑰來加密資料。否則,它會產生一個新的資料金鑰,就像沒有快取一樣。
資料金鑰快取不會用於不明大小的資料,例如串流資料。這使得快取 CMM 能夠正確地強制執行最大字節閾值。若要避免這種行為,請將訊息大小新增至加密請求。
除了快取,資料金鑰快取也會使用快取密碼編譯資料管理員(緩存 CMM)。緩存 CMM 是一個專門的密碼編譯資料管理員 (CMM),它與高速緩存和底層釐米。(當您指定主金鑰提供者或密鑰環,AWS Encryption SDK會為您創建默認 CMM。) 快取 CMM 會快取其基礎 CMM 傳回的資料金鑰。快取 CMM 也會強制執行您設定的快取安全性閾值。
為避免從快取選取錯誤的資料金鑰,所有相容的快取 CMM 都要求快取的密碼編譯資料的下列屬性符合資料請求。
以下工作流程示範在有和沒有資料金鑰快取的情形下,請求如何處理加密資料。這些範例顯示您建立的快取元件,包括快取和快取 CMM,如何用於處理中。
加密資料,不使用快取
若要取得加密資料,但不透過快取:
-
應用程式要求 AWS Encryption SDK加密資料。
請求會指定主金鑰提供者或 keyring。所以此AWS Encryption SDK會建立與主金鑰提供者或 keyring 互動的默認 CMM。
-
所以此AWS Encryption SDK向 CMM 要求加密資料 (取得密碼編譯資料)。
-
CMM 要求其Keyring(C 和JavaScript)或主金鑰提供者(Java 和 Python) 來取得密碼編譯資料。這可能牽涉到呼叫密碼編譯服務,例如 AWS Key Management Service (AWS KMS)。CMM 會將加密資料傳回給AWS Encryption SDK。
-
AWS Encryption SDK 使用純文字資料金鑰來加密資料。它將加密的資料和加密的資料金鑰存放它傳回給使用者的已加密訊息中。
加密資料,使用快取
若要透過資料金鑰快取來取得加密資料:
-
應用程式要求 AWS Encryption SDK加密資料。
請求會指定快取密碼編譯資料管理員 (快取 CMM)與基礎密碼編譯資料管理員 (CMM) 相關聯。指定主金鑰提供者或 keyring 時,AWS Encryption SDK會為您創建默認 CMM。
-
開發套件向指定的快取 CMM 要求密碼編譯資料。
-
快取 CMM 從快取中要求取得加密資料。
-
如果快取找到相符項目,它會更新存留期並使用相符快取項目的值,傳回快取的加密資料傳回給快取 CMM。
如果緩存條目符合其安全性閾值,快取 CMM 會將其傳回給開發套件。否則,它會通知快取移出項目,並依沒有相符項目的情形繼續進行。
-
如果快取找不到有效的相符項目,快取 CMM 會要求其基礎 CMM 產生新的資料金鑰。
基礎 CMM 從其 keyring 取得密碼編譯資料 (C 和JavaScript) 或主金鑰提供者 (Java 和 Python)。這可能牽涉到呼叫服務,例如 AWS Key Management Service。基礎 CMM 傳回資料金鑰的純文字和加密副本給快取 CMM。
快取 CMM 會將新的加密資料儲存在快取中。
-
-
快取 CMM 會將加密資料傳回給AWS Encryption SDK。
-
AWS Encryption SDK 使用純文字資料金鑰來加密資料。它將加密的資料和加密的資料金鑰存放它傳回給使用者的已加密訊息中。
建立密碼編譯資料快取
AWS Encryption SDK定義用於資料金鑰快取之密碼編譯資料快取的需求。它還提供本機快取,這是一個可配置的、內存中的最久未使用的項目 (LRU) 快取LocalCryptoMaterialsCache
構造函數,getLocalCryptographicMaterialsCache函數JavaScript,或aws_cryptosdk_materials_cache_local_new
C 中的構造函數
本地快取包含基本快取管理的邏輯,包括新增、移出和比對快取項目,以及維護快取。您不需要撰寫任何自訂快取管理邏輯。您可以依原狀使用本機快取、對其進行自訂,或取代任何相容的快取。
創建本地緩存時,將其容量,也就是快取可以保留的最大項目數。此設定可協助您以有限的資料金鑰重複使用來設計有效快取。
所以此適用於 JAVA 的 AWS Encryption SDK與適用於 Python 的 AWS Encryption SDK還提供了空密碼編譯資料快取(NullCryptoMaterialsCache。NullCryptoMaterialsCache 會為所有 GET
操作傳回錯過,而且不會回應 PUT
操作。您可以在測試中使用 NullCryptoMaterialsCache 或暫時停用包含快取程式碼之應用程式中的快取。
在 中AWS Encryption SDK,每個密碼編譯資料快取都與快取密碼編譯資料管理員(緩存 CMM)。快取 CMM 從快取取取得資料金鑰、將資料金鑰放入快取中,並強制執行安全性閾值你設置的。建立快取 CMM 時,您指定它使用的快取以及用於產生其快取之資料金鑰的基礎 CMM 或主金鑰提供者。
建立快取密碼編譯資料管理員
若要啟用資料金鑰快取,請建立高速緩存和一個快取密碼編譯資料管理員(緩存 CMM)。接著,在您的加密或解密資料請求中,指定快取 CMM,而不是標準的密碼編譯資料管理員 (CMM), 或主金鑰提供者或者Keyring。
有兩種類型的 CMM。兩者都會取得資料金鑰 (以及相關密碼編譯資料),但使用的方法不同,如下所示:
-
CMM 與 keyring (C 或JavaScript) 或主金鑰提供者 (Java 和 Python)。當此開發套件向 CMM 要求取得加密或解密資料時,CMM 會從其 keyring 或主金鑰提供者取得資料。在 Java 和 Python 中,CMM 使用主金鑰來產生、加密或解密資料金鑰。在 C 和 JavaScript 中,keyring 會產生、加密並傳回密碼編譯資料。
-
快取 CMM 與一個快取相關聯,例如本機快取,以及一個基礎 CMM。當開發套件向快取 CMM 要求密碼編譯資料,快取 CMM 會嘗試從快取中取得資料。如果找不到相符項目,快取 CMM 向其基礎 CMM 要求資料。接著,它在將新的密碼編譯資料傳回給發起人之前會快取資料。
緩存 CMM 還強制執行安全性閾值設定的。由於安全性閾值在快取 CMM 中設定並由快取 CMM 強制執行,因此您可以使用任何相容的快取,即使快取不是為敏感材料而設計。
資料金鑰快取項目中有什麼項目?
資料金鑰快取會在快取中存放資料金鑰和相關密碼編譯資料。每個項目都包含下面列出的元素。當您要決定是否使用資料金鑰快取功能,以及要在快取加密資料管理器(快取 CMM)上設定安全性閾值時,這些資訊可能會很有用。
加密請求的快取項目
由於加密操作而加入資料金鑰快取的項目包含下列元素:
解密請求的快取項目
由於解密操作而加入資料金鑰快取的項目包含下列元素:
-
純文字資料金鑰
-
簽章驗證金鑰 (如果使用)
-
用於強制執行安全性閾值的中繼資料,包括用量計數器
加密內容:如何選擇快取項目
您可以在加密資料的請求中指定加密內容。不過,加密內容在資料金鑰快取中扮演特殊角色。它可讓您在快取中建立資料金鑰子組,即使資料金鑰來自相同的快取 CMM。
加密內容是一組金鑰/值對,其中包含任意非私密資料。在加密期間,加密內容會以密碼演算法繫結至加密的資料,因此在解密資料時需要相同的加密內容。在 AWS Encryption SDK 中,加密內容與加密的資料和資料金鑰一起存放在已加密訊息中。
使用資料金鑰快取時,您也可以使用快取內容來為您的加密操作選擇特定的快取資料金鑰。加密內容會與會資料金鑰一起儲存在快取項目中 (屬於快取項目 ID 的一部分)。快取的資料金鑰只在其加密內容符合時才會重複使用。如果您想對加密請求重複使用特定的資料金鑰,請指定相同的加密內容。如果您想避免使用這些資料金鑰,請指定不同的加密內容。
加密內容一律是選用的,但建議使用。如果您不在請求中指定加密內容,則會在快取項目識別符中加入空的加密內容,並符合每個請求。
我的應用程式是否使用快取的資料金鑰?
資料金鑰快取是對某些應用程式和工作負載非常有效的最佳化策略。不過,因為它需要一些風險,請務必判斷它對您的情況如何有效,然後決定優點是否大於風險。
因為資料金鑰快取會重複使用資料金鑰,最明顯的效果就是減少產生新資料金鑰的呼叫次數。實作資料金鑰快取時,AWS Encryption SDK 只會呼叫 AWS KMSGenerateDataKey
操作來建立初始資料金鑰,以及快取遺漏時。但是,快取只有在會產生多個具有相同特性 (包括相同加密內容和演算法套件) 的資料金鑰應用程式中,才能明顯地改善效能。
若要判斷您的 AWS Encryption SDK 實作是否實際上使用來自快取的資料金鑰,請嘗試下列技術。
-
在主金鑰基礎結構的記錄中,檢查建立新資料金鑰的呼叫頻率。當資料金鑰快取有效時,建立新金鑰的呼叫次數應該會明顯下降。例如,如果您使用AWS KMS主密鑰提供程序或密鑰環,搜索CloudTrail的 日誌GenerateData金鑰呼叫。
-
比較加密的訊息認為AWS Encryption SDK返回以響應不同的加密請求。例如,如果您使用適用於 JAVA 的 AWS Encryption SDK,比較ParsedCiphertext
對象來自不同的加密調用。在 中適用於 JavaScript 的 AWS Encryption SDK中,比較 encryptedDataKeys
屬性MessageHeader。重複使用資料金鑰時,加密訊息中的加密資料金鑰是相同的。