本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
。 NET例子
以下示例向您展示了如何使用。 NETDynamoDB 的客户端加密库,用于保护应用程序中的表格项目。要查找更多示例(并贡献自己的示例),请参阅。 NET上的 aws-database-encryption-sdk-dynamodb 存储库中的示例
以下示例演示如何配置。 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;