直接 KMS 資料提供者 - AWS 資料庫加密 SDK

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

直接 KMS 資料提供者

注意

我們的客戶端加密庫被重命名為AWS數據庫加密 SDK。下列主題提供有關版本 1 的資訊。 X-2. 適用於 Java 和版本 1 的 x 個加密用戶端。 X — 3. 適用於 Python 的 x 個加密用戶端。如需詳細資訊,請參閱適用於 DynamoDB 版本支援的資AWS料庫加密 SDK

直接 KMS 材料提供商(直接 KMS 提供商)保護您的表項下永遠不AWS KMS key會離開 AWS Key Management Service(AWS KMS)未加密。此密碼編譯資料提供者會為每個資料表項目傳回唯一的加密金鑰和簽署金鑰。為此,它會在您每次進行項目的加密或解密時呼叫 AWS KMS。

如果您以高頻率和大規模處理 DynamoDB 項目,則可能會超出AWS KMSrequests-per-second限制,導致處理延遲。如果您需要超過限制,請在AWS Support中心建立案例。您也可以考慮使用有限金鑰重複使用的加密材料提供者,例如「最新的提供者」。

若要使用直接 KMS 提供者AWS 帳戶,呼叫者必須具有至少一個GenerateDataKey和權限AWS KMS key,才能呼叫AWS KMS key. AWS KMS key必須是對稱加密金鑰;DynamoDB 加密用戶端不支援非對稱加密。如果您使用 DynamoDB 全域表,您可能需要指定AWS KMS多區域金鑰。如需詳細資訊,請參閱 使用方式

注意

當您使用 Direct KMS 提供者時,主索引鍵屬性的名稱和值會以純文字顯示在AWS KMS加密內容和相關AWS KMS作業的AWS CloudTrail記錄中。但是,DynamoDB 加密用戶端永遠不會公開任何加密屬性值的純文字。

直接 KMS 提供者是 DynamoDB 加密用戶端支援的數個加密材料提供者 (CMP) 之一。如需其他 CMP 的相關資訊,請參閱密碼材料供應商

如需範例程式碼,請參閱:

使用方式

若要建立直接 KMS 提供者,請使用金鑰 ID 參數在您的帳戶中指定對稱加密 KMS 金鑰。索引鍵識別碼參數的值可以是的索引鍵識別碼、金鑰 ARN、別名或別名 ARN。AWS KMS key如需金鑰識別碼的詳細資訊,請參閱AWS Key Management Service開發人員指南中的金鑰識別碼

直接 KMS 提供者需要對稱加密 KMS 金鑰。無法使用非對稱 KMS 金鑰。不過,您可以使用多區域 KMS 金鑰、包含匯入金鑰材料的 KMS 金鑰,或是自訂金鑰存放區中的 KMS 金鑰。您必須擁有 KMS 金鑰的公里:GenerateDataKeyKMS: 解密權限。因此,您必須使用客戶管理的金鑰,而不是受AWS管或AWS擁有的 KMS 金鑰。

適用於 Python 的 DynamoDB 加密用戶端會在金鑰 ID 參數值中決定要AWS KMS從區域呼叫的區域 (如果該區域包含一個)。否則,它會使用用AWS KMS戶端中的「區域」(如果您指定區域) 或您在中設定的「區域」AWS SDK for Python (Boto3)。如需有關 Python 中區域選取的資訊,請參閱在AWS開發套件中的設定 (Boto3) API 參考。

如果您指定的用戶端包含區域,Java 的 DynamoDB 加密用戶端會決定AWS KMS從AWS KMS用戶端中的區域呼叫的區域。否則,它會使用您在中設定的區域AWS SDK for Java。如需有關「區域」選取的資訊AWS SDK for Java,請參閱AWS SDK for Java開發人員指南中的AWS 區域選取項目

Java
// Replace the example key ARN and Region with valid values for your application final String keyArn = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' final String region = 'us-west-2' final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build(); final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, keyArn);
Python

下列範例使用 ARN 索引鍵來指定AWS KMS key。如果您的金鑰識別碼未包含AWS 區域,DynamoDB 加密用戶端會從設定的 Botocore 工作階段 (如果有的話) 取得區域,或從 Boto 預設值取得該區域。

# Replace the example key ID with a valid value kms_key = 'arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=kms_key)

如果您使用 Amazon DynamoDB 全域表,建議您使用AWS KMS多區域金鑰加密資料。多區域金鑰是不同AWS KMS keys的,可AWS 區域以互換使用,因為它們具有相同的金鑰 ID 和金鑰材料。如需詳細資訊,請參閱AWS Key Management Service開發人員指南中的使用多區域金鑰

注意

如果您使用的是全域表 2017.11.29 版,則必須設定屬性動作,使保留的複寫欄位不會加密或簽署。如需詳細資訊,請參閱 舊版全域資料表的問題

若要將多區域金鑰與 DynamoDB 加密用戶端搭配使用,請建立多區域金鑰,然後將其複寫到應用程式執行所在的區域。然後將直接 KMS 提供者設定為在 DynamoDB 加密用戶端呼叫的區域中使用多區域金鑰。AWS KMS

下列範例將 DynamoDB 加密用戶端設定為在美國東部 (維吉尼亞北部) (us-east-1) 區域中加密資料,並使用多區域金鑰在美國西部 (奧勒岡) (US-西部 -2) 區域中將其解密。

Java

在此範例中,DynamoDB 加密用戶端會取得要AWS KMS從用戶端中的區域呼叫的AWS KMS區域。此keyArn值可識別相同區域中的多區域金鑰。

// Encrypt in us-east-1 // Replace the example key ARN and Region with valid values for your application final String usEastKey = 'arn:aws:kms:us-east-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab' final String region = 'us-east-1' final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build(); final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, usEastKey);
// Decrypt in us-west-2 // Replace the example key ARN and Region with valid values for your application final String usWestKey = 'arn:aws:kms:us-west-2:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab' final String region = 'us-west-2' final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build(); final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, usWestKey);
Python

在此範例中,DynamoDB 加密用戶端會取得要AWS KMS從金鑰 ARN 中的區域呼叫的區域。

# Encrypt in us-east-1 # Replace the example key ID with a valid value us_east_key = 'arn:aws:kms:us-east-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab' kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=us_east_key)
# Decrypt in us-west-2 # Replace the example key ID with a valid value us_west_key = 'arn:aws:kms:us-west-2:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab' kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=us_west_key)

運作方式

Direct KMS 提供者會傳回受您指定之保護AWS KMS key的加密和簽署金鑰,如下圖所示。

DynamoDB 加密用戶端中直接 KMS 提供者的輸入、處理和輸出
  • 若要產生加密資料,Direct KMS 提供者會AWS KMS要求使用您指定的項目,為每個項目產生唯一AWS KMS key的資料金鑰。它會從資料金鑰的純文字複本衍生項目的加密和簽署金鑰,然後傳回加密和簽署金鑰,以及在項目資料描述屬性中存放的加密資料金鑰。

    項目加密程式會在使用加密和簽署金鑰後,盡快將其從記憶體中移除。加密的項目中只會儲存用來衍生這些金鑰的資料金鑰加密複本。

  • 為了產生解密資料,直接 KMS 提供者會要求 AWS KMS 將加密的資料金鑰解密。隨後,它會從純文字資料金鑰衍生驗證和簽署金鑰,並將它們傳回至項目加密程式。

    項目加密程式會驗證該項目,如果驗證成功,則會將加密的值解密。接著,它會盡快從記憶體中移除這些金鑰。

取得加密資料

本節將詳細說明直接 KMS 提供者在接收到來自項目加密程式的加密資料請求時的輸入、輸出和處理情形。

輸入 (從應用程式)

  • 的金鑰識別碼AWS KMS key。

輸入 (從項目加密程式)

輸出 (到項目加密程式)

  • 加密金鑰 (純文字)

  • 簽署金鑰

  • 實際資料描述中:這些值會儲存在用戶端新增至項目的資料描述屬性中。

    • amzn-ddb-env-key:由 Base64 編碼的資料金鑰加密 AWS KMS key

    • amzn-ddb-env-alg:加密演算法,預設為 A ES/256

    • amzn-ddb-sig-alg: 簽署演算法,預設情況下,

    • amzn-ddb-wrap-alg: 公里

處理

  1. 直接 KMS 提供者會傳送AWS KMS要求,以使用指AWS KMS key定的產生項目的唯一資料金鑰。此操作會傳回以 AWS KMS key 加密的純文字金鑰和複本。這項資料又稱為初始金鑰資料

    此要求包含 AWS KMS 加密內容中的下列純文字值。這些非機密值會以密碼編譯的方式繫結至加密的物件,而在解密時需要相同的加密細節。您可以使用這些值來識別AWS CloudTrail記錄AWS KMS中的呼叫。

    • amzn-ddb-env-alg— 加密演算法,預設為 AES/256

    • amzn-ddb-sig-alg— 簽名算法,默認情況下

    • (選擇性) aws-kms-table — 表格名稱

    • (選擇性) 分割區索引鍵名稱分割區索引鍵值 (二進位值是 Base64 編碼)

    • (選擇性) 排序索引鍵名稱排序索引鍵值 (二進位值是 Base64 編碼)

    直接 KMS 提供者會從項目的 DynamoDB AWS KMS 加密內容取得加密內容的值。如果 DynamoDB 加密內容未包含值 (例如資料表名稱),則加密內容中會省略該名稱與值配對。AWS KMS

  2. 直接 KMS 提供者會從資料金鑰衍生對稱加密金鑰和簽署金鑰。根據預設,其將使用安全雜湊演算法 (SHA) 256RFC5869 HMAC 式金鑰衍生函數,衍生 256 位元 AES 對稱加密金鑰和 256 位元 HMAC-SHA-256 簽署金鑰。

  3. 直接 KMS 提供者會將輸出傳回至項目加密程式。

  4. 項目加密程式會採用實際資料描述中指定的演算法,使用加密金鑰為指定的屬性加密,並使用簽署金鑰加以簽署。它會盡快從記憶體中移除這些純文字金鑰。

取得解密資料

本節將詳細說明直接 KMS 提供者在接收到來自項目加密程式的解密資料請求時的輸入、輸出和處理情形。

輸入 (從應用程式)

  • 的金鑰識別碼AWS KMS key。

    金鑰識別碼的值可以是的金鑰識別碼、金鑰 ARN、別名或別名 ARN。AWS KMS key金鑰 ID 中未包含的任何值 (例如「地區」) 都必須在AWS具名的設定檔中提供。關鍵 ARN 提供了所有AWS KMS需要的值。

輸入 (從項目加密程式)

  • DynamoDB 加密內容的副本,其中包含材料描述屬性的內容。

輸出 (到項目加密程式)

  • 加密金鑰 (純文字)

  • 簽署金鑰

處理

  1. 直接 KMS 提供者會從加密項目中的材料描述屬性取得加密的資料金鑰。

  2. 它會要求 AWS KMS 使用指定的 AWS KMS key 將加密的資料金鑰解密。此操作會傳回純文字金鑰。

    此要求必須使用先前用來產生和加密資料金鑰的相同 AWS KMS 加密內容

    • aws-kms-table— 表格名稱

    • 分割區索引鍵名稱分割區索引鍵值 (二進位值是 Base64 編碼)

    • (選擇性) 排序索引鍵名稱排序索引鍵值 (二進位值是 Base64 編碼)

    • amzn-ddb-env-alg— 加密演算法,預設為 AES/256

    • amzn-ddb-sig-alg— 簽名算法,默認情況下

  3. 直接 KMS 提供者會使用安全雜湊演算法 (SHA) 256RFC5869 HMAC 式金鑰衍生函數,從資料金鑰衍生 256 位元 AES 對稱加密金鑰和 256 位元 HMAC-SHA-256 簽署金鑰。

  4. 直接 KMS 提供者會將輸出傳回至項目加密程式。

  5. 項目加密程式會使用簽署金鑰來驗證項目。如果成功,則會使用對稱加密金鑰將加密的屬性值解密。這些操作會使用實際資料描述中指定的加密和簽署演算法。項目加密程式會盡快從記憶體中移除這些純文字金鑰。