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
Usando la D ynamoDBEncryptor
En este ejemplo, se muestra cómo utilizar la D
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
, elAttributeEncryptor
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 atributosrecord
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 eltest
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 delDynamoDBEncryptor
. 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, comoPUT
, 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 claseDataPoJo
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 elsort_attribute
, que se ha anotado con@DynamoDBRangeKey
.Los atributos que son anotados con
@DynamoDBAttribute
, comosome 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 atributoleave 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 claseDataPoJo
. En este caso, todos los atributos salvoPartitionAttribute
,SortAttribute
yLeaveMe
se cifran y se firman.PartitionAttribute
ySortAttributes
solo se firman. El atributoLeaveMe
no está cifrado o firmado.Para cifrar y firmar el elemento
record
y, a continuación, añadirlo aExampleTable
, llame al métodosave
de la claseDynamoDBMapper
. Dado que el DynamoDB mapper está configurado para utilizar elPUT
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);