Utilizzo del 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à.

Utilizzo del 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.

Questo argomento spiega alcune funzionalità del DynamoDB Encryption Client in Java che potrebbero non essere presenti in altre implementazioni del linguaggio di programmazione.

Per i dettagli sulla programmazione con il DynamoDB Encryption Client, consulta gli esempi Java, gli esempi in the GitHub on e Javadoc per aws-dynamodb-encryption-java repository il DynamoDB Encryption Client.

Crittografi degli elementi: e D AttributeEncryptor ynamoDBEncryptor

Il DynamoDB Encryption Client in Java dispone di due crittografi di elementi: il D di livello inferiore e il. ynamoDBEncryptor AttributeEncryptor

AttributeEncryptorSi tratta di una classe di supporto che consente di utilizzare D ynamoDBMapper AWS SDK for Java con il DynamoDB Encryptor client di crittografia DynamoDB. Quando utilizzi AttributeEncryptor con DynamoDBMapper, crittografa e firma in modo trasparente gli item quando li salvi. Inoltre, verifica e decrittografa in modo trasparente gli item quando li carichi.

Configurazione del comportamento di salvataggio

È possibile utilizzare AttributeEncryptor e DynamoDBMapper per aggiungere o sostituire gli elementi della tabella con attributi solo firmati o crittografati e firmati. Per queste attività, ti consigliamo di configurare il servizio per utilizzare il comportamento di salvataggio PUT, come illustrato nell'esempio seguente. In caso contrario, potresti non riuscire a decrittografare i dati.

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

Se si utilizza il comportamento di salvataggio predefinito, che aggiorna solo gli attributi modellati nell'elemento della tabella, gli attributi non modellati non vengono inclusi nella firma e non vengono modificati dalle scritture della tabella. Di conseguenza, nelle letture successive di tutti gli attributi, la firma non verrà convalidata, poiché non include attributi non modellati.

Puoi inoltre utilizzare il comportamento di salvataggio CLOBBER. Questo comportamento di salvataggio è identico al comportamento di salvataggio PUT, ma disabilita il blocco ottimistico e sovrascrive l'item nella tabella.

Per evitare errori di firma, il client di crittografia DynamoDB genera un'eccezione di runtime se una viene utilizzata con AttributeEncryptor un file che non è configurato con DynamoDBMapper un comportamento di salvataggio di o. CLOBBER PUT

Per vedere questo codice usato in un esempio, vedi Usando il D ynamoDBMapper e l'AwsKmsEncryptedObjectesempio.java nel repository in. aws-dynamodb-encryption-java GitHub

Operazioni di attributo in Java

Le operazioni di attributo determinano quali valori attributo sono crittografati e firmati, quali solo firmati e quali ignorati. Il metodo utilizzato per specificare le azioni degli attributi dipende dal fatto che si utilizzi il comando DynamoDBMapper and o il AttributeEncryptor D di livello inferiore. ynamoDBEncryptor

Importante

Dopo aver utilizzato le azioni degli attributi per crittografare gli elementi della tabella, l'aggiunta o la rimozione di attributi dal modello di dati potrebbe causare un errore di convalida della firma che impedisce di decrittografare i dati. Per una spiegazione dettagliata, consulta Modifica del modello di dati.

Quando utilizzi DynamoDBMapper e AttributeEncryptor, devi utilizzare le annotazioni per specificare le operazioni di attributo. Il DynamoDB Encryption Client utilizza le annotazioni standard degli attributi DynamoDB che definiscono il tipo di attributo per determinare come proteggere un attributo. Per impostazione predefinita, tutti gli attributi sono crittografati e firmati, tranne le chiavi primarie, che sono firmate ma non crittografate.

Nota

Non crittografate il valore degli attributi con l'annotazione @D ynamoDBVersion Attribute, anche se potete (e dovreste) firmarli. In caso contrario, le condizioni che utilizzano questo valore potrebbero avere effetti imprevisti.

// 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")

Per specificare le eccezioni, utilizzate le annotazioni di crittografia definite nel DynamoDB Encryption Client for Java. Se le specifichi a livello di classe, diventano il valore predefinito per la classe.

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

Ad esempio, queste annotazioni firmano ma non crittografano l'attributo PublicationYear e non crittografano né firmano il valore attributo ISBN.

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

Per specificare le azioni degli attributi quando utilizzate ynamoDBEncryptor direttamente D, create un HashMap oggetto in cui le coppie nome-valore rappresentino i nomi degli attributi e le azioni specificate.

I valori sono validi per le operazioni di attributo definite nel tipo enumerato EncryptionFlags. Puoi utilizzare ENCRYPT e SIGN insieme o solo SIGN o ometterle entrambe. Tuttavia, se si utilizza ENCRYPT da solo, il client di crittografia DynamoDB genera un errore. Non puoi crittografare un attributo non firmato.

ENCRYPT SIGN
avvertimento

Non crittografare gli attributi che vengono usati per la chiave primaria. Devono rimanere in testo semplice in modo che DynamoDB possa trovare l'elemento senza eseguire una scansione completa della tabella.

Se si specifica una chiave primaria nel contesto di crittografia e quindi si specifica ENCRYPT nell'azione di attributo per uno degli attributi della chiave primaria, il client di crittografia DynamoDB genera un'eccezione.

Ad esempio, il seguente codice Java crea un codice actions HashMap che crittografa e firma tutti gli attributi dell'elemento. record Le eccezioni sono la chiave di partizione e gli attributi della chiave di ordinamento, che sono firmati ma non crittografati, e l'attributo test, 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: // 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; } }

Quindi, quando chiamate il encryptRecordmetodo diDynamoDBEncryptor, specificate la mappa come valore del attributeFlags parametro. Ad esempio, questa chiamata a encryptRecord utilizza la mappa actions.

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

Sovrascrivere i nomi delle tabelle

Nel DynamoDB Encryption Client, il nome della tabella DynamoDB è un elemento del contesto di crittografia DynamoDB che viene passato ai metodi di crittografia e decrittografia. Quando si crittografano o si firmano gli elementi della tabella, il contesto di crittografia DynamoDB, incluso il nome della tabella, è associato crittograficamente al testo cifrato. Se il contesto di crittografia DynamoDB passato al metodo decrypt non corrisponde al contesto di crittografia DynamoDB passato al metodo encrypt, l'operazione di decrittografia ha esito negativo.

Occasionalmente, il nome di una tabella cambia, ad esempio quando si esegue il backup di una tabella o si esegue un ripristino. point-in-time Quando si decrittografa o si verifica la firma di questi elementi, è necessario passare nello stesso contesto di crittografia DynamoDB utilizzato per crittografare e firmare gli elementi, incluso il nome della tabella originale. Il nome della tabella corrente non è necessario.

Quando si utilizzaDynamoDBEncryptor, si assembla manualmente il contesto di crittografia DynamoDB. Tuttavia, se si utilizza ilDynamoDBMapper, AttributeEncryptor crea automaticamente il contesto di crittografia DynamoDB, incluso il nome della tabella corrente. Per comunicare a AttributeEncryptor di creare un contesto di crittografia con un nome di tabella diverso, utilizza EncryptionContextOverrideOperator.

Ad esempio, il codice seguente crea istanze del provider di materiali crittografici () CMP e di. DynamoDBEncryptor Quindi chiama il metodo setEncryptionContextOverrideOperator di DynamoDBEncryptor. Utilizza l'operatore overrideEncryptionContextTableName, che sovrascrive il nome di una tabella. Quando è configurato in questo modo, AttributeEncryptor crea un contesto di crittografia DynamoDB che newTableName include al posto di. oldTableName Per un esempio completo, consulta EncryptionContextOverridesWithDynamo DBMapper .java.

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

Quando chiami il metodo di caricamento di DynamoDBMapper, che esegue la decrittografia e la verifica dell'item, devi specificare il nome della tabella originale.

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

Puoi anche utilizzare l'operatore overrideEncryptionContextTableNameUsingMap, che sovrascrive più nomi di tabella.

Gli operatori che sovrascrivono i nomi di tabella vengono in genere utilizzati per la decrittografia dei dati e la verifica delle firme. Tuttavia, è possibile utilizzarli per impostare il nome della tabella nel contesto di crittografia DynamoDB su un valore diverso durante la crittografia e la firma.

Non utilizzare operatori che sovrascrivono i nomi di tabella se utilizzi DynamoDBEncryptor. Crea invece un contesto di crittografia con il nome della tabella originale e invialo al metodo di decrittografia.