Protection des données via le chiffrement côté client - Amazon Simple Storage Service

Ce guide ne fait plus l'objet de mises à jour. Pour obtenir des informations et des instructions actuelles, reportez-vous au nouveau Guide de l'utilisateur Amazon S3.

Protection des données via le chiffrement côté client

Le chiffrement côté client consiste à chiffrer des données avant de les envoyer à Amazon S3. Pour activer le chiffrement côté client, vous disposez des options suivantes :

  • Utilisez des clés principales client (CMK) stockées dans AWS Key Management Service (AWS KMS).

  • Utilisez une clé principale que vous stockez dans votre application.

Les kits SDK AWS suivants prennent en charge le chiffrement côté client :

Option 1 : utilisation d'une clé CMK stockée dans AWS KMS

Avec cette option, vous utilisez une clé CMK AWS KMS pour le chiffrement côté client lors du chargement ou du téléchargement de données dans Amazon S3.

  • Lors du chargement d'un objet – grâce à l'ID de clé CMK, le client envoie d'abord une demande à AWS KMS pour obtenir une clé qui lui permettra de chiffrer vos données d'objet. AWS KMS renvoie deux versions d'une clé de chiffrement des données générée de façon aléatoire :

    • Une version en texte brut que le client utilise pour chiffrer les données d'objet

    • Un objet blob de chiffrement de la même clé de chiffrement des données que le client charge sur Amazon S3 sous la forme de métadonnées d'objet.

    Note

    Le client reçoit une clé de données unique pour chaque objet qu'il charge.

  • Lors du téléchargement d'un objet – le client télécharge l'objet chiffré à partir d'Amazon S3 avec la version de l'objet blob de chiffrement de la clé de données stockée en tant que métadonnées d'objet. Le client envoie ensuite le blob de chiffrement à AWS KMS pour obtenir la version en texte brut de la clé des données afin de déchiffrer les données d'objet.

Pour de plus amples informations sur AWS KMS, veuillez consulter Qu'est-ce qu'AWS Key Management Service ? dans le Manuel du développeur AWS Key Management Service.

L'exemple de code suivant illustre comment charger un objet sur Amazon S3 à l'aide d'AWS KMS avec le kit AWS SDK pour Java. L'exemple utilise une clé CMK gérée par AWS pour chiffrer les données côté client avant de les charger dans Amazon S3. Si vous disposez déjà d'une clé CMK, vous pouvez l'utiliser en spécifiant la valeur de la variable keyId dans l'exemple de code. Si vous n'en n'avez pas, ou si vous avez besoin d'une clé CMK supplémentaire, vous pouvez en générer une à l'aide de l'API Java. L'exemple de code génère automatiquement une clé CMK à utiliser.

Pour obtenir les instructions sur la création et le test d'un exemple pratique, consultez Test des exemples de code Java Amazon S3.

AWSKMS kmsClient = AWSKMSClientBuilder.standard() .withRegion(Regions.DEFAULT_REGION) .build(); // create CMK for for testing this example CreateKeyRequest createKeyRequest = new CreateKeyRequest(); CreateKeyResult createKeyResult = kmsClient.createKey(createKeyRequest); // -- // specify an Amazon KMS customer master key (CMK) ID String keyId = createKeyResult.getKeyMetadata().getKeyId(); String s3ObjectKey = "EncryptedContent1.txt"; String s3ObjectContent = "This is the 1st content to encrypt"; // -- AmazonS3EncryptionV2 s3Encryption = AmazonS3EncryptionClientV2Builder.standard() .withRegion(Regions.US_WEST_2) .withCryptoConfiguration(new CryptoConfigurationV2().withCryptoMode(CryptoMode.StrictAuthenticatedEncryption)) .withEncryptionMaterialsProvider(new KMSEncryptionMaterialsProvider(keyId)) .build(); s3Encryption.putObject(bucket_name, s3ObjectKey, s3ObjectContent); System.out.println(s3Encryption.getObjectAsString(bucket_name, s3ObjectKey)); // schedule deletion of CMK generated for testing ScheduleKeyDeletionRequest scheduleKeyDeletionRequest = new ScheduleKeyDeletionRequest().withKeyId(keyId).withPendingWindowInDays(7); kmsClient.scheduleKeyDeletion(scheduleKeyDeletionRequest); s3Encryption.shutdown(); kmsClient.shutdown();

Option 2 : Utiliser une clé principale stockée dans votre application

Avec cette option, vous utilisez une clé principale stockée dans votre application pour le chiffrement des données côté client.

Important

Vos clés principales côté client et vos données non chiffrées ne sont jamais envoyées à AWS. Il est important que vous gériez vos clés de chiffrement de façon sécurisée. Si vous les perdez, vous ne pourrez pas déchiffrer vos données.

Voici comment cela fonctionne :

  • Lors du chargement d'un objet – vous fournissez une clé principale côté client au client de chiffrement Amazon S3. Le client utilise la clé principale uniquement pour chiffrer la clé de chiffrement des données qu'il génère de manière aléatoire.

    Les étapes suivantes décrivent le processus :

    1. Le client de chiffrement Amazon S3 génère localement une clé symétrique à usage unique (aussi appelée clé de chiffrement des données ou clé de données). Il utilise la clé de données pour chiffrer les données d'un objet Amazon S3 unique. Le client génère une clé de données distincte pour chaque objet.

    2. Le client chiffre la clé de chiffrement des données à l'aide de la clé principale que vous fournissez. Le client charge la clé de données chiffrées et sa description matérielle qui font partie intégrante des métadonnées d'objet. Le client utilise la description matérielle pour déterminer quelle clé principale côté client utiliser pour le chiffrement.

    3. Le client charge les données chiffrées dans Amazon S3 et enregistre la clé de données chiffrées sous la forme de métadonnées d'objet (x-amz-meta-x-amz-key) dans Amazon S3.

  • Lors du téléchargement d'un objet – le client télécharge l'objet chiffré à partir d'Amazon S3. Grâce à la description matérielle extraite des métadonnées, le client détermine d'abord quelle clé principale utiliser pour déchiffrer la clé de données. Le client utilise la clé principale pour déchiffrer la clé de données, puis utilise cette dernière pour déchiffrer l'objet.

La clé principale côté client que vous fournissez peut être une clé symétrique ou une paire de clés publique/privée. Les exemples de code suivants montrent comment utiliser chaque type de clé.

Pour de plus amples informations, veuillez consulter Chiffrement de données côté client avec le kit AWS SDK pour Java et Amazon S3.

Note

Si vous recevez un message d'erreur de chiffrement lorsque vous utilisez l'API de chiffrement pour la première fois, il se peut que votre version JDK possède un fichier de politique de juridiction Java Cryptography Extension (JCE) qui limite la longueur maximale de la clé pour les transformations de chiffrement et de déchiffrement vers 128 bits. Le kit AWS SDK impose une longueur de clé maximale de 256 bits.

Pour vérifier votre longueur de clé maximale, utilisez la méthode getMaxAllowedKeyLength() de la classe javax.crypto.Cipher. Pour supprimer la restriction de longueur de clé, installez les fichiers Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy.

L'exemple de code suivant montre comment procéder :

  • Générez une clé AES 256 bits.

  • Utilisez la clé AES pour chiffrer les données côté client avant de les envoyer à Amazon S3.

  • Utilisez la clé AES pour déchiffrer les données provenant d'Amazon S3.

  • Imprimez une représentation sous forme de chaîne de l'objet déchiffré.

Pour obtenir les instructions sur la création et le test d'un exemple pratique, consultez Test des exemples de code Java Amazon S3.

KeyGenerator keyGenerator = KeyGenerator.getInstance("AES"); keyGenerator.init(256); // -- // generate a symmetric encryption key for testing SecretKey secretKey = keyGenerator.generateKey(); String s3ObjectKey = "EncryptedContent2.txt"; String s3ObjectContent = "This is the 2nd content to encrypt"; // -- AmazonS3EncryptionV2 s3Encryption = AmazonS3EncryptionClientV2Builder.standard() .withRegion(Regions.DEFAULT_REGION) .withClientConfiguration(new ClientConfiguration()) .withCryptoConfiguration(new CryptoConfigurationV2().withCryptoMode(CryptoMode.AuthenticatedEncryption)) .withEncryptionMaterialsProvider(new StaticEncryptionMaterialsProvider(new EncryptionMaterials(secretKey))) .build(); s3Encryption.putObject(bucket_name, s3ObjectKey, s3ObjectContent); System.out.println(s3Encryption.getObjectAsString(bucket_name, s3ObjectKey)); s3Encryption.shutdown();

L'exemple de code suivant montre comment procéder :

  • Générez une paire de clés RSA 2048 bits à des fins de test.

  • Utilisez les clés RSA pour chiffrer les données côté client avant de les envoyer à Amazon S3.

  • Utilisez les clés RSA pour déchiffrer les données provenant d'Amazon S3.

  • Imprimez une représentation sous forme de chaîne de l'objet déchiffré.

Pour obtenir les instructions sur la création et le test d'un exemple pratique, consultez Test des exemples de code Java Amazon S3.

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(2048); // -- // generate an asymmetric key pair for testing KeyPair keyPair = keyPairGenerator.generateKeyPair(); String s3ObjectKey = "EncryptedContent3.txt"; String s3ObjectContent = "This is the 3rd content to encrypt"; // -- AmazonS3EncryptionV2 s3Encryption = AmazonS3EncryptionClientV2Builder.standard() .withRegion(Regions.US_WEST_2) .withCryptoConfiguration(new CryptoConfigurationV2().withCryptoMode(CryptoMode.StrictAuthenticatedEncryption)) .withEncryptionMaterialsProvider(new StaticEncryptionMaterialsProvider(new EncryptionMaterials(keyPair))) .build(); s3Encryption.putObject(bucket_name, s3ObjectKey, s3ObjectContent); System.out.println(s3Encryption.getObjectAsString(bucket_name, s3ObjectKey)); s3Encryption.shutdown();