本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
適用於 Python 的加密用戶端範例程式碼
注意
我們的客戶端加密庫被重命名為 AWS 數據庫加密SDK。下列主題提供有關版本 1 的資訊。 X-2. 適用於 Java 和版本 1 的 x 個加密用戶端。 X — 3. 適用於 Python 的 x 個 DynamoDB 密用戶端。如需詳細資訊,請參閱 DynamoDB 版本SDK支援的資AWS 料庫加密。
下列範例說明如何使用適用於 Python 的 DynamoDB 加密用戶端來保護應用程式中的 DynamoDB 資料。您可以在aws-dynamodb-encryption-python
使用用 EncryptedTable 戶端協助程式類別
下列範例會示範如何使用直接KMS提供者搭配用EncryptedTable
戶端協助程式類別。此範例使用與下列範使用項目加密程式例相同的密碼編譯材料提供者。不過,其將使用 EncryptedTable
類別,而不是直接與較低層級的項目加密程式互動。
比較這些範例,您就可以看見用戶端協助程式類別為您所做的事情。這包括建立 DynamoDB 加密內容,以及確保主要金鑰屬性永遠簽署,但永遠不會加密。若要建立加密內容並探索主要金鑰,用戶端協助程式類別會呼叫 DynamoDB DescribeTable作業。若要執行此程式碼,您必須擁有呼叫此作業的權利。
查看完整的程式碼範例:aws_kms_encrypted_table.py
- 步驟 1:建立資料表
-
首先建立具有表格名稱的標準 DynamoDB 表格執行個體。
table_name='test-table' table = boto3.resource('dynamodb').Table(
table_name
) - 步驟 2:建立密碼編譯資料提供者
-
建立您選取的密碼編譯材料提供者 (CMP) 執行個體。
此範例使用直接KMS提供者,但您可以使用任何相容的CMP。若要建立直接KMS提供者,請指定AWS KMS key。此範例使用的 Amazon 資源名稱 (ARN) AWS KMS key,但您可以使用任何有效的金鑰識別碼。
kms_key_id='arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=
kms_key_id
) - 步驟 3:建立屬性動作物件
-
屬性動作會告知項目加密程式要對項目的每個屬性執行什麼動作。這個範例中的
AttributeActions
物件會加密並簽署所有項目,但test
屬性 (予以忽略) 除外。當您使用用戶端協助程式類別時,請勿指定主要索引鍵屬性的屬性動作。
EncryptedTable
類別會簽署 (但絕不會加密) 主要索引鍵屬性。actions = AttributeActions( default_action=CryptoAction.ENCRYPT_AND_SIGN, attribute_actions={'test': CryptoAction.DO_NOTHING} )
- 步驟 4:建立已加密的資料表
-
使用標準表格、直接KMS提供者和屬性動作建立加密資料表。這個步驟可完成設定。
encrypted_table = EncryptedTable( table=table, materials_provider=kms_cmp, attribute_actions=actions )
- 步驟 5:在資料表中放入純文字項目
-
當您呼叫上的
put_item
方法時encrypted_table
,您的資料表項目會透明地加密、簽署,並新增至 DynamoDB 表格。首先,定義資料表項目。
plaintext_item = { 'partition_attribute': 'value1', 'sort_attribute': 55 'example': 'data', 'numbers': 99, 'binary': Binary(b'\x00\x01\x02'), 'test': 'test-value' }
然後,在資料表中放入該項目。
encrypted_table.put_item(Item=plaintext_item)
若要以加密形式從 DynamoDB 表格取得項目,請呼叫物件上的get_item
table
方法。若要取得已解密的項目,請在 get_item
物件上呼叫 encrypted_table
方法。
使用項目加密程式
此範例說明如何在加密表格項目時直接與 DynamoDB 加密用戶端中的項目加密程式互動,而不是使用與項目加密器互動的用戶端協助程式類別。
使用此技術時,您可以手動建立 DynamoDB 加密內容和設定物件 (CryptoConfig
)。此外,您可以在一次呼叫中加密這些項目,並將它們放入 DynamoDB 表格中的個別呼叫。這可讓您自訂put_item
呼叫,並使用 DynamoDB 加密用戶端來加密和簽署永遠不會傳送至 DynamoDB 的結構化資料。
此範例使用直接KMS提供者,但您可以使用任何相容的CMP。
查看完整的程式碼範例:aws_kms_encrypted_item.py
- 步驟 1:建立資料表
-
首先建立具有表格名稱的標準 DynamoDB 表格資源執行個體。
table_name='test-table' table = boto3.resource('dynamodb').Table(
table_name
) - 步驟 2:建立密碼編譯資料提供者
-
建立您選取的密碼編譯材料提供者 (CMP) 執行個體。
此範例使用直接KMS提供者,但您可以使用任何相容的CMP。若要建立直接KMS提供者,請指定AWS KMS key。此範例使用的 Amazon 資源名稱 (ARN) AWS KMS key,但您可以使用任何有效的金鑰識別碼。
kms_key_id='arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab' kms_cmp = AwsKmsCryptographicMaterialsProvider(key_id=
kms_key_id
) - 第 3 步:使用 TableInfo 輔助類
-
若要從 DynamoDB 取得資料表的相關資訊,請建立TableInfo協助程式類別的執行個體。當您直接使用項目加密程式時,您需要建立
TableInfo
執行個體及呼叫其方法。用戶端協助程式類別會為您執行此作業。的
refresh_indexed_attributes
方法TableInfo
使用 DescribeTableDynamoDB 作業取得有關表格的即時、準確資訊。這包括其主要索引鍵及其本機和全域輔助索引。呼叫端必須具備呼叫DescribeTable
的許可。table_info = TableInfo(name=
table_name
) table_info.refresh_indexed_attributes(table.meta.client) - 步驟 4:建立動 DynamoDB 加密內容
-
DynamoDB 加密內容包含資料表結構及其加密和簽署方式的相關資訊。此範例會明確建立 DynamoDB 加密內容,因為它會與項目加密程式互動。用戶端協助程式類別會為您建立 DynamoDB 加密內容。
若要取得分割索引鍵和排序索引鍵,您可以使用 TableInfoHelper 類別的屬性。
index_key = { 'partition_attribute': 'value1', 'sort_attribute': 55 } encryption_context = EncryptionContext( table_name=
table_name
, partition_key_name=table_info.primary_index.partition, sort_key_name=table_info.primary_index.sort, attributes=dict_to_ddb(index_key) ) - 步驟 5:建立屬性動作物件
-
屬性動作會告知項目加密程式要對項目的每個屬性執行什麼動作。這個範例中的
AttributeActions
物件會加密並簽署所有項目,但主要索引鍵屬性 (簽署但不加密) 和test
屬性 (予以忽略) 除外。當您直接與項目加密程式互動且預設動作為
ENCRYPT_AND_SIGN
時,您必須為主要索引鍵指定替代動作。您可以使用set_index_keys
方法,該方法針對主要索引鍵使用SIGN_ONLY
,或使用DO_NOTHING
(如果這是預設動作)。若要指定主索引鍵,此範例會使用TableInfo物件中的索引鍵,該索引鍵會透過呼叫 DynamoDB 填入。這項技巧比硬編碼主要索引鍵名稱還要安全。
actions = AttributeActions( default_action=CryptoAction.ENCRYPT_AND_SIGN, attribute_actions={'test': CryptoAction.DO_NOTHING} ) actions.set_index_keys(*table_info.protected_index_keys())
- 步驟 6:建立項目的組態
-
若要設定 DynamoDB 加密用戶端,請使用您剛才在表格項目的CryptoConfig
組態中建立的物件。用戶端輔助程式類別會 CryptoConfig 為您建立。 crypto_config = CryptoConfig( materials_provider=kms_cmp, encryption_context=encryption_context, attribute_actions=actions )
- 步驟 7:將項目加密
-
此步驟會加密並簽署項目,但不會將其放入 DynamoDB 表格中。
當您使用用戶端協助程式類別時,您的項目會以透明方式加密和簽署,然後在您呼叫協助程式類別的
put_item
方法時新增至 DynamoDB 表格。當您直接使用項目加密程式時,加密和放置動作都是獨立的。首先,建立純文字項目。
plaintext_item = { 'partition_attribute': 'value1', 'sort_key': 55, 'example': 'data', 'numbers': 99, 'binary': Binary(b'\x00\x01\x02'), 'test': 'test-value' }
然後,將它加密並簽署。
encrypt_python_item
方法需要CryptoConfig
組態物件。encrypted_item = encrypt_python_item(plaintext_item, crypto_config)
- 步驟 8:在資料表中放入此項目
-
此步驟會將加密和已簽署的項目置於 DynamoDB 表格中。
table.put_item(Item=encrypted_item)
若要檢視已加密的項目,請在原始 get_item
物件 (而非 table
物件) 上呼叫 encrypted_table
方法。不需進行驗證或解密,即可從 DynamoDB 資料表取得項目。
encrypted_item = table.get_item(Key=partition_key)['Item']
下圖顯示一部分已加密並簽署資料表項目的範例。
已加密的屬性值為二進位資料。主要索引鍵屬性 (partition_attribute
和 sort_attribute
) 及 test
屬性的名稱和值都保持純文字形式。輸出也會顯示包含簽章 (*amzn-ddb-map-sig*
) 的屬性和資料描述屬性 (*amzn-ddb-map-desc*
)。