Crittografia ricercabile in DynamoDB - AWS Crittografia database SDK

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Crittografia ricercabile in DynamoDB

Per configurare le tabelle Amazon DynamoDB per una crittografia ricercabile, devi utilizzare AWS KMS il portachiavi gerarchico per generare, crittografare e decrittografare le chiavi dati utilizzate per proteggere i tuoi articoli. È inoltre necessario includere la configurazione di crittografia nella tabella. SearchConfig

Nota

Se utilizzi la libreria di crittografia lato client Java per DynamoDB, devi utilizzare l'API di basso livello AWS Database Encryption SDK for DynamoDB per DynamoDB per crittografare, firmare, verificare e decrittografare gli elementi della tabella. Il DynamoDB Enhanced Client e il DynamoDBItemEncryptor livello inferiore non supportano la crittografia ricercabile.

Configurazione degli indici secondari con beacon

Dopo aver configurato i beacon, è necessario configurare un indice secondario che rifletta ogni beacon prima di poter eseguire la ricerca negli attributi crittografati.

Quando configurate un beacon standard o composto, AWS Database Encryption SDK aggiunge il aws_dbe_b_ prefisso al nome del beacon in modo che il server possa identificare facilmente i beacon. Ad esempio, se si assegna un nome a un beacon composto, in realtà il nome completo del beacon è. compoundBeacon aws_dbe_b_compoundBeacon Se si desidera configurare indici secondari che includano un beacon standard o composto, è necessario includere il prefisso quando si identifica il nome del aws_dbe_b_ beacon.

Chiavi di partizione e ordinamento

Non è possibile crittografare i valori della chiave primaria. Le chiavi di partizione e di ordinamento devono essere firmate. I valori della chiave primaria non possono essere un beacon standard o composto.

I valori della chiave primaria devono essereSIGN_ONLY, a meno che non si specifichi alcun SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT attributo, anche gli attributi di partizione e ordinamento. SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT

I valori della chiave primaria possono essere beacon firmati. Se hai configurato beacon firmati distinti per ciascuno dei valori della chiave primaria, devi specificare il nome dell'attributo che identifica il valore della chiave primaria come nome del beacon firmato. Tuttavia, AWS Database Encryption SDK non aggiunge il prefisso ai beacon firmati. aws_dbe_b_ Anche se hai configurato beacon firmati distinti per i valori della chiave primaria, devi specificare i nomi degli attributi per i valori della chiave primaria solo quando configuri un indice secondario.

Indici secondari locali

La chiave di ordinamento per un indice secondario locale può essere un beacon.

Se si specifica un beacon per la chiave di ordinamento, il tipo deve essere String. Se specificate un beacon standard o composto per la chiave di ordinamento, dovete includere il aws_dbe_b_ prefisso quando specificate il nome del beacon. Se specificate un faro firmato, specificate il nome del beacon senza alcun prefisso.

Indici secondari globali

Le chiavi di partizione e di ordinamento per un indice secondario globale possono essere entrambe beacon.

Se si specifica un beacon per la chiave di partizione o di ordinamento, il tipo deve essere String. Se specificate un beacon standard o composto per la chiave di ordinamento, dovete includere il aws_dbe_b_ prefisso quando specificate il nome del beacon. Se specificate un faro firmato, specificate il nome del beacon senza alcun prefisso.

Proiezioni di attributi

Una proiezione è l'insieme di attributi copiato da una tabella in un indice secondario. La chiave di partizione e la chiave di ordinamento della tabella vengono sempre proiettati nell'indice; è possibile proiettare altri attributi per supportare i requisiti di query dell'applicazione. DynamoDB offre tre diverse opzioni per le proiezioni KEYS_ONLY degli attributi:,, e. INCLUDE ALL

Se si utilizza la proiezione dell'attributo INCLUDE per cercare su un beacon, è necessario specificare i nomi di tutti gli attributi da cui è costruito il beacon e il nome del beacon con il prefisso. aws_dbe_b_ Ad esempio, se avete configurato un faro composto, from, andcompoundBeacon, dovete specificarefield1, field2field3, e nella proiezione. aws_dbe_b_compoundBeacon field1 field2 field3

Un indice secondario globale può utilizzare solo gli attributi specificati esplicitamente nella proiezione, ma un indice secondario locale può utilizzare qualsiasi attributo.

Test delle uscite dei beacon

Se hai configurato beacon composti o costruito i beacon utilizzando campi virtuali, ti consigliamo di verificare che questi beacon producano l'output previsto prima di popolare la tabella DynamoDB.

Il AWS Database Encryption SDK fornisce il DynamoDbEncryptionTransforms servizio per aiutarti a risolvere i problemi relativi agli output dei campi virtuali e dei beacon compositi.

Il seguente frammento crea elementi di test, definisce il DynamoDbEncryptionTransforms servizio con la configurazione di crittografia della tabella DynamoDB e dimostra come ResolveAttributes utilizzarlo per verificare che il campo virtuale produca l'output previsto.

Java

Guarda l'esempio di codice completo: .java VirtualBeaconSearchableEncryptionExample

// 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

Guarda l'esempio di codice completo: .cs VirtualBeaconSearchableEncryptionExample

// 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");

Il seguente frammento crea un elemento di test, definisce il DynamoDbEncryptionTransforms servizio con la configurazione di crittografia della tabella DynamoDB e dimostra come ResolveAttributes utilizzarlo per verificare che il beacon composto produca l'output previsto.

Java

Guarda l'esempio di codice completo: .java CompoundBeaconSearchableEncryptionExample

// 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

Guarda l'esempio di codice completo: .cs CompoundBeaconSearchableEncryptionExample

// 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