。 NET例子 - AWS 数据库加密 SDK

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

。 NET例子

以下示例向您展示了如何使用。 NETDynamoDB 的客户端加密库,用于保护应用程序中的表格项目。要查找更多示例(并贡献自己的示例),请参阅。 NET上的 aws-database-encryption-sdk-dynamodb 存储库中的示例。 GitHub

以下示例演示如何配置。 NETDynamoDB 的客户端加密库位于一个未填充的全新 Amazon DynamoDB 表中。如果您想配置现有的 Amazon DynamoDB 表以进行客户端加密,请参阅 将版本 3.x 添加到现有表

对 DynamoDB 使用低级 AWS 数据库加密 SDK API

以下示例说明如何使用带AWS KMS 密钥环的 DynamoDB 低级 AWS 数据库加密SDK,通过您的 API DynamoDB 请求在客户端自动加密和签名项目。 PutItem

您可以使用任何支持的密钥环,但我们建议尽可能使用其中一个 AWS KMS 密钥环。

查看完整的代码示例BasicPutGetExample.cs

步骤 1:创建 AWS KMS 密钥环

以下示例使用CreateAwsKmsMrkMultiKeyring对称加密 AWS KMS KMS密钥创建密钥环。CreateAwsKmsMrkMultiKeyring 方法可确保密钥环能够正确处理单区域密钥和多区域密钥。

var matProv = new MaterialProviders(new MaterialProvidersConfig()); var keyringInput = new CreateAwsKmsMrkMultiKeyringInput { Generator = kmsKeyId }; var kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);
步骤 2:配置属性操作

以下示例定义了一个attributeActionsOnEncrypt字典,该字典表示表格项目的示例属性操作

注意

以下示例未将任何属性定义为SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT。如果您指定了任何SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT属性,则分区和排序属性也必须是SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT

var attributeActionsOnEncrypt = new Dictionary<string, CryptoAction> { ["partition_key"] = CryptoAction.SIGN_ONLY, // The partition attribute must be SIGN_ONLY ["sort_key"] = CryptoAction.SIGN_ONLY, // The sort attribute must be SIGN_ONLY ["attribute1"] = CryptoAction.ENCRYPT_AND_SIGN, ["attribute2"] = CryptoAction.SIGN_ONLY, [":attribute3"] = CryptoAction.DO_NOTHING };
步骤 3:定义从签名中可以排除哪些属性

以下示例假设所有 DO_NOTHING 属性共享不同的前缀“:”,并使用该前缀定义允许的未签名属性。客户端假设任何带有“:”前缀的属性名称都被排除在签名之外。有关更多信息,请参阅 Allowed unsigned attributes

const String unsignAttrPrefix = ":";
步骤 4:定义 DynamoDB 表的加密配置

以下示例定义了一个 tableConfigs 映射,该映射表示此 DynamoDB 表的加密配置。

此示例将 DynamoDB 表名称指定为逻辑表名称。强烈建议您在首次定义加密配置时将 DynamoDB 表名指定为逻辑表名。有关更多信息,请参阅 DynamoD AWS B 数据库加密SDK中的加密配置

注意

要使用可搜索的加密签名信标,您还必须在加密配置中包括 SearchConfig

Dictionary<String, DynamoDbTableEncryptionConfig> tableConfigs = new Dictionary<String, DynamoDbTableEncryptionConfig>(); DynamoDbTableEncryptionConfig config = new DynamoDbTableEncryptionConfig { LogicalTableName = ddbTableName, PartitionKeyName = "partition_key", SortKeyName = "sort_key", AttributeActionsOnEncrypt = attributeActionsOnEncrypt, Keyring = kmsKeyring, AllowedUnsignedAttributePrefix = unsignAttrPrefix }; tableConfigs.Add(ddbTableName, config);
步骤 5:创建新的 AWS SDK DynamoDB 客户端

以下示例使用步骤 4 中的创建新的 AWS SDK DynamoDB 客户端TableEncryptionConfigs

var ddb = new Client.DynamoDbClient( new DynamoDbTablesEncryptionConfig { TableEncryptionConfigs = tableConfigs });
步骤 6:对 DynamoDB 表格项目进行加密和签名

以下示例定义了一个代表示例表项目的item字典,并将该项目放入 DynamoDB 表中。该项目在发送到 DynamoDB 之前将在客户端进行加密和签名。

var item = new Dictionary<String, AttributeValue> { ["partition_key"] = new AttributeValue("BasicPutGetExample"), ["sort_key"] = new AttributeValue { N = "0" }, ["attribute1"] = new AttributeValue("encrypt and sign me!"), ["attribute2"] = new AttributeValue("sign me!"), [":attribute3"] = new AttributeValue("ignore me!") }; PutItemRequest putRequest = new PutItemRequest { TableName = ddbTableName, Item = item }; PutItemResponse putResponse = await ddb.PutItemAsync(putRequest);

使用较低级别 DynamoDbItemEncryptor

以下示例说明如何使用带有 AWS KMS 密钥环的较低级别 DynamoDbItemEncryptor 来直接对表项目进行加密和签名。DynamoDbItemEncryptor 不会将项目放入 DynamoDB 表中。

您可以在 DynamoDB 增强版客户端中使用任何支持的密钥环,但我们建议尽可能使用其中 AWS KMS 一个密钥环。

注意

较低级别的 DynamoDbItemEncryptor 不支持可搜索加密。使用适用于 D API ynamoDB 的低级 AWS 数据库加密SDK来使用可搜索的加密。

查看完整的代码示例ItemEncryptDecryptExample.cs

步骤 1:创建 AWS KMS 密钥环

以下示例使用CreateAwsKmsMrkMultiKeyring对称加密 AWS KMS KMS密钥创建密钥环。CreateAwsKmsMrkMultiKeyring 方法可确保密钥环能够正确处理单区域密钥和多区域密钥。

var matProv = new MaterialProviders(new MaterialProvidersConfig()); var keyringInput = new CreateAwsKmsMrkMultiKeyringInput { Generator = kmsKeyId }; var kmsKeyring = matProv.CreateAwsKmsMrkMultiKeyring(keyringInput);
步骤 2:配置属性操作

以下示例定义了一个attributeActionsOnEncrypt字典,该字典表示表格项目的示例属性操作

注意

以下示例未将任何属性定义为SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT。如果您指定了任何SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT属性,则分区和排序属性也必须是SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT

var attributeActionsOnEncrypt = new Dictionary<String, CryptoAction> { ["partition_key"] = CryptoAction.SIGN_ONLY, // The partition attribute must be SIGN_ONLY ["sort_key"] = CryptoAction.SIGN_ONLY, // The sort attribute must be SIGN_ONLY ["attribute1"] = CryptoAction.ENCRYPT_AND_SIGN, ["attribute2"] = CryptoAction.SIGN_ONLY, [":attribute3"] = CryptoAction.DO_NOTHING };
步骤 3:定义从签名中可以排除哪些属性

以下示例假设所有 DO_NOTHING 属性共享不同的前缀“:”,并使用该前缀定义允许的未签名属性。客户端假设任何带有“:”前缀的属性名称都被排除在签名之外。有关更多信息,请参阅 Allowed unsigned attributes

String unsignAttrPrefix = ":";
步骤 4:定义 DynamoDbItemEncryptor 配置

以下示例定义 DynamoDbItemEncryptor 的配置。

此示例将 DynamoDB 表名称指定为逻辑表名称。强烈建议您在首次定义加密配置时将 DynamoDB 表名指定为逻辑表名。有关更多信息,请参阅 DynamoD AWS B 数据库加密SDK中的加密配置

var config = new DynamoDbItemEncryptorConfig { LogicalTableName = ddbTableName, PartitionKeyName = "partition_key", SortKeyName = "sort_key", AttributeActionsOnEncrypt = attributeActionsOnEncrypt, Keyring = kmsKeyring, AllowedUnsignedAttributePrefix = unsignAttrPrefix };
步骤 5:创建 DynamoDbItemEncryptor

以下示例使用步骤 4 中的 config 创建新的 DynamoDbItemEncryptor

var itemEncryptor = new DynamoDbItemEncryptor(config);
步骤 6:直接对表项目进行加密和签名

以下示例使用 DynamoDbItemEncryptor 直接对项目进行加密和签名。DynamoDbItemEncryptor 不会将项目放入 DynamoDB 表中。

var originalItem = new Dictionary<String, AttributeValue> { ["partition_key"] = new AttributeValue("ItemEncryptDecryptExample"), ["sort_key"] = new AttributeValue { N = "0" }, ["attribute1"] = new AttributeValue("encrypt and sign me!"), ["attribute2"] = new AttributeValue("sign me!"), [":attribute3"] = new AttributeValue("ignore me!") }; var encryptedItem = itemEncryptor.EncryptItem( new EncryptItemInput { PlaintextItem = originalItem } ).EncryptedItem;