Ejemplo de código para el 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.

Ejemplo de código para el cliente de cifrado de DynamoDB para Java

nota

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 Compatibilidad con las versiones AWS de Database Encryption SDK para DynamoDB.

Los siguientes ejemplos muestran cómo utilizar el cliente de cifrado de DynamoDB para Java para proteger los elementos de tabla de DynamoDB en su aplicación. Puede encontrar más ejemplos (y aportar los suyos propios) en el directorio de ejemplos del aws-dynamodb-encryption-javarepositorio de. GitHub

Usando la D ynamoDBEncryptor

En este ejemplo, se muestra cómo utilizar la D de nivel inferior ynamoDBEncryptor con el KMSproveedor directo. El KMS proveedor directo genera y protege sus materiales criptográficos con un AWS KMS keyin AWS Key Management Service (AWS KMS) que usted especifique.

Puede utilizar cualquier proveedor de materiales criptográficos compatible (CMP) con elDynamoDBEncryptor, y puede utilizar el KMS proveedor directo con el DynamoDBMapper y. AttributeEncryptor

Consulte el ejemplo de código completo: .java AwsKmsEncryptedItem

Paso 1: Crear el proveedor directo KMS

Cree una instancia del AWS KMS cliente con la región especificada. A continuación, utilice la instancia del cliente para crear una instancia del KMS proveedor directo con la que prefiera AWS KMS key.

En este ejemplo, se utiliza el nombre del recurso de Amazon (ARN) para identificar el AWS KMS key, pero se puede utilizar cualquier identificador clave válido.

final String keyArn = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; final String region = "us-west-2"; final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build(); final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, keyArn);
Paso 2: crear un elemento

En este ejemplo, record HashMap se define un elemento de tabla de ejemplo.

final String partitionKeyName = "partition_attribute"; final String sortKeyName = "sort_attribute"; final Map<String, AttributeValue> record = new HashMap<>(); record.put(partitionKeyName, new AttributeValue().withS("value1")); record.put(sortKeyName, new AttributeValue().withN("55")); record.put("example", new AttributeValue().withS("data")); record.put("numbers", new AttributeValue().withN("99")); record.put("binary", new AttributeValue().withB(ByteBuffer.wrap(new byte[]{0x00, 0x01, 0x02}))); record.put("test", new AttributeValue().withS("test-value"));
Paso 3: Crea una D ynamoDBEncryptor

Cree una instancia de DynamoDBEncryptor con el KMS proveedor directo.

final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp);
Paso 4: crear un contexto de cifrado de DynamoDB

El contexto de cifrado de DynamoDB contiene información acerca de la estructura de la tabla y cómo se cifra y se firma. Si utiliza el DynamoDBMapper, el AttributeEncryptor crea el contexto de cifrado automáticamente.

final String tableName = "testTable"; final EncryptionContext encryptionContext = new EncryptionContext.Builder() .withTableName(tableName) .withHashKeyName(partitionKeyName) .withRangeKeyName(sortKeyName) .build();
Paso 5: crear el objeto de acciones de atributo

Las acciones de atributo determinan qué atributos del elemento se cifran y se firman, cuáles solo se firman y cuáles no se cifran o firman.

En Java, para especificar las acciones de los atributos, se crea un par HashMap de pares de nombre y EncryptionFlags valor del atributo.

Por ejemplo, el siguiente código de Java crea un código actions HashMap que cifra y firma todos los atributos record del elemento, excepto los atributos de la clave de partición y la clave de clasificación, que están firmados, pero no cifrados, y el test atributo, que no está firmado ni cifrado.

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: // fall through to the next case case sortKeyName: // Partition and sort keys must not be encrypted, but should be signed actions.put(attributeName, signOnly); break; case "test": // Neither encrypted nor signed break; default: // Encrypt and sign all other attributes actions.put(attributeName, encryptAndSign); break; } }
Paso 6: cifrar y firmar el elemento

Para cifrar y firmar el elemento de tabla, llame al método encryptRecord en la instancia del DynamoDBEncryptor. Especifique el elemento de tabla (record), las acciones de atributo (actions) y el contexto de cifrado (encryptionContext).

final Map<String, AttributeValue> encrypted_record = encryptor.encryptRecord(record, actions, encryptionContext);
Paso 7: colocar el elemento en la tabla de DynamoDB

Finalmente, coloque el elemento cifrado y firmado en la tabla de DynamoDB.

final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.defaultClient(); ddb.putItem(tableName, encrypted_record);

Usando la D ynamoDBMapper

En el siguiente ejemplo, se muestra cómo utilizar la clase auxiliar de mapeadores de DynamoDB con Direct Provider. KMS El KMS proveedor directo genera y protege sus materiales criptográficos con un AWS KMS keyin AWS Key Management Service ()AWS KMS que usted especifique.

Puede usar cualquier proveedor de materiales criptográficos compatible (CMP) con el nivel inferior DynamoDBMapper y puede usar el KMS proveedor directo con el nivel inferior. DynamoDBEncryptor

Consulte el ejemplo de código completo: .java AwsKmsEncryptedObject

Paso 1: Crear el proveedor directo KMS

Cree una instancia del AWS KMS cliente con la región especificada. A continuación, utilice la instancia del cliente para crear una instancia del KMS proveedor directo con la que prefiera AWS KMS key.

En este ejemplo, se utiliza el nombre del recurso de Amazon (ARN) para identificar el AWS KMS key, pero se puede utilizar cualquier identificador clave válido.

final String keyArn = "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"; final String region = "us-west-2"; final AWSKMS kms = AWSKMSClientBuilder.standard().withRegion(region).build(); final DirectKmsMaterialProvider cmp = new DirectKmsMaterialProvider(kms, keyArn);
Paso 2: Cree el cifrador de DynamoDB y D ynamoDBMapper

Utilice el KMS proveedor directo que creó en el paso anterior para crear una instancia de DynamoDB Encryptor. Debe crear instancias en el Encriptador de DynamoDB de nivel inferior para utilizar DynamoDB Mapper.

A continuación, cree una instancia de base de datos de DynamoDB y una configuración de mapeador, y úselas para crear una instancia de DynamoDB Mapper.

importante

Al utilizar el DynamoDBMapper para añadir o editar elementos firmados (o cifrados y firmados), configúrelo para usar un comportamiento de almacenamiento, como PUT, que incluye todos los atributos, como se muestra en el ejemplo siguiente. De lo contrario, es posible que no pueda descifrar los datos.

final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp) final AmazonDynamoDB ddb = AmazonDynamoDBClientBuilder.standard().withRegion(region).build(); DynamoDBMapperConfig mapperConfig = DynamoDBMapperConfig.builder().withSaveBehavior(SaveBehavior.PUT).build(); DynamoDBMapper mapper = new DynamoDBMapper(ddb, mapperConfig, new AttributeEncryptor(encryptor));
Paso 3: Definir la tabla de DynamoDB

A continuación, defina la tabla de DynamoDB. Utilice anotaciones para especificar las acciones del atributo. En este ejemplo, se crea una tabla de DynamoDB, ExampleTable, y una clase DataPoJo que representa elementos de la tabla.

En este ejemplo de tabla, los atributos de clave principal se firmarán, pero no se cifrarán. Esto se aplica al partition_attribute, que se ha anotado con @DynamoDBHashKey, y el sort_attribute, que se ha anotado con @DynamoDBRangeKey.

Los atributos que son anotados con @DynamoDBAttribute, como some numbers, se cifrarán y firmarán. Las excepciones son atributos que utilizan las anotaciones de cifrado @DoNotEncrypt (solo firmar) o @DoNotTouch (no cifrar ni firmar) definidas por el cliente de cifrado de DynamoDB. Por ejemplo, ya que el atributo leave me tiene una anotación @DoNotTouch, no se cifrará ni se firmará.

@DynamoDBTable(tableName = "ExampleTable") public static final class DataPoJo { private String partitionAttribute; private int sortAttribute; private String example; private long someNumbers; private byte[] someBinary; private String leaveMe; @DynamoDBHashKey(attributeName = "partition_attribute") public String getPartitionAttribute() { return partitionAttribute; } public void setPartitionAttribute(String partitionAttribute) { this.partitionAttribute = partitionAttribute; } @DynamoDBRangeKey(attributeName = "sort_attribute") public int getSortAttribute() { return sortAttribute; } public void setSortAttribute(int sortAttribute) { this.sortAttribute = sortAttribute; } @DynamoDBAttribute(attributeName = "example") public String getExample() { return example; } public void setExample(String example) { this.example = example; } @DynamoDBAttribute(attributeName = "some numbers") public long getSomeNumbers() { return someNumbers; } public void setSomeNumbers(long someNumbers) { this.someNumbers = someNumbers; } @DynamoDBAttribute(attributeName = "and some binary") public byte[] getSomeBinary() { return someBinary; } public void setSomeBinary(byte[] someBinary) { this.someBinary = someBinary; } @DynamoDBAttribute(attributeName = "leave me") @DoNotTouch public String getLeaveMe() { return leaveMe; } public void setLeaveMe(String leaveMe) { this.leaveMe = leaveMe; } @Override public String toString() { return "DataPoJo [partitionAttribute=" + partitionAttribute + ", sortAttribute=" + sortAttribute + ", example=" + example + ", someNumbers=" + someNumbers + ", someBinary=" + Arrays.toString(someBinary) + ", leaveMe=" + leaveMe + "]"; } }
Paso 4: Cifrar y guardar un elemento de la tabla

Ahora, al crear un elemento de tabla y utilizar DynamoDB Mapper para guardarlo, el elemento se cifra automáticamente y firma antes de que se agregue a la tabla.

Este ejemplo define un elemento de tabla llamado record. Antes de que se guarde en la tabla, sus atributos se cifran y firman en función de las anotaciones de la clase DataPoJo. En este caso, todos los atributos salvo PartitionAttribute, SortAttribute y LeaveMe se cifran y se firman. PartitionAttribute y SortAttributes solo se firman. El atributo LeaveMe no está cifrado o firmado.

Para cifrar y firmar el elemento recordy, a continuación, añadirlo a ExampleTable, llame al método save de la clase DynamoDBMapper. Dado que el DynamoDB mapper está configurado para utilizar el PUT comportamiento de almacenamiento, el elemento sustituye a cualquier elemento con las mismas claves principales, en lugar de actualizarla. De este modo, se garantiza que las firmas coincidan y puede descifrar el elemento cuando se obtiene de la tabla.

DataPoJo record = new DataPoJo(); record.setPartitionAttribute("is this"); record.setSortAttribute(55); record.setExample("data"); record.setSomeNumbers(99); record.setSomeBinary(new byte[]{0x00, 0x01, 0x02}); record.setLeaveMe("alone"); mapper.save(record);