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 Chiffrement AWS de base de données SDK 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 leaws-dynamodb-encryption-java repository
GitHub le client de chiffrement DynamoDB.
Rubriques
Chiffreurs d'objets : AttributeEncryptor et D ynamoDBEncryptor
Le client de chiffrement DynamoDB en Java possède deux chiffreurs d'éléments : le niveau inférieur D et le. ynamoDBEncryptor AttributeEncryptor
AttributeEncryptor
Il s'agit d'une classe d'assistance qui vous aide à utiliser le D ynamoDBMapper dans le AWS SDK for Java client DynamoDB Encryptor
de chiffrement DynamoDB. 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 D ynamoDBMapper l'exemple AwsKmsEncryptedObject.javaaws-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 D DynamoDBMapper
et AttributeEncryptor
ou le D ynamoDBEncryptor
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'annotation @D ynamoDBVersion Attribute, 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 des actions d'attribut lorsque vous utilisez ynamoDBEncryptor directement le DHashMap
objet dans lequel les paires nom-valeur représentent les noms d'attributs 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; } }
Ensuite, lorsque vous appelez la encryptRecordDynamoDBEncryptor
, spécifiez la carte comme valeur du attributeFlags
paramètre. 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ériel cryptographique (CMP) et duDynamoDBEncryptor
. 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. Vous pouvez toutefois 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.