適用於 Python 的加密用戶端範例程式碼 - AWS 資料庫加密 SDK

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

適用於 Python 的加密用戶端範例程式碼

注意

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

下列範例說明如何使用適用於 Python 的 DynamoDB 加密用戶端來保護應用程式中的 DynamoDB 資料。您可以在aws-dynamodb-encryption-python存儲庫的示例目錄中找到更多示例(並提供您自己的示例)GitHub。

使用用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_itemtable方法。若要取得已解密的項目,請在 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 加密內容。

若要取得分割索引鍵和排序索引鍵,您可以使用 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_attributesort_attribute) 及 test 屬性的名稱和值都保持純文字形式。輸出也會顯示包含簽章 (*amzn-ddb-map-sig*) 的屬性和資料描述屬性 (*amzn-ddb-map-desc*)。


        已加密並簽署的項目摘錄