Utilizzo del client di crittografia DynamoDB per Java - AWS SDK per la crittografia del database

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 AWS Database Encryption SDK. L'argomento seguente fornisce informazioni sulle versioni 1. x —2. x del client di crittografia DynamoDB per Java e versioni 1. x —3. x del client di crittografia DynamoDB per Python. Per ulteriori informazioni, consulta AWSDatabase Encryption SDK per il supporto delle versioni di DynamoDB.

Questo argomento spiega alcune delle funzionalità del client di crittografia DynamoDB in Java che potrebbero non essere presenti in altre implementazioni di linguaggi di programmazione.

Per dettagli sulla programmazione con il client di crittografia DynamoDB, consulta gli esempi Java, gli esempi in basso e Javadoc per il client di crittografia DynamoDB. aws-dynamodb-encryption-java repository GitHub

Crittografi di articoli: AttributeEncryptor e DynamoDBEncryptor

Il client di crittografia DynamoDB in Java ha due crittografi: il DynamoDBEncryptor di livello inferiore e il. AttributeEncryptor

AttributeEncryptorÈ una classe di supporto che consente di utilizzare DynamoDBMapper in combinazione AWS SDK for Java con il client di crittografia DynamoDB. DynamoDB Encryptor 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 and 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 nella tabella. Di conseguenza, alla lettura successiva 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 AttributeEncryptor viene utilizzato un con un file DynamoDBMapper che non è configurato con un comportamento di salvataggio di o. CLOBBER PUT

Per vedere questo codice usato in un esempio, vedi Utilizzo di DynamoDBMapper l'esempio AwsKmsEncryptedObject.java nel aws-dynamodb-encryption-java repository in. 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 che utilizzi per specificare le operazioni di attributo varia a seconda se utilizzi il metodo DynamoDBMapper e il componente AttributeEncryptor o il componente DynamoDBEncryptor di livello inferiore.

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 client di crittografia DynamoDB 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'VersionAttributeannotazione @DynamoDB, 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, utilizza le annotazioni di crittografia definite nel client di crittografia DynamoDB per 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 operazioni di attributo quando utilizzi direttamente il componente DynamoDBEncryptor, crea un oggetto HashMap in cui le coppie nome-valore rappresentano i nomi degli attributi e le operazioni 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 normale 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 dell'attributo per uno degli attributi della chiave primaria, il client di crittografia DynamoDB genera un'eccezione.

Ad esempio, il seguente codice Java crea un file actions HashMap che crittografa e firma tutti gli attributi dell'recordelemento. 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; } }

Successivamente, quando chiami il metodo encryptRecord del componente DynamoDBEncryptor, devi specificare la mappa come valore del parametro attributeFlags. 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 client di crittografia DynamoDB, 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, viene associato crittograficamente al testo cifrato. Se il contesto di crittografia DynamoDB passato al metodo di decrittografia non corrisponde al contesto di crittografia DynamoDB passato al metodo di crittografia, l'operazione di decrittografia ha esito negativo.

Di tanto in tanto, il nome di una tabella cambia, ad esempio quando si esegue il backup di una tabella o si esegue un point-in-timeripristino. Quando decifri o verifichi la firma di questi elementi, devi 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 utilizza ilDynamoDBEncryptor, si assembla il contesto di crittografia DynamoDB manualmente. Tuttavia, se si utilizza ilDynamoDBMapper, AttributeEncryptor viene creato 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 include al posto newTableName di. oldTableName Per un esempio completo, vedere EncryptionContextOverridesWithDynamoDBMapper.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, puoi 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.