Cifrado con capacidad de búsqueda en DynamoDB - AWS Cifrado de bases SDK

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Cifrado con capacidad de búsqueda en DynamoDB

Para configurar las tablas de Amazon DynamoDB para el cifrado con capacidad de búsqueda, debe utilizar el conjunto de claves de AWS KMS jerárquico para generar, cifrar y descifrar las claves de datos utilizadas para proteger los elementos. También debe incluir SearchConfigen la configuración de cifrado de la tabla.

nota

Si utiliza la biblioteca de cifrado del lado del cliente de Java para DynamoDB, debe utilizar el SDK de cifrado de AWS bases de datos de bajo nivel para la API de DynamoDB para cifrar, firmar, verificar y descifrar los elementos de la tabla. El cliente mejorado de DynamoDB y los DynamoDBItemEncryptor niveles inferiores no admiten el cifrado con capacidad de búsqueda.

Configurar índices secundarios con balizas

Después de configurar las balizas, debe configurar un índice secundario que refleje cada baliza antes de poder buscar en los atributos cifrados.

Al configurar una baliza estándar o compuesta, el SDK de cifrado de AWS bases de datos añade el aws_dbe_b_ prefijo al nombre de la baliza para que el servidor pueda identificarlas fácilmente. Por ejemplo, si nombra una baliza compuestacompoundBeacon, el nombre completo de la baliza es realmente. aws_dbe_b_compoundBeacon Si desea configurar índices secundarios que incluyan una baliza estándar o compuesta, debe incluir el aws_dbe_b_ prefijo al identificar el nombre de la baliza.

Claves de partición y claves de clasificación

No puede cifrar los valores de la clave principal. Las claves de partición y clasificación deben estar firmadas. Sus valores de la clave principal no pueden ser una baliza estándar o compuesta.

Los valores de las claves principales deben serSIGN_ONLY, a menos que especifique algún SIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT atributo, los atributos de partición y ordenación también deben serloSIGN_AND_INCLUDE_IN_ENCRYPTION_CONTEXT.

Sus valores de la clave principal pueden ser balizas firmadas. Si ha configurado balizas firmadas distintas para cada uno de los valores de la clave principal, debe especificar el nombre del atributo que identifica el valor de la clave principal como el nombre de la baliza firmada. Sin embargo, el SDK AWS de cifrado de bases de datos no añade el aws_dbe_b_ prefijo a las balizas firmadas. Aunque haya configurado balizas firmadas distintas para los valores de la clave principal, solo tendrá que especificar los nombres de los atributos de los valores de la clave principal al configurar un índice secundario.

Índices secundarios locales

La clave de clasificación de un índice secundario local puede ser una baliza.

Si especifica una baliza para la clave de clasificación, el tipo debe ser Cadena. Si especifica una baliza estándar o compuesta para la clave de clasificación, debe incluir el aws_dbe_b_ prefijo al especificar el nombre de la baliza. Si especifica una baliza firmada, especifique el nombre de la baliza sin ningún prefijo.

Índices secundarios globales

Tanto la partición como las claves de clasificación de un índice secundario global pueden ser balizas.

Si especifica un indicador para la partición o la clave de clasificación, el tipo debe ser Cadena. Si especifica una baliza estándar o compuesta para la clave de clasificación, debe incluir el prefijo aws_dbe_b_ al especificar el nombre de la baliza. Si especifica una baliza firmada, especifique el nombre de la baliza sin ningún prefijo.

Proyecciones de atributos

Una proyección es el conjunto de atributos que se copia de una tabla en un índice secundario. La clave de partición y la clave de clasificación de la tabla siempre se proyectan en el índice; puede proyectar otros atributos para admitir los requisitos de consulta de la aplicación. DynamoDB ofrece tres opciones diferentes para las proyecciones de atributosKEYS_ONLY:INCLUDE, y. ALL

Si utiliza la proyección de atributos INCLUDE para buscar en una baliza, debe especificar los nombres de todos los atributos a partir de los que se construye la baliza y el nombre de la baliza con el aws_dbe_b_ prefijo. Por ejemplo, si ha configurado una baliza compuestacompoundBeacon, desde field1field2, yfield3, debe especificaraws_dbe_b_compoundBeacon, field1field2, y field3 en la proyección.

Un índice secundario global solo puede usar los atributos especificados explícitamente en la proyección, pero un índice secundario local puede usar cualquier atributo.

Probando las salidas de balizas

Si configuró balizas compuestas o construyó las balizas mediante campos virtuales, le recomendamos comprobar que estas balizas producen el resultado esperado antes de rellenar la tabla de DynamoDB.

El SDK de cifrado AWS de bases de datos proporciona el DynamoDbEncryptionTransforms servicio que le ayuda a solucionar los problemas de las salidas de balizas compuestas y de campo virtual.

En el siguiente fragmento se crean elementos de prueba, se define el DynamoDbEncryptionTransforms servicio con la configuración de cifrado de tablas de DynamoDB y se muestra cómo utilizarlos ResolveAttributes para comprobar que el campo virtual produce el resultado esperado.

Java

Consulte el ejemplo de código 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

Consulte el ejemplo de código 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");

En el siguiente fragmento se crea un elemento de prueba, se define el DynamoDbEncryptionTransforms servicio con la configuración de cifrado de la tabla de DynamoDB y se muestra cómo se utiliza ResolveAttributes para comprobar que la baliza compuesta produce el resultado esperado.

Java

Consulte el ejemplo de código 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

Consulte el ejemplo de código 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