Codice di esempio per il client di crittografia DynamoDB per Java - AWS Crittografia database SDK

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Codice di esempio per il client di crittografia DynamoDB per Java

Nota

La nostra libreria di crittografia lato client è stata rinominata Database Encryption. AWS SDK Il seguente argomento fornisce informazioni sulle versioni 1. x —2. x del DynamoDB Encryption Client for Java e versioni 1. x —3. x del client di crittografia DynamoDB per Python. Per ulteriori informazioni, consulta AWS Database Encryption SDK for DynamoDB version support.

Gli esempi seguenti mostrano come utilizzare il DynamoDB Encryption Client for Java per proteggere gli elementi della tabella DynamoDB nell'applicazione. Puoi trovare altri esempi (e contribuire con i tuoi) nella directory examples del repository su. aws-dynamodb-encryption-java GitHub

Usando il D ynamoDBEncryptor

Questo esempio mostra come utilizzare il D di livello inferiore ynamoDBEncryptor con Direct KMS Provider. Il Direct KMS Provider genera e protegge i suoi materiali crittografici con un AWS KMS keyin AWS Key Management Service (AWS KMS) specificato dall'utente.

Puoi utilizzare qualsiasi fornitore di materiali crittografici compatibile (CMP) conDynamoDBEncryptor, e puoi utilizzare Direct KMS Provider con and. DynamoDBMapper AttributeEncryptor

Guarda l'esempio di codice completo: .java AwsKmsEncryptedItem

Fase 1: Creare il Direct Provider KMS

Crea un'istanza del AWS KMS client con la regione specificata. Quindi, usa l'istanza del client per creare un'istanza del Direct KMS Provider con la tua preferita AWS KMS key.

Questo esempio utilizza Amazon Resource Name (ARN) per identificare AWS KMS key, ma puoi utilizzare qualsiasi identificatore di chiave valido.

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);
Fase 2: creazione di un item

Questo esempio definisce un elemento record HashMap che rappresenta un elemento di tabella di esempio.

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"));
Fase 3: Creare un D ynamoDBEncryptor

Crea un'istanza di DynamoDBEncryptor con il Direct KMS Provider.

final DynamoDBEncryptor encryptor = DynamoDBEncryptor.getInstance(cmp);
Fase 4: Creare un contesto di crittografia DynamoDB

Il contesto di crittografia DynamoDB contiene informazioni sulla struttura della tabella e su come viene crittografata e firmata. Se utilizzi il componente DynamoDBMapper, il componente AttributeEncryptor crea il contesto di crittografia per tuo conto.

final String tableName = "testTable"; final EncryptionContext encryptionContext = new EncryptionContext.Builder() .withTableName(tableName) .withHashKeyName(partitionKeyName) .withRangeKeyName(sortKeyName) .build();
Fase 5: creazione dell'oggetto delle operazioni di attributo.

Le operazioni di attributo determinano quali attributi dell'item sono crittografati e firmati, quali solo firmati e quali non sono né crittografati né firmati.

In Java, per specificare le azioni relative agli attributi, si crea una serie HashMap di coppie di nomi e EncryptionFlags valori degli attributi.

Ad esempio, il codice Java seguente crea un codice actions HashMap che crittografa e firma tutti gli attributi dell'recordelemento, ad eccezione della chiave di partizione e degli attributi della chiave di ordinamento, che sono firmati ma non crittografati, e dell'testattributo, che non è firmato o crittografato.

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; } }
Fase 6: crittografia e firma dell'item

Per crittografare e firmare l'item della tabella, chiama il metodo encryptRecord nell'istanza del componente DynamoDBEncryptor. Specifica l'item della tabella (record), le operazioni di attributo (actions) e il contesto di crittografia (encryptionContext).

final Map<String, AttributeValue> encrypted_record = encryptor.encryptRecord(record, actions, encryptionContext);
Fase 7: Inserire l'elemento nella tabella DynamoDB

Infine, inserisci l'elemento crittografato e firmato nella tabella DynamoDB.

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

Usando il D ynamoDBMapper

L'esempio seguente mostra come utilizzare la classe helper mapper DynamoDB con Direct Provider. KMS Il Direct KMS Provider genera e protegge i suoi materiali crittografici con un AWS KMS keyin AWS Key Management Service ()AWS KMS specificato dall'utente.

È possibile utilizzare qualsiasi fornitore di materiali crittografici compatibile (CMP) con e Direct KMS Provider con il livello inferiore. DynamoDBMapper DynamoDBEncryptor

Guarda l'esempio di codice completo: .java AwsKmsEncryptedObject

Fase 1: Creare il Direct Provider KMS

Crea un'istanza del AWS KMS client con la regione specificata. Quindi, usa l'istanza del client per creare un'istanza del Direct KMS Provider con la tua preferita AWS KMS key.

Questo esempio utilizza Amazon Resource Name (ARN) per identificare AWS KMS key, ma puoi utilizzare qualsiasi identificatore di chiave valido.

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);
Fase 2: Creare DynamoDB Encryptor e D ynamoDBMapper

Utilizza il Direct KMS Provider creato nel passaggio precedente per creare un'istanza di DynamoDB Encryptor. È necessario creare un'istanza del DynamoDB Encryptor di livello inferiore per utilizzare DynamoDB Mapper.

Successivamente, crea un'istanza del database DynamoDB e una configurazione mapper e usale per creare un'istanza del DynamoDB Mapper.

Importante

Quando utilizzi DynamoDBMapper per aggiungere o modificare item firmati (oppure crittografati e firmati), configuralo per utilizzare un comportamento di salvataggio, ad esempio PUT, che includa tutti gli attributi, come mostrato nel seguente esempio. In caso contrario, potresti non riuscire a decrittografare i dati.

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));
Fase 3: Definizione della tabella DynamoDB

Successivamente, definisci la tua tabella DynamoDB. Per specificare le operazioni di attributo, utilizza le annotazioni. Questo esempio crea una tabella DynamoDB e DataPoJo una classe che rappresenta gli elementi della tabellaExampleTable.

In questo esempio, gli attributi della chiave primaria saranno firmati ma non crittografati. Ciò vale per l'attributo partition_attribute, che viene annotato con @DynamoDBHashKey, e per l'attributo sort_attribute, che viene annotato con @DynamoDBRangeKey.

Gli attributi annotati con @DynamoDBAttribute, ad esempio some numbers, saranno crittografati e firmati. Le eccezioni sono gli attributi che utilizzano le annotazioni di crittografia @DoNotEncrypt (solo firma) o @DoNotTouch (non crittografare o firmare) definite dal DynamoDB Encryption Client. Ad esempio, poiché l'attributo leave me ha un'annotazione @DoNotTouch, non sarà crittografato né firmato.

@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 + "]"; } }
Fase 4: crittografia e salvataggio di un item della tabella

Ora, quando si crea un elemento della tabella e si utilizza DynamoDB Mapper per salvarlo, l'elemento viene automaticamente crittografato e firmato prima di essere aggiunto alla tabella.

In questo esempio viene definito un item della tabella denominato record. Prima che venga salvato nella tabella, i suoi attributi vengono crittografati e firmati in base alle annotazioni nella classe DataPoJo. In questo caso, tutti gli attributi eccetto PartitionAttribute, SortAttribute e LeaveMe sono crittografati e firmati. PartitionAttribute e SortAttributes sono solo firmati. L'attributo LeaveMe non è crittografato né firmato.

Per crittografare e firmare l'item record e aggiungerlo alla tabella ExampleTable, chiama il metodo save della classe DynamoDBMapper. Poiché DynamoDB Mapper è configurato per utilizzare PUT il comportamento di salvataggio, l'elemento sostituisce qualsiasi elemento con le stesse chiavi primarie, anziché aggiornarlo. In questo modo le firme corrispondono ed è possibile decrittografare l'item quando si ottiene dalla tabella.

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);