Durchsuchbare Verschlüsselung in DynamoDB - AWS Datenbankverschlüsselung SDK

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Durchsuchbare Verschlüsselung in DynamoDB

Um Ihre Amazon DynamoDB-Tabellen für durchsuchbare Verschlüsselung zu konfigurieren, müssen Sie den AWS KMS hierarchischen Schlüsselbund verwenden, um die Datenschlüssel zu generieren, zu verschlüsseln und zu entschlüsseln, die zum Schutz Ihrer Elemente verwendet werden. Sie müssen den auch in Ihre Tabellenverschlüsselungskonfiguration einbeziehen. SearchConfig

Anmerkung

Wenn Sie die clientseitige Java-Verschlüsselungsbibliothek für DynamoDB verwenden, müssen Sie das AWS Low-Level-Datenbankverschlüsselungs-SDK für DynamoDB-API verwenden, um Ihre Tabellenelemente zu verschlüsseln, zu signieren, zu verifizieren und zu entschlüsseln. Der DynamoDB Enhanced Client und niedrigere Versionen unterstützen DynamoDBItemEncryptor keine durchsuchbare Verschlüsselung.

Konfiguration sekundärer Indizes mit Beacons

Nachdem Sie Ihre Beacons konfiguriert haben, müssen Sie einen sekundären Index konfigurieren, der jeden Beacon widerspiegelt, bevor Sie nach den verschlüsselten Attributen suchen können.

Wenn Sie einen Standard- oder Verbundbeacon konfigurieren, fügt das AWS Database Encryption SDK dem Beacon-Namen das aws_dbe_b_ Präfix hinzu, sodass der Server Beacons leicht identifizieren kann. Wenn Sie beispielsweise einen zusammengesetzten Beacon benennencompoundBeacon, lautet der vollständige Beacon-Name tatsächlich. aws_dbe_b_compoundBeacon Wenn Sie Sekundärindizes konfigurieren möchten, die einen Standard- oder Verbundbeacon enthalten, müssen Sie bei der Identifizierung des Beacon-Namens das aws_dbe_b_ Präfix angeben.

Schlüssel partitionieren und sortieren

Sie können Primärschlüsselwerte nicht verschlüsseln. Ihre Partitions- und Sortierschlüssel müssen signiert sein. Ihre Primärschlüsselwerte können kein Standard- oder Verbundbeacon sein.

Ihre Primärschlüsselwerte müssenSIGN_ONLY, sofern Sie keine SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT Attribute angeben, auch die Partitions- und Sortierattribute seinSIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT.

Ihre Primärschlüsselwerte können signierte Beacons sein. Wenn Sie für jeden Ihrer Primärschlüsselwerte unterschiedliche signierte Beacons konfiguriert haben, müssen Sie den Attributnamen, der den Primärschlüsselwert identifiziert, als signierten Beacon-Namen angeben. Das AWS Database Encryption SDK fügt das aws_dbe_b_ Präfix jedoch nicht zu signierten Beacons hinzu. Selbst wenn Sie unterschiedliche signierte Beacons für Ihre Primärschlüsselwerte konfiguriert haben, müssen Sie bei der Konfiguration eines Sekundärindexes nur die Attributnamen für die Primärschlüsselwerte angeben.

Lokale sekundäre Indizes

Der Sortierschlüssel für einen lokalen Sekundärindex kann ein Beacon sein.

Wenn Sie einen Beacon für den Sortierschlüssel angeben, muss der Typ String sein. Wenn Sie einen Standard- oder Verbundbeacon für den Sortierschlüssel angeben, müssen Sie das aws_dbe_b_ Präfix angeben, wenn Sie den Beacon-Namen angeben. Wenn Sie einen signierten Beacon angeben, geben Sie den Beacon-Namen ohne Präfix an.

Globale sekundäre Indizes

Sowohl die Partitions- als auch die Sortierschlüssel für einen globalen sekundären Index können Beacons sein.

Wenn Sie einen Beacon für die Partition oder den Sortierschlüssel angeben, muss der Typ String sein. Wenn Sie einen Standard- oder Verbundbeacon für den Sortierschlüssel angeben, müssen Sie das aws_dbe_b_ Präfix angeben, wenn Sie den Beacon-Namen angeben. Wenn Sie einen signierten Beacon angeben, geben Sie den Beacon-Namen ohne Präfix an.

Attributprojektionen

Eine Projektion ist der Satz von Attributen, die aus einer Tabelle in einen sekundären Index kopiert werden. Der Partitionsschlüssel und der Sortierschlüssel der Tabelle werden immer in den Index projiziert. Sie können andere Attribute projizieren, um die Abfrageanforderungen Ihrer Anwendung zu unterstützen. DynamoDB bietet drei verschiedene Optionen für Attributprojektionen: KEYS_ONLYINCLUDE, und. ALL

Wenn Sie die INCLUDE-Attributprojektion verwenden, um auf einem Beacon zu suchen, müssen Sie die Namen für alle Attribute angeben, aus denen das Beacon aufgebaut ist, sowie den Beacon-Namen mit dem Präfix. aws_dbe_b_ Wenn Sie beispielsweise einen Verbundbeacon,, von, compoundBeacon und konfiguriert haben field1field2, müssen Siefield3,, und in der aws_dbe_b_compoundBeacon field1 Projektion field2 angeben. field3

Ein globaler sekundärer Index kann nur die in der Projektion explizit angegebenen Attribute verwenden, ein lokaler sekundärer Index kann jedoch jedes beliebige Attribut verwenden.

Testen der Beacon-Ausgaben

Wenn Sie zusammengesetzte Beacons konfiguriert oder Ihre Beacons mithilfe virtueller Felder erstellt haben, empfehlen wir, zu überprüfen, ob diese Beacons die erwartete Ausgabe erzeugen, bevor Sie Ihre DynamoDB-Tabelle füllen.

Das AWS Database Encryption SDK bietet den DynamoDbEncryptionTransforms Service, der Sie bei der Fehlerbehebung bei der Ausgabe virtueller Felder und zusammengesetzter Beacons unterstützt.

Der folgende Ausschnitt erstellt Testelemente, definiert den DynamoDbEncryptionTransforms Dienst mit der DynamoDB-Tabellenverschlüsselungskonfiguration und zeigt, wie überprüft werden kann, ob das virtuelle Feld die erwartete Ausgabe erzeugt. ResolveAttributes

Java

Sehen Sie sich das vollständige Codebeispiel an: .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

Sehen Sie sich das vollständige Codebeispiel an: .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");

Der folgende Ausschnitt erstellt ein Testelement, definiert den DynamoDbEncryptionTransforms Dienst mit der DynamoDB-Tabellenverschlüsselungskonfiguration und zeigt, wie überprüft werden kann, ob der Compound Beacon die erwartete Ausgabe erzeugt. ResolveAttributes

Java

Sehen Sie sich das vollständige Codebeispiel an: .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

Sehen Sie sich das vollständige Codebeispiel an: .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