Utilisation du client de chiffrement DynamoDB pour Java - AWS SDK de chiffrement de base de données

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Utilisation du client de chiffrement DynamoDB pour Java

Note

Notre bibliothèque de chiffrement côté client a été renommée AWS Database Encryption SDK. La rubrique suivante fournit des informations sur les versions 1. x —2. x du client de chiffrement DynamoDB pour Java et versions 1. x —3. x du client de chiffrement DynamoDB pour Python. Pour plus d'informations, consultez la section SDK AWS de chiffrement de base de données pour la prise en charge des versions DynamoDB.

Cette rubrique décrit certaines fonctionnalités du client de chiffrement DynamoDB en Java qui ne sont peut-être pas disponibles dans d'autres implémentations de langage de programmation.

Pour plus de détails sur la programmation avec le client de chiffrement DynamoDB, consultez les exemples Java, les exemples ci-dessous et le Javadoc pour aws-dynamodb-encryption-java repository GitHub le client de chiffrement DynamoDB.

Crypteurs d'objets : AttributeEncryptor et DynamodBencryptor

Le client de chiffrement DynamoDB en Java possède deux chiffreurs d'éléments : le DynamodbEncryptor de niveau inférieur et le. AttributeEncryptor

AttributeEncryptorIl s'agit d'une classe d'assistance qui vous aide à utiliser le DynamoDBMapper dans le AWS SDK for Java client de chiffrement DynamoDB. DynamoDB Encryptor Lorsque vous utilisez le AttributeEncryptor avec le DynamoDBMapper, il chiffre et signe vos éléments de manière transparente lorsque vous les enregistrez. Il vérifie et déchiffre également vos éléments de manière transparente lorsque vous les chargez.

Configuration du comportement d'enregistrement

Vous pouvez utiliser le AttributeEncryptor et DynamoDBMapper pour ajouter ou remplacer des éléments de tableau par des attributs signés uniquement ou chiffrés et signés. Pour ces tâches, nous vous recommandons de le configurer pour utiliser le comportement d'enregistrement PUT, comme illustré dans l'exemple suivant. Sinon, il est possible que vous ne puissiez pas déchiffrer vos données.

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

Si vous utilisez le comportement d'enregistrement par défaut, qui met à jour uniquement les attributs modélisés dans l'élément de table, les attributs non modélisés ne sont pas inclus dans la signature et ne sont pas modifiés par les écritures de table. Par conséquent, lors de lectures ultérieures de tous les attributs, la signature ne sera pas validée, car elle n'inclut pas d'attributs non modélisés.

Vous pouvez également utiliser le comportement de sauvegarde CLOBBER. Comportement d'enregistrement est identique au comportement d'enregistrement PUT, si ce n'est qu'il désactive le verrouillage optimiste et remplace l'élément dans la table.

Pour éviter les erreurs de signature, le client de chiffrement DynamoDB lance une exception d'exécution si un est utilisé avec AttributeEncryptor un qui n'est pas configuré avec DynamoDBMapper un comportement d'enregistrement de ou. CLOBBER PUT

Pour voir ce code utilisé dans un exemple, consultez Utilisation du DynamoDBMapper l'exemple AwsKmsEncryptedObject.java dans le aws-dynamodb-encryption-java référentiel dans GitHub.

Actions d'attribut en Java

Les actions d'attribut déterminent les valeurs d'attribut chiffrées et signées, qui sont uniquement signées et qui sont ignorées. La méthode que vous utilisez pour spécifier les actions d'attribut varie selon que vous utilisez le chiffreur DynamoDBMapper et AttributeEncryptor, ou le chiffreur DynamoDBEncryptor de bas niveau.

Important

Après avoir utilisé vos actions d’attribut pour chiffrer vos éléments de table, l’ajouter ou la suppression d’attributs de votre modèle de données peut provoquer une erreur de validation de signature qui vous empêche de déchiffrer vos données. Pour obtenir une explication détaillée, consultez Modification de votre modèle de données.

Quand vous utilisez les DynamoDBMapper et AttributeEncryptor, vous utilisez les annotations pour spécifier les actions d'attribut. Le client de chiffrement DynamoDB utilise les annotations d'attribut DynamoDB standard qui définissent le type d'attribut afin de déterminer comment protéger un attribut. Par défaut, tous les attributs sont chiffrés et signés à l'exception des clés primaires, qui sont signées, mais pas chiffrées.

Note

Ne chiffrez pas la valeur des attributs avec l'VersionAttributeannotation @DynamoDB, bien que vous puissiez (et devriez) les signer. Sinon, les conditions qui utilisent sa valeur auront des effets inattendus.

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

Pour spécifier des exceptions, utilisez les annotations de chiffrement définies dans le client de chiffrement DynamoDB pour Java. Si vous les spécifiez au niveau classe, elles deviennent la valeur par défaut pour la classe.

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

Par exemple, ces annotations signent mais ne chiffrent pas l'attribut PublicationYear, et ni ne chiffrent ou ne signent la valeur d'attribut ISBN.

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

Pour spécifier les actions d'attribut lorsque vous utilisez directement le chiffreur DynamoDBEncryptor, créez un objet HashMap dans lequel les paires nom-valeur représentent les noms d'attribut et les actions spécifiées.

Les valeurs valides des actions d'attribut sont définies dans le type énuméré EncryptionFlags. Vous pouvez utiliser ENCRYPT et SIGN conjointement, utiliser SIGN seul, ou omettre les deux. Toutefois, si vous l'utilisez ENCRYPT seul, le client de chiffrement DynamoDB génère une erreur. Vous ne pouvez pas chiffrer un attribut que vous ne signez pas.

ENCRYPT SIGN
Avertissement

Ne chiffrez pas les attributs de la clé primaire. Ils doivent rester en texte brut pour que DynamoDB puisse trouver l'élément sans exécuter une analyse complète du tableau.

Si vous spécifiez une clé primaire dans le contexte de chiffrement, puis que vous la spécifiez ENCRYPT dans l'action d'attribut pour l'un ou l'autre des attributs de clé primaire, le client de chiffrement DynamoDB émet une exception.

Par exemple, le code Java suivant crée un code actions HashMap qui chiffre et signe tous les attributs de l'recordélément. Les exceptions sont les attributs de clé de partition et de clé de tri, qui sont signés mais non chiffrés, et l'attribut test, qui n'est ni signé ni chiffré.

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

Puis, quand vous appelez la méthode encryptRecord de DynamoDBEncryptor, spécifiez la map comme valeur du paramètre attributeFlags. Par exemple, cet appel d'encryptRecord utilise la map actions.

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

Remplacer les noms des tables

Dans le client de chiffrement DynamoDB, le nom de la table DynamoDB est un élément du contexte de chiffrement DynamoDB transmis aux méthodes de chiffrement et de déchiffrement. Lorsque vous chiffrez ou signez des éléments de table, le contexte de chiffrement DynamoDB, y compris le nom de la table, est lié cryptographiquement au texte chiffré. Si le contexte de chiffrement DynamoDB transmis à la méthode de déchiffrement ne correspond pas au contexte de chiffrement DynamoDB transmis à la méthode de chiffrement, l'opération de déchiffrement échoue.

Il arrive parfois que le nom d'une table change, par exemple lorsque vous sauvegardez une table ou que vous effectuez une point-in-time restauration. Lorsque vous déchiffrez ou vérifiez la signature de ces éléments, vous devez transmettre le même contexte de chiffrement DynamoDB que celui utilisé pour chiffrer et signer les éléments, y compris le nom de table d'origine. Le nom de la table actuelle n'est pas nécessaire.

Lorsque vous utilisez leDynamoDBEncryptor, vous assemblez le contexte de chiffrement DynamoDB manuellement. Toutefois, si vous utilisez leDynamoDBMapper, AttributeEncryptor crée le contexte de chiffrement DynamoDB pour vous, y compris le nom de la table actuelle. Pour indiquer à AttributeEncryptor de créer un contexte de chiffrement avec un nom de table différent, utilisez le EncryptionContextOverrideOperator.

Par exemple, le code suivant crée des instances du fournisseur de matériaux cryptographiques (CMP) et du DynamoDBEncryptor. Ensuite, il appelle la méthode setEncryptionContextOverrideOperator de DynamoDBEncryptor. Il utilise l'opérateur overrideEncryptionContextTableName, qui remplace un nom de table. Lorsqu'il est configuré de cette façon, il AttributeEncryptor crée un contexte de chiffrement DynamoDB qui newTableName inclut à la place de. oldTableName Pour un exemple complet, consultez EncryptionContextOverridesWithDynamoDBMapper.java.

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

Lorsque vous appelez la méthode de chargement de DynamoDBMapper, qui déchiffre et vérifie l'élément, vous spécifiez le nom de la table d'origine.

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

Vous pouvez également utiliser l'opérateur overrideEncryptionContextTableNameUsingMap, qui remplace plusieurs noms de table.

Les opérateurs de remplacement de nom de table sont généralement utilisés lors du déchiffrement des données et de la vérification des signatures. Toutefois, vous pouvez les utiliser pour attribuer une valeur différente au nom de la table dans le contexte de chiffrement DynamoDB lors du chiffrement et de la signature.

N'utilisez pas les opérateurs de remplacement de nom de table si vous utilisez le DynamoDBEncryptor. Créez plutôt un contexte de chiffrement avec le nom de la table d'origine et soumettez-le à la méthode de déchiffrement.