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
Usando il D ynamoDBEncryptor
Questo esempio mostra come utilizzare il D
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 componenteAttributeEncryptor
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'record
elemento, ad eccezione della chiave di partizione e degli attributi della chiave di ordinamento, che sono firmati ma non crittografati, e dell'test
attributo, 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 componenteDynamoDBEncryptor
. 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 esempioPUT
, 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'attributosort_attribute
, che viene annotato con@DynamoDBRangeKey
.Gli attributi annotati con
@DynamoDBAttribute
, ad esempiosome 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'attributoleave 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 classeDataPoJo
. In questo caso, tutti gli attributi eccettoPartitionAttribute
,SortAttribute
eLeaveMe
sono crittografati e firmati.PartitionAttribute
eSortAttributes
sono solo firmati. L'attributoLeaveMe
non è crittografato né firmato.Per crittografare e firmare l'item
record
e aggiungerlo alla tabellaExampleTable
, chiama il metodosave
della classeDynamoDBMapper
. Poiché DynamoDB Mapper è configurato per utilizzarePUT
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);