Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Chiffrement consultable dans DynamoDB
Pour configurer vos tables Amazon DynamoDB pour le chiffrement consultable, vous devez utiliser AWS KMS le trousseau de clés hiérarchique pour générer, chiffrer et déchiffrer les clés de données utilisées pour protéger vos articles. Vous devez également inclure le SearchConfigdans la configuration de chiffrement de votre table.
Si vous utilisez la bibliothèque de chiffrement côté client Java pour DynamoDB, vous devez utiliser le SDK de chiffrement de AWS base de données de bas niveau pour l'API DynamoDB pour chiffrer, signer, vérifier et déchiffrer les éléments de votre table. Le client DynamoDB amélioré et les DynamoDBItemEncryptor
niveaux inférieurs ne prennent pas en charge le chiffrement consultable.
Configuration des index secondaires avec des balises
Après avoir configuré vos balises, vous devez configurer un index secondaire qui reflète chaque balise avant de pouvoir effectuer une recherche sur les attributs chiffrés.
Lorsque vous configurez une balise standard ou composée, le SDK AWS Database Encryption ajoute le aws_dbe_b_
préfixe au nom de la balise afin que le serveur puisse facilement identifier les balises. Par exemple, si vous nommez une balise composéecompoundBeacon
, le nom complet de la balise est en faitaws_dbe_b_compoundBeacon
. Si vous souhaitez configurer des index secondaires qui incluent une balise standard ou composée, vous devez inclure le aws_dbe_b_
préfixe lorsque vous identifiez le nom de la balise.
- Clés de partition et de tri
-
Vous ne pouvez pas chiffrer les valeurs des clés primaires. Vos clés de partition et de tri doivent être signées. Les valeurs de votre clé primaire ne peuvent pas être une balise standard ou composée.
Les valeurs de votre clé primaire doivent êtreSIGN_ONLY
, sauf si vous spécifiez des SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT
attributs, les attributs de partition et de tri doivent également l'êtreSIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT
.
Les valeurs de vos clés primaires peuvent être des balises signées. Si vous avez configuré des balises signées distinctes pour chacune de vos valeurs de clé primaire, vous devez spécifier le nom d'attribut qui identifie la valeur de clé primaire comme le nom de balise signé. Toutefois, le SDK AWS de chiffrement de base de données n'ajoute pas le aws_dbe_b_
préfixe aux balises signées. Même si vous avez configuré des balises signées distinctes pour les valeurs de votre clé primaire, il vous suffit de spécifier les noms d'attribut pour les valeurs de clé primaire lorsque vous configurez un index secondaire.
- Index locaux secondaires
-
La clé de tri d'un index secondaire local peut être une balise.
Si vous spécifiez une balise pour la clé de tri, le type doit être String. Si vous spécifiez une balise standard ou composée pour la clé de tri, vous devez inclure le aws_dbe_b_
préfixe lorsque vous spécifiez le nom de la balise. Si vous spécifiez une balise signée, spécifiez le nom de la balise sans aucun préfixe.
- Index secondaires globaux
-
Les clés de partition et de tri d'un index secondaire global peuvent toutes deux être des balises.
Si vous spécifiez une balise pour la partition ou la clé de tri, le type doit être String. Si vous spécifiez une balise standard ou composée pour la clé de tri, vous devez inclure le aws_dbe_b_
préfixe lorsque vous spécifiez le nom de la balise. Si vous spécifiez une balise signée, spécifiez le nom de la balise sans aucun préfixe.
- Projections d'attribut
-
Une projection est l'ensemble d'attributs copié à partir d'une table dans un index secondaire. Les clés de partition et de tri de la table sont toujours projetées dans l'index. Vous pouvez projeter d'autres attributs en fonction des exigences de requête de votre application. DynamoDB propose trois options différentes pour les projections d'attributs KEYS_ONLY
:INCLUDE
, et. ALL
Si vous utilisez la projection d'attributs INCLUDE pour effectuer une recherche sur une balise, vous devez spécifier le nom de tous les attributs à partir desquels la balise est construite, ainsi que le nom de la balise avec le aws_dbe_b_
préfixe. Par exemple, si vous avez configuré une balise composée compoundBeacon
field1
, à partir de field2
field3
, et, vous devez spécifier aws_dbe_b_compoundBeacon
field1
,field2
, et field3
dans la projection.
Un index secondaire global ne peut utiliser que les attributs explicitement spécifiés dans la projection, mais un index secondaire local peut utiliser n'importe quel attribut.
Tester les sorties des balises
Si vous avez configuré des balises composées ou créé vos balises à l'aide de champs virtuels, nous vous recommandons de vérifier que ces balises produisent le résultat attendu avant de remplir votre table DynamoDB.
Le SDK AWS Database Encryption fournit le DynamoDbEncryptionTransforms
service qui vous aide à résoudre les problèmes liés aux champs virtuels et aux sorties de balises composées.
L'extrait suivant crée des éléments de test, définit le DynamoDbEncryptionTransforms
service avec la configuration de chiffrement des tables DynamoDB et montre comment vérifier que le champ virtuel produit le résultat attendu. ResolveAttributes
- Java
-
Voir l'exemple de code complet : VirtualBeaconSearchableEncryptionExample.java
// Create test items
final PutItemRequest itemWithHasTestResultPutRequest = PutItemRequest.builder()
.tableName(ddbTableName)
.item(itemWithHasTestResult)
.build();
final PutItemResponse itemWithHasTestResultPutResponse = ddb.putItem(itemWithHasTestResultPutRequest);
final PutItemRequest itemWithNoHasTestResultPutRequest = PutItemRequest.builder()
.tableName(ddbTableName)
.item(itemWithNoHasTestResult)
.build();
final PutItemResponse itemWithNoHasTestResultPutResponse = ddb.putItem(itemWithNoHasTestResultPutRequest);
// Define the DynamoDbEncryptionTransforms service
final DynamoDbEncryptionTransforms trans = DynamoDbEncryptionTransforms.builder()
.DynamoDbTablesEncryptionConfig(encryptionConfig).build();
// Verify configuration
final ResolveAttributesInput resolveInput = ResolveAttributesInput.builder()
.TableName(ddbTableName)
.Item(itemWithHasTestResult)
.Version(1)
.build();
final ResolveAttributesOutput resolveOutput = trans.ResolveAttributes(resolveInput);
// Verify that VirtualFields has the expected value
Map<String, String> vf = new HashMap<>();
vf.put("stateAndHasTestResult", "CAt");
assert resolveOutput.VirtualFields().equals(vf);
- C# / .NET
-
Consultez l'exemple de code complet : VirtualBeaconSearchableEncryptionExample.cs.
// Create item with hasTestResult=true
var itemWithHasTestResult = new Dictionary<String, AttributeValue>
{
["customer_id"] = new AttributeValue("ABC-123"),
["create_time"] = new AttributeValue { N = "1681495205" },
["state"] = new AttributeValue("CA"),
["hasTestResult"] = new AttributeValue { BOOL = true }
};
// Create item with hasTestResult=false
var itemWithNoHasTestResult = new Dictionary<String, AttributeValue>
{
["customer_id"] = new AttributeValue("DEF-456"),
["create_time"] = new AttributeValue { N = "1681495205" },
["state"] = new AttributeValue("CA"),
["hasTestResult"] = new AttributeValue { BOOL = false }
};
// Define the DynamoDbEncryptionTransforms service
var trans = new DynamoDbEncryptionTransforms(encryptionConfig);
// Verify configuration
var resolveInput = new ResolveAttributesInput
{
TableName = ddbTableName,
Item = itemWithHasTestResult,
Version = 1
};
var resolveOutput = trans.ResolveAttributes(resolveInput);
// Verify that VirtualFields has the expected value
Debug.Assert(resolveOutput.VirtualFields.Count == 1);
Debug.Assert(resolveOutput.VirtualFields["stateAndHasTestResult"] == "CAt");
- Rust
-
Consultez l'exemple de code complet : virtual_beacon_searchable_encryption.rs.
// Create item with hasTestResult=true
let item_with_has_test_result = HashMap::from([
(
"customer_id".to_string(),
AttributeValue::S("ABC-123".to_string()),
),
(
"create_time".to_string(),
AttributeValue::N("1681495205".to_string()),
),
("state".to_string(), AttributeValue::S("CA".to_string())),
("hasTestResult".to_string(), AttributeValue::Bool(true)),
]);
// Create item with hasTestResult=false
let item_with_no_has_test_result = HashMap::from([
(
"customer_id".to_string(),
AttributeValue::S("DEF-456".to_string()),
),
(
"create_time".to_string(),
AttributeValue::N("1681495205".to_string()),
),
("state".to_string(), AttributeValue::S("CA".to_string())),
("hasTestResult".to_string(), AttributeValue::Bool(false)),
]);
// Define the transform service
let trans = transform_client::Client::from_conf(encryption_config.clone())?;
// Verify the configuration
let resolve_output = trans
.resolve_attributes()
.table_name(ddb_table_name)
.item(item_with_has_test_result.clone())
.version(1)
.send()
.await?;
// Verify that VirtualFields has the expected value
let virtual_fields = resolve_output.virtual_fields.unwrap();
assert_eq!(virtual_fields.len(), 1);
assert_eq!(virtual_fields["stateAndHasTestResult"], "CAt");
L'extrait suivant crée un élément de test, définit le DynamoDbEncryptionTransforms
service avec la configuration de chiffrement des tables DynamoDB et montre comment vérifier que la balise composée produit le résultat attendu. ResolveAttributes
- Java
-
Voir l'exemple de code complet : CompoundBeaconSearchableEncryptionExample.java
// Create an item with both attributes used in the compound beacon.
final HashMap<String, AttributeValue> item = new HashMap<>();
item.put("work_id", AttributeValue.builder().s("9ce39272-8068-4efd-a211-cd162ad65d4c").build());
item.put("inspection_date", AttributeValue.builder().s("2023-06-13").build());
item.put("inspector_id_last4", AttributeValue.builder().s("5678").build());
item.put("unit", AttributeValue.builder().s("011899988199").build());
// Define the DynamoDbEncryptionTransforms service
final DynamoDbEncryptionTransforms trans = DynamoDbEncryptionTransforms.builder()
.DynamoDbTablesEncryptionConfig(encryptionConfig).build();
// Verify configuration
final ResolveAttributesInput resolveInput = ResolveAttributesInput.builder()
.TableName(ddbTableName)
.Item(item)
.Version(1)
.build();
final ResolveAttributesOutput resolveOutput = trans.ResolveAttributes(resolveInput);
// Verify that CompoundBeacons has the expected value
Map<String, String> cbs = new HashMap<>();
cbs.put("last4UnitCompound", "L-5678.U-011899988199");
assert resolveOutput.CompoundBeacons().equals(cbs);
// Note : the compound beacon actually stored in the table is not "L-5678.U-011899988199"
// but rather something like "L-abc.U-123", as both parts are EncryptedParts
// and therefore the text is replaced by the associated beacon
- C# / .NET
-
Voir l'exemple de code complet : CompoundBeaconSearchableEncryptionExample.cs
// Create an item with both attributes used in the compound beacon
var item = new Dictionary<String, AttributeValue>
{
["work_id"] = new AttributeValue("9ce39272-8068-4efd-a211-cd162ad65d4c"),
["inspection_date"] = new AttributeValue("2023-06-13"),
["inspector_id_last4"] = new AttributeValue("5678"),
["unit"] = new AttributeValue("011899988199")
};
// Define the DynamoDbEncryptionTransforms service
var trans = new DynamoDbEncryptionTransforms(encryptionConfig);
// Verify configuration
var resolveInput = new ResolveAttributesInput
{
TableName = ddbTableName,
Item = item,
Version = 1
};
var resolveOutput = trans.ResolveAttributes(resolveInput);
// Verify that CompoundBeacons has the expected value
Debug.Assert(resolveOutput.CompoundBeacons.Count == 1);
Debug.Assert(resolveOutput.CompoundBeacons["last4UnitCompound"] == "L-5678.U-011899988199");
// Note : the compound beacon actually stored in the table is not "L-5678.U-011899988199"
// but rather something like "L-abc.U-123", as both parts are EncryptedParts
// and therefore the text is replaced by the associated beacon
- Rust
-
Voir l'exemple de code complet : compound_beacon_searchable_encryption.rs
// Create an item with both attributes used in the compound beacon
let item = HashMap::from([
(
"work_id".to_string(),
AttributeValue::S("9ce39272-8068-4efd-a211-cd162ad65d4c".to_string()),
),
(
"inspection_date".to_string(),
AttributeValue::S("2023-06-13".to_string()),
),
(
"inspector_id_last4".to_string(),
AttributeValue::S("5678".to_string()),
),
(
"unit".to_string(),
AttributeValue::S("011899988199".to_string()),
),
]);
// Define the transforms service
let trans = transform_client::Client::from_conf(encryption_config.clone())?;
// Verify configuration
let resolve_output = trans
.resolve_attributes()
.table_name(ddb_table_name)
.item(item.clone())
.version(1)
.send()
.await?;
// Verify that CompoundBeacons has the expected value
Dlet compound_beacons = resolve_output.compound_beacons.unwrap();
assert_eq!(compound_beacons.len(), 1);
assert_eq!(
compound_beacons["last4UnitCompound"],
"L-5678.U-011899988199"
);
// but rather something like "L-abc.U-123", as both parts are EncryptedParts
// and therefore the text is replaced by the associated beacon