Uso del cliente de cifrado de DynamoDB para Java - 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.

Uso del cliente de cifrado de DynamoDB para Java

nota

El nombre de nuestra biblioteca de cifrado del lado del cliente pasó a llamarse Database Encryption. AWS SDK En el siguiente tema, se presenta información sobre las versiones 1.x—2.x del cliente de cifrado de DynamoDB para Java y versiones 1.x—3.x del cliente de cifrado de DynamoDB para Python. Para obtener más información, consulte Cifrado AWS de bases de datos SDK para compatibilidad con las versiones de DynamoDB.

En este tema, se explican algunas de las características del cliente de cifrado de DynamoDB en Java que podrían no encontrarse en otras implementaciones de lenguaje de programación.

Para obtener más información sobre la programación con el cliente de cifrado de DynamoDB, consulte los ejemplos de Java, los ejemplos de GitHub on y el Javadoc aws-dynamodb-encryption-java repository del cliente de cifrado de DynamoDB.

Cifradores de elementos: y D AttributeEncryptor ynamoDBEncryptor

El cliente de cifrado de DynamoDB en Java tiene dos cifradores de elementos: el nivel inferior D y el. ynamoDBEncryptor AttributeEncryptor

AttributeEncryptorEs una clase auxiliar que le ayuda a utilizar la D AWS SDK for Java con ynamoDBMapper la del cliente de cifrado DynamoDB Encryptor de DynamoDB. Cuando utiliza el AttributeEncryptor con el DynamoDBMapper, cifra y firma de forma transparente los elementos cuando los guarda. También verifica y descifra de forma transparente los elementos al cargarlos.

Configuración del comportamiento de almacenamiento

Puede usar el AttributeEncryptor y DynamoDBMapper para agregar o editar elementos de la tabla con atributos que solo están firmados o que están cifrados y firmados. Para estas tareas, recomendamos que lo configure para que use el comportamiento de guardado PUT, tal como se muestra en el siguiente ejemplo. De lo contrario, es posible que no pueda descifrar los datos.

DynamoDBMapperConfig mapperConfig = DynamoDBMapperConfig.builder().withSaveBehavior(SaveBehavior.PUT).build(); DynamoDBMapper mapper = new DynamoDBMapper(ddb, mapperConfig, new AttributeEncryptor(encryptor));

Si utiliza el comportamiento de almacenamiento predeterminado, que actualiza los atributos en el elemento de la tabla, solo se incluyen en la firma atributos que se hayan cambiado. Como resultado, en las lecturas posteriores de todos los atributos, la firma no se validará, porque no incluye los atributos no modelados.

También puede utilizar el comportamiento de guardado CLOBBER. Este comportamiento es idéntico al comportamiento de guardado PUT, pero deshabilita el bloqueo positivo y sobrescribe el elemento en la tabla.

Para evitar errores de firma, el cliente de cifrado de DynamoDB lanza una excepción de tiempo de ejecución si se utiliza un AttributeEncryptor con un DynamoDBMapper que no está configurado con un comportamiento seguro de CLOBBER o PUT.

Para ver este código utilizado en un ejemplo, consulte Usando la D ynamoDBMapper y el ejemplo de AwsKmsEncryptedObject.java en el repositorio de. aws-dynamodb-encryption-java GitHub

Acciones de atributo en Java

Las acciones de atributo determinan qué valores de atributo se cifran y se firman, cuáles solo se firman y cuáles se omiten. El método que utilice para especificar las acciones de los atributos depende de si utiliza la D DynamoDBMapper y AttributeEncryptor o la D de nivel inferior. ynamoDBEncryptor

importante

Después de utilizar las acciones de atributo para cifrar los elementos de la tabla, agregar o quitar atributos del modelo de datos puede provocar un error de validación de firma que le impide descifrar los datos. Para ver una explicación detallada, consulte Cambiar el modelo de datos.

Cuando utilice DynamoDBMapper y AttributeEncryptor, utilice anotaciones para especificar las acciones de atributos. El cliente de cifrado de DynamoDB utiliza las anotaciones de atributo estándar que definen el tipo de atributo para determinar cómo proteger un atributo. De forma predeterminada, todos los atributos están cifrados y firmados, excepto las claves principales, que están firmadas, pero no cifradas.

nota

No cifre el valor de los atributos con la anotación @D ynamoDBVersion Attribute, aunque puede (y debe) firmarlos. De lo contrario, las condiciones que utilizan su valor tendrán efectos no previstos.

// Attributes are encrypted and signed @DynamoDBAttribute(attributeName="Description") // Partition keys are signed but not encrypted @DynamoDBHashKey(attributeName="Title") // Sort keys are signed but not encrypted @DynamoDBRangeKey(attributeName="Author")

Para especificar las excepciones, utilice las anotaciones de cifrado que se definen en el cliente de cifrado de DynamoDB para Java. Si las especifica en el nivel de clase, se convierten en el valor predeterminado para la clase.

// Sign only @DoNotEncrypt // Do nothing; not encrypted or signed @DoNotTouch

Por ejemplo, estas anotaciones firman pero no cifran el atributo PublicationYear y no cifran o firman el valor del atributo ISBN.

// Sign only (override the default) @DoNotEncrypt @DynamoDBAttribute(attributeName="PublicationYear") // Do nothing (override the default) @DoNotTouch @DynamoDBAttribute(attributeName="ISBN")

Para especificar las acciones de los atributos cuando utilice la D ynamoDBEncryptor directamente, cree un HashMap objeto en el que los pares nombre-valor representen los nombres de los atributos y las acciones especificadas.

Los valores válidos para las acciones de atributo que se definen en el tipo enumerado EncryptionFlags. Puede utilizar ENCRYPT y SIGN juntos, usar SIGN solo u omitir ambos. Sin embargo, si usa ENCRYPT solo, el cliente de cifrado de DynamoDB generará un error. No puede cifrar un atributo que no firme.

ENCRYPT SIGN
aviso

No cifre los atributos de clave principal. Deben permanecer en texto no cifrado para que DynamoDB pueda encontrar el elemento sin realizar un examen completo de la tabla.

Si especifica una clave principal en el contexto de cifrado y, a continuación, especifica ENCRYPT en la acción de atributo para alguno de los atributos de clave principal, el cliente de cifrado de DynamoDB genera una excepción.

Por ejemplo, el siguiente código Java crea un código actions HashMap que cifra y firma todos los atributos del elemento. record Las excepciones son la clave de partición y los atributos de clave de clasificación, que se firman pero no se cifran, y el atributo test, que ni se signa ni se cifra.

final EnumSet<EncryptionFlags> signOnly = EnumSet.of(EncryptionFlags.SIGN); final EnumSet<EncryptionFlags> encryptAndSign = EnumSet.of(EncryptionFlags.ENCRYPT, EncryptionFlags.SIGN); final Map<String, Set<EncryptionFlags>> actions = new HashMap<>(); for (final String attributeName : record.keySet()) { switch (attributeName) { case partitionKeyName: // no break; falls through to next case case sortKeyName: // Partition and sort keys must not be encrypted, but should be signed actions.put(attributeName, signOnly); break; case "test": // Don't encrypt or sign break; default: // Encrypt and sign everything else actions.put(attributeName, encryptAndSign); break; } }

A continuación, cuando llame al encryptRecordmétodo delDynamoDBEncryptor, especifique el mapa como el valor del attributeFlags parámetro. Por ejemplo, esta llamada a encryptRecord utiliza el mapa actions.

// Encrypt the plaintext record final Map<String, AttributeValue> encrypted_record = encryptor.encryptRecord(record, actions, encryptionContext);

Reemplazar nombres de tabla

En el cliente de cifrado de DynamoDB, el nombre de la tabla de DynamoDB es un elemento del contexto de cifrado de DynamoDB que se pasa a los métodos de cifrado y descifrado. Al cifrar o firmar elementos de la tabla, el contexto de cifrado de DynamoDB, incluido el nombre de la tabla, está enlazado criptográficamente al texto cifrado. Si el contexto de cifrado de DynamoDB que se pasa al método de descifrado no coincide con el contexto de cifrado de DynamoDB que se pasó al método de cifrado, se produce un error en la operación de descifrado.

Ocasionalmente, el nombre de una tabla cambia, por ejemplo, cuando se hace una copia de seguridad de una tabla o se realiza una point-in-time recuperación. Al descifrar o verificar la firma de estos elementos, debe pasar el mismo contexto de cifrado de DynamoDB que se utilizó para cifrar y firmar los elementos, incluido el nombre de la tabla original. El nombre de la tabla actual no es necesario.

Cuando se utiliza DynamoDBEncryptor, se ensambla el contexto de cifrado de DynamoDB manualmente. Sin embargo, si está utilizando DynamoDBMapper, el AttributeEncryptor crea el contexto de cifrado de DynamoDB para usted, incluido el nombre de la tabla actual. Para indicar a AttributeEncryptor que cree un contexto de cifrado con un nombre de tabla diferente, utilice el EncryptionContextOverrideOperator.

Por ejemplo, el código siguiente crea instancias del proveedor de materiales criptográficos (CMP) y delDynamoDBEncryptor. Luego llama al método setEncryptionContextOverrideOperator de DynamoDBEncryptor. Utiliza el operador overrideEncryptionContextTableName, que anula un nombre de tabla. Cuando se configura de esta manera, el AttributeEncryptor crea un contexto de cifrado de DynamoDB que incluye newTableName en lugar de oldTableName. Para ver un ejemplo completo, consulte EncryptionContextOverridesWithDynamoDBMapper.java.

final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, keyArn); final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp); encryptor.setEncryptionContextOverrideOperator(EncryptionContextOperators.overrideEncryptionContextTableName( oldTableName, newTableName));

Cuando se llama al método de carga de DynamoDBMapper, que descifra y verifica el elemento, se especifica el nombre de la tabla original.

mapper.load(itemClass, DynamoDBMapperConfig.builder() .withTableNameOverride(DynamoDBMapperConfig.TableNameOverride.withTableNameReplacement(oldTableName)) .build());

También puede utilizar el operador overrideEncryptionContextTableNameUsingMap, que anula varios nombres de tabla.

Normalmente los operadores de reemplazo de nombres de tabla se utilizan al descifrar datos y verificar firmas. Sin embargo, puede usarlos para establecer el nombre de la tabla en el contexto de cifrado de DynamoDB en un valor diferente al cifrar y firmar.

No utilice los operadores de anulación de nombre de tabla si está utilizando DynamoDBEncryptor. En su lugar, cree un contexto de cifrado con el nombre de la tabla original y envíelo al método de descifrado.