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

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

Le chiffrement côté client est le fait de chiffrer vos données localement pour garantir leur sécurité lors de leur transmission au service Amazon S3. Le service Amazon S3 reçoit vos données chiffrées et ne joue aucun rôle dans leur chiffrement ou déchiffrement.

Pour activer le chiffrement côté client, vous disposez des options suivantes :

  • Utilisez une clé stockée dans AWS Key Management Service (AWS KMS).

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

Note

Amazon S3 prend en charge seulement les clés KMS symétriques de chiffrement et ne prend pas en charge les clés asymétriques.

AWS Encryption SDK

Le AWS Encryption SDK est une bibliothèque de chiffrement côté client distincte des kits SDK spécifiques du langage. Vous pouvez utiliser cette bibliothèque de chiffrement pour implémenter plus facilement les bonnes pratiques en matière de chiffrement dans Amazon S3. Contrairement aux clients de chiffrement Amazon S3 dans les kits SDK AWS spécifiques d'un langage, le kit AWS Encryption SDK n'est pas lié à Amazon S3 et peut être utilisé pour chiffrer ou déchiffrer des données à stocker n'importe où.

Le kit AWS Encryption SDK et les clients de chiffrement Amazon S3 ne sont pas compatibles, car ils produisent des textes chiffrés dont les formats de données diffèrent. Pour en savoir plus sur le kit AWS Encryption SDK, veuillez consulter le Guide du développeur AWS Encryption SDK.

Prise en charge du kit SDK AWS ; pour le chiffrement côté client Amazon S3

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

Pour plus d'informations et d'exemples, consultez AWSPrise en charge du kit SDK pour le chiffrement côté client que vous trouverez dans la AWSRéférence générale.

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

Avec cette option, vous utilisez une AWS KMS key 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 – En utilisant l'ID de la clé KMS, le client envoie dans un premier temps une demande à AWS KMS pour obtenir une nouvelle clé symétrique de chiffrement en vue de chiffrer les données de l'objet. AWS KMS renvoie deux versions d'une clé de données générée de façon aléatoire :

    • Une version en texte brut de la clé de données 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 que AWS Key Management Service ? dans le Manuel du développeur AWS Key Management Service.

L'exemple de code suivant montre comment charger un objet sur Amazon S3 en utilisant AWS KMS avec le AWS SDK for Java. L'exemple utilise une clé 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é KMS, vous pouvez l'utiliser en indiquant la valeur de la variable keyId dans l'exemple de code. Si vous n'avez pas de clé KMS, ou si vous avez besoin d'une autre, vous pouvez en générer une à l'aide de l'API Java. L'exemple de code génère automatiquement une clé KMS à 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 KMS key for for testing this example CreateKeyRequest createKeyRequest = new CreateKeyRequest(); CreateKeyResult createKeyResult = kmsClient.createKey(createKeyRequest); // -- // specify an AWS KMS key 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 KMS key generated for testing ScheduleKeyDeletionRequest scheduleKeyDeletionRequest = new ScheduleKeyDeletionRequest().withKeyId(keyId).withPendingWindowInDays(7); kmsClient.scheduleKeyDeletion(scheduleKeyDeletionRequest); s3Encryption.shutdown(); kmsClient.shutdown();

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

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

Important

Vos clés 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é racine côté client au client de chiffrement Amazon S3. Le client utilise la clé racine 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 de chiffrement à usage unique (également appelée clé de chiffrement de 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é racine 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é racine 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é racine utiliser pour déchiffrer la clé de données. Le client utilise cette clé racine pour déchiffrer la clé de données, puis il utilise la clé de données pour déchiffrer l'objet.

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

Pour en savoir plus, consultez Chiffrement des données côté client avec le AWS SDK for Java et Amazon S3 et AWS support SDK pour le chiffrement côté client.

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 à 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();