本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
AWS 資料庫加密 SDK 概念
我們的用戶端加密程式庫已重新命名為 AWS 資料庫加密 SDK。本開發人員指南仍提供 DynamoDB 加密用戶端的相關資訊。 |
本主題說明資 AWS 料庫加密 SDK 中使用的概念和術語。
若要瞭解 AWS 資料庫加密 SDK 的元件如何互動,請參閱AWS 資料庫加密 SDK 的運作方式。
若要深入了解資 AWS 料庫加密 SDK,請參閱下列主題。
封套加密
加密資料的安全性有一部分取決於保護能夠解密資料的資料金鑰。加密處理金鑰是保護資料金鑰的一種最佳實務。若要這麼做,您需要另一個加密金鑰,稱為金鑰加密金鑰或包裝金鑰。使用包裝金鑰來加密資料金鑰的做法稱為信封加密。
- 保護資料金鑰
-
數據 AWS 庫加密 SDK 使用唯一的數據密鑰對每個字段進行加密。然後它加密您指定的包裝密鑰下的每個數據密鑰。它存儲在材料描述中的加密數據密鑰。
若要指定包裝金鑰,請使用金鑰圈。
- 在多個包裝密鑰下加密相同的數據
-
您可以使用多個包裝金鑰來加密資料金鑰。您可能希望為不同的用戶提供不同的包裝鍵,或者包裝不同類型或不同位置的密鑰。每個包裝密鑰都會加密相同的數據密鑰。數據 AWS 庫加密 SDK 將所有加密的數據密鑰與材料描述中的加密字段一起存儲。
要解密數據,您需要提供至少一個可以解密加密數據密鑰的包裝密鑰。
- 結合多種演算法的優勢
-
為了加密您的數據,默認情況下,數據 AWS 庫加密 SDK 使用具有 AES-GCM 對稱加密的算法套件,基於 HMAC 的密鑰派生功能(HKDF)和 ECDSA 簽名。若要加密資料金鑰,您可以指定適用於包裝金鑰的對稱或非對稱加密演算法。
一般而言,相較於非對稱或公有金鑰加密,對稱金鑰加密演算法速度較快,產生的加密文字較小。但是公鑰算法提供角色固有的分離。若要結合每個項目的優點,您可以使用公開金鑰加密來加密資料金鑰。
我們建議盡可能使用其中一個 AWS KMS 鑰匙圈。使用AWS KMS 金鑰圈時,您可以指定非對稱 RSA AWS KMS key 作為包裝金鑰,來選擇結合多種演算法的優勢。您也可以使用對稱加密 KMS 金鑰。
資料金鑰
資料金鑰是資料 AWS 庫加密 SDK 用來加密記錄中標記在加密動作ENCRYPT_AND_SIGN中的欄位的加密金鑰。每個資料金鑰是符合密碼編譯金鑰需求的位元組陣列。資料 AWS 庫加密 SDK 使用唯一的資料金鑰來加密每個屬性。
您不需要指定、產生、實作、擴充、保護或使用資料金鑰。當您調用加密和解密操作時, AWS 數據庫加密 SDK 可以為您工作。
為了保護您的資料金鑰,資料 AWS 庫加密 SDK 會使用一或多個稱為包裝金鑰的金鑰加密金鑰來加密這些金鑰。資料 AWS 庫加密 SDK 使用您的純文字資料金鑰加密資料之後,會盡快將其從記憶體中移除。然後將加密的數據密鑰存儲在材料描述中。如需詳細資訊,請參閱 AWS 資料庫加密 SDK 的運作方式。
提示
每個加密的資料金鑰都包含中繼資料,包括加密之環繞金鑰的識別碼。此中繼資料可讓資料 AWS 庫加密 SDK 在解密時識別有效的包裝金鑰。
包裝鍵
包裝金鑰是一種金鑰加密金鑰,資料 AWS 庫加密 SDK 用來加密記錄的資料金鑰。每個數據密鑰可以在一個或多個包裝密鑰下進行加密。設定金鑰圈時,您可以決定使用哪些包裝金鑰來保護您的資料。
![使用多個包裝密鑰加密一個數據密鑰](images/dbesdk-wrapping-key.png)
AWS 資料庫加密 SDK 支援數種常用的包裝金鑰,例如 AWS Key Management Service(AWS KMS) 對稱加密 KMS 金鑰 (包括多區域金鑰) 和非對稱 RSA KMS 金 AWS KMS 鑰、原始 AES-GCM (進階加密標準/Galois 計數器模式) 金鑰,以及原始 RSA 金鑰。我們建議盡可能使用 KMS 金鑰。若要決定您應該使用哪個包裝金鑰,請參閱選取包裝金鑰。
當您使用信封加密時,您需要保護包裝密鑰免受未經授權的訪問。您可以透過下列任何一種方式執行此操作:
-
使用專為此目的而設計的服務,例如 AWS Key Management Service (AWS KMS)
。 -
使用硬體安全模組 (HSM)
,例如 AWS CloudHSM 所提供的功能。 -
使用其他金鑰管理工具和服務。
如果您沒有金鑰管理系統,我們建議您使用 AWS KMS。資 AWS 料庫加密 SDK 與 AWS KMS 整合,可協助您保護和使用包裝金鑰。
鑰匙圈
若要指定用於加密和解密的包裝金鑰,請使用金鑰環。您可以使用資 AWS 料庫加密 SDK 提供的金鑰環或設計您自己的實作。
Keying 會產生、加密和解密資料金鑰。它還會生成用於計算簽名中基於散列的消息身份驗證碼(HMAC)的 MAC 密鑰。當您定義金鑰環時,您可以指定加密資料金鑰的包裝金鑰。大多數金鑰圈至少會指定一個包裝金鑰或提供並保護包裝金鑰的服務。加密時,資料 AWS 庫加密 SDK 會使用金鑰圈中指定的所有包裝金鑰來加密資料金鑰。如需有關選擇和使用 AWS 資料庫加密 SDK 定義之金鑰環的說明,請參閱使用金鑰環。
密碼編譯動作
加密動作會告訴加密程式要對記錄中的每個欄位執行哪些動作。
密碼編譯動作值可以是下列其中一項:
-
加密和簽署 — 加密欄位。在簽名中包含加密的欄位。
-
僅簽署 — 在簽名中包含欄位。
-
簽署並包含在加密內容中 — 在簽名和加密內容中包含欄位。
依預設,分割區和排序索引鍵是加密內容中包含的唯一屬性。您可以考慮定義其他欄位,以
SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT
便AWS KMS 階層式金鑰圈的分支金鑰 ID 供應商可識別從加密內容解密所需的分支金鑰。如需詳細資訊,請參閱分支金鑰 ID 供應商。注意
若要使用加
SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT
密動作,您必須使用 3.3 版或更新版本的 AWS 資料庫加密 SDK。在更新要包含的資料模型之前,請先將新版本部署至所有讀取器SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT
。 -
不執行任何動作 — 請勿加密或在簽名中包含欄位。
對於任何可以儲存敏感資料的欄位,請使用「加密並簽署」。對於主索引鍵值 (例如 DynamoDB 表中的分區索引鍵和排序金鑰),請使用「僅簽署」或「簽署並包含在加密內容中」。如果您指定任何 Sign 並包含在加密內容屬性中,則分割區和排序屬性也必須是 Sign 並包含在加密內容中。您不需要為材料描述指定密碼編譯動作。資料 AWS 庫加密 SDK 會自動簽署儲存材料描述的欄位。
仔細選擇您的加密操作。如有疑問,請使用加密並簽署。使用 AWS 資料庫加密 SDK 來保護記錄之後,您無法將現有、或SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT
欄位變更為指派給現有ENCRYPT_AND_SIGN
欄位的密碼編譯動作DO_NOTHING
,也無法變更指派給現有DO_NOTHING
欄位的密碼編譯動作。SIGN_ONLY
不過,您仍然可以對資料模型進行其他變更。例如,您可以在單一部署中新增或移除加密欄位。
資料描述
材料描述作為加密記錄的標頭。當您使用 AWS Database Encryption SDK 加密和簽署欄位時,加密程式會在組合加密資料時記錄材料描述,並將材料描述儲存在加密程式新增至記錄的新欄位 (aws_dbe_head
) 中。
材料描述是一種可攜式格式化的資料結構,其中包含資料金鑰和其他資訊的加密副本,例如加密演算法、加密內容,以及加密和簽署指示。加密程式會在組合加密材料以進行加密和簽署時記錄材料描述。稍後,當它需要組裝密碼材料來驗證和解密字段時,它會使用材料描述作為其指南。
將加密的資料金鑰與加密欄位一起儲存,可簡化解密作業,讓您無須獨立儲存和管理加密的資料金鑰,而不受其加密資料的影響。
如需材料描述的技術資訊,請參閱材料描述格式。
加密內容
為了改善密碼編譯作業的安全性, AWS Database Encryption SDK 會在所有要求中包含加密內容,以加密和簽署記錄。
加密內容是一組名稱/值對,其中包含任意非私密的額外驗證資料。資 AWS 料庫加密 SDK 在加密內容中包含資料庫的邏輯名稱和主索引鍵值 (例如,DynamoDB 表格中的分區索引鍵和排序金鑰)。當您加密並簽署欄位時,加密內容會以密碼編譯方式繫結至加密記錄,因此必須使用相同的加密內容來解密欄位。
如果您使用 AWS KMS 金鑰環,資料 AWS 庫加密 SDK 也會使用加密內容,在金鑰環進行的呼叫中提供額外的驗證資料 (AAD)。 AWS KMS
每當您使用預設演算法套件時,密碼編譯材料管理員 (CMM) 都會在加密內容中新增名稱-值配對,該內容包含保留名稱aws-crypto-public-key
,以及代表公開驗證金鑰的值。公開驗證金鑰會儲存在材料描述中。
密碼編譯資料管理員
密碼材料管理員 (CMM) 會組合用來加密、解密和簽署資料的加密材料。每當您使用預設演算法套件時,加密資料都包括純文字和加密的資料金鑰、對稱簽章金鑰和非對稱簽章金鑰。您永遠不會直接與 CMM 互動。加密和解密方法會為您代勞。
由於 CMM 充當 AWS 資料庫加密 SDK 和金鑰環之間的聯絡,因此它是自訂和延伸 (例如對原則強制執行的支援) 的理想選擇。您可以明確指定 CMM,但這不是必需的。當您指定金鑰環時, AWS 資料庫加密 SDK 會為您建立預設的 CMM。預設 CMM 會從您指定的金鑰圈取得加密或解密資料。這可能牽涉到呼叫密碼編譯服務,例如 AWS Key Management Service (AWS KMS)。
對稱與非對稱式加密
對稱加密使用相同的金鑰來加密和解密資料。
非對稱加密使用與數學相關的資料 key pair。配對中的一個金鑰會加密資料;只有配對中的另一個金鑰可以解密資料。如需詳細資訊,請參閱《加密服務和工具指南》中的AWS 加密演算法。
資 AWS 料庫加密 SDK 使用信封加密。它使用對稱數據密鑰對您的數據進行加密。它使用一個或多個對稱或非對稱包裝密鑰對稱數據密鑰進行加密。它將材料描述添加到記錄,其中包括至少一個數據密鑰的加密副本。
主要承諾
資 AWS 料庫加密 SDK 支援金鑰承諾 (有時稱為穩健性),這是一種安全性屬性,可確保每個加密文字只能解密為單一純文字。若要這麼做,金鑰承諾可確保只有加密記錄的資料金鑰才會被用來解密。資 AWS 料庫加密 SDK 包含所有加密和解密作業的金鑰承諾。
大多數現代對稱密碼(包括 AES)會在單個密鑰下加密純文本,例如數據 AWS 庫加密 SDK 用於加密記錄中標記的每個明文字字段的唯一數據密鑰。ENCRYPT_AND_SIGN
使用相同的資料金鑰解密此記錄會傳回與原始資料相同的純文字。使用不同的金鑰解密通常會失敗。雖然困難,但技術上可以在兩個不同的密鑰下解密密文。在極少數情況下,找到一個可以將密文部分解密為不同但仍然可以理解的明文密鑰是可行的。
數據 AWS 庫加密 SDK 始終對一個唯一數據密鑰下的每個屬性進行加密。它可能會在多個包裝密鑰下加密該數據密鑰,但包裝密鑰始終加密相同的數據密鑰。儘管如此,複雜、手動製作的加密記錄實際上可能包含不同的資料金鑰,每個金鑰都由不同的包裝金鑰加密。例如,如果一個使用者解密加密記錄,則會傳回 0x0 (false),而另一位使用者解密相同的加密記錄則會得到 0x1 (true)。
為了避免這種情況發生,資 AWS 料庫加密 SDK 會在加密和解密時包含金鑰承諾。加密方法會以密碼編譯方式將產生密文的唯一資料金鑰繫結至金鑰承諾產生,這是一種以雜湊為基礎的訊息驗證碼 (HMAC),透過資料金鑰衍生計算在材料描述上。然後,它將關鍵承諾存儲在材料描述中。當它使用金鑰承諾解密記錄時,資料 AWS 庫加密 SDK 會驗證資料金鑰是否為該加密記錄的唯一金鑰。如果資料金鑰驗證失敗,解密作業就會失敗。
數位簽章
若要確保資料在系統之間傳送時的真實性,您可以將數位簽章套用至記錄。數位簽章永遠是不對稱的。您可以使用私鑰來創建簽名,並將其附加到原始記錄。您的收件者會使用公開金鑰來驗證記錄在您簽署後尚未修改。如果加密資料的使用者和解密資料的使用者不受同等信任,您應該使用數位簽章。
資料 AWS 庫加密 SDK 會使用經過驗證的加密演算法 AES-GCM 來加密您的資料,但是由於 AES-GCM 使用對稱金鑰,因此任何可以解密用來解密密文資料金鑰的人也可以手動建立新的加密密文字,造成潛在的安全性考量。
為了避免這個問題,預設演算法套件會在加密的記錄中加入橢圓曲線數位簽章演算法 (ECDSA) 簽章。預設演算法套件會加密記錄中ENCRYPT_AND_SIGN
使用驗證加密演算法 AES-GCM 標記的欄位。然後,它會在記錄中標ENCRYPT_AND_SIGN
記、和的欄位上計算以雜湊為基礎的訊息驗證碼 (HMacs) 和非對稱 ECDSA 簽名。SIGN_ONLY
SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT
解密程序會使用簽章來驗證授權使用者是否已加密記錄。
使用預設演算法套件時, AWS 資料庫加密 SDK 會為每個加密記錄產生一個臨時私密金鑰和公開 key pair。資料 AWS 庫加密 SDK 會將公開金鑰儲存在材料說明中,並捨棄私密金鑰,而且沒有人可以建立另一個使用公開金鑰進行驗證的簽章。由於演算法會將公開金鑰與加密的資料金鑰做為材料描述中的額外驗證資料繫結,因此只能解密記錄的使用者無法更改公開金鑰。
資 AWS 料庫加密 SDK 一律包含 HMAC 驗證。ECDSA 數位簽章預設為啟用,但不是必要的。如果加密資料的使用者和解密資料的使用者同樣受到信任,您可以考慮使用不包含數位簽章的演算法套件來改善您的效能。如需有關選取替代演算法套件的詳細資訊,請參閱選擇演算法套件。