Chiffrement côté client et Azure Key Vault pour Microsoft Azure StorageClient-Side Encryption and Azure Key Vault for Microsoft Azure Storage

Vue d'ensembleOverview

La bibliothèque cliente Stockage Azure pour .NET prend en charge le chiffrement des données au sein des applications clientes avant le chargement vers Stockage Azure, ainsi que le déchiffrement des données pendant leur téléchargement vers le client.The Azure Storage Client Library for .NET supports encrypting data within client applications before uploading to Azure Storage, and decrypting data while downloading to the client. La bibliothèque prend également en charge l’intégration au coffre de clés Azure pour la gestion des clés de compte de stockage.The library also supports integration with Azure Key Vault for storage account key management.

Pour obtenir une procédure pas à pas sur le processus de chiffrement des objets Blob à l’aide du chiffrement côté client et d’Azure Key Vault, consultez Chiffrement et déchiffrement d’objets blob dans Microsoft Azure Storage à l'aide d'Azure Key Vault.For a step-by-step tutorial that leads you through the process of encrypting blobs using client-side encryption and Azure Key Vault, see Encrypt and decrypt blobs in Microsoft Azure Storage using Azure Key Vault.

Pour le chiffrement côté client avec Java, consultez la page Chiffrement côté client avec Java pour Microsoft Azure Storage.For client-side encryption with Java, see Client-Side Encryption with Java for Microsoft Azure Storage.

Chiffrement et déchiffrement via la technique d’enveloppeEncryption and decryption via the envelope technique

Les processus de chiffrement et de déchiffrement s’effectuent selon la technique d’enveloppe.The processes of encryption and decryption follow the envelope technique.

Chiffrement via la technique d’enveloppeEncryption via the envelope technique

Le chiffrement via la technique d’enveloppe fonctionne de la façon suivante :Encryption via the envelope technique works in the following way:

  1. La bibliothèque cliente du stockage Azure génère une clé de chiffrement de contenu (CEK) qui est une clé symétrique à usage unique.The Azure storage client library generates a content encryption key (CEK), which is a one-time-use symmetric key.

  2. Les données utilisateur sont chiffrées à l'aide de cette clé de chiffrement de contenu.User data is encrypted using this CEK.

  3. La clé de chiffrement de contenu est ensuite encapsulée (chiffrée) à l’aide de la clé de chiffrement de clés (KEK).The CEK is then wrapped (encrypted) using the key encryption key (KEK). La clé de chiffrement de clés est identifiée par un identificateur de clé et peut être une paire de clés asymétriques ou une clé symétrique pouvant être gérée localement ou stockée dans des coffres de clés Azure.The KEK is identified by a key identifier and can be an asymmetric key pair or a symmetric key and can be managed locally or stored in Azure Key Vaults.

    La bibliothèque cliente du stockage n’a jamais accès à la clé de chiffrement de clés.The storage client library itself never has access to KEK. Elle appelle l’algorithme d’encapsulage de clés fourni par Key Vault.The library invokes the key wrapping algorithm that is provided by Key Vault. Si besoin est, les utilisateurs peuvent choisir d'utiliser des fournisseurs personnalisés pour l’encapsulage/le désencapsulage de clés.Users can choose to use custom providers for key wrapping/unwrapping if desired.

  4. Les données chiffrées sont ensuite téléchargées sur le service Azure Storage.The encrypted data is then uploaded to the Azure Storage service. La clé encapsulée avec des métadonnées de chiffrement supplémentaires est stockée en tant que métadonnées (sur un objet blob) ou interpolée avec les données chiffrées (messages de la file d’attente et entités de la table).The wrapped key along with some additional encryption metadata is either stored as metadata (on a blob) or interpolated with the encrypted data (queue messages and table entities).

Déchiffrement via la technique d’enveloppeDecryption via the envelope technique

Le déchiffrement via la technique d’enveloppe fonctionne de la façon suivante :Decryption via the envelope technique works in the following way:

  1. La bibliothèque cliente suppose que l’utilisateur gère la clé de chiffrement à clé (KEK) localement ou dans des coffres de clés Azure.The client library assumes that the user is managing the key encryption key (KEK) either locally or in Azure Key Vaults. L’utilisateur n’est pas obligé de savoir quelle clé a été spécifiquement utilisée pour le chiffrement.The user does not need to know the specific key that was used for encryption. Il est en effet possible d’utiliser et de configurer un programme de résolution de clés qui résout les différents identificateurs de clés.Instead, a key resolver which resolves different key identifiers to keys can be set up and used.
  2. La bibliothèque cliente télécharge les données chiffrées ainsi que tout le matériel de chiffrement stocké sur le service.The client library downloads the encrypted data along with any encryption material that is stored on the service.
  3. La clé de chiffrement de contenu (CEK) encapsulée est ensuite désencapsulée (déchiffrée) à l’aide de la clé de chiffrement de clés (KEK).The wrapped content encryption key (CEK) is then unwrapped (decrypted) using the key encryption key (KEK). Là encore, la bibliothèque cliente n’a pas accès à la clé de chiffrement de clés.Here again, the client library does not have access to KEK. Elle appelle simplement l’algorithme de désencapsulage personnalisée ou du fournisseur Key Vault.It simply invokes the custom or Key Vault provider's unwrapping algorithm.
  4. La clé de chiffrement de contenu (CEK) est alors utilisée pour déchiffrer les données utilisateur chiffrées.The content encryption key (CEK) is then used to decrypt the encrypted user data.

Mécanisme de chiffrementEncryption Mechanism

La bibliothèque cliente du stockage utilise AES pour chiffrer les données utilisateur.The storage client library uses AES in order to encrypt user data. Plus précisément, le mode CBC (Cipher Block Chaining) avec AES.Specifically, Cipher Block Chaining (CBC) mode with AES. Chaque service fonctionnant un peu différemment, nous allons les étudier un par un ici.Each service works somewhat differently, so we will discuss each of them here.

Objets blobBlobs

La bibliothèque cliente prend actuellement en charge le chiffrement des objets blob entiers uniquement.The client library currently supports encryption of whole blobs only. Plus précisément, le chiffrement est pris en charge lors de l’utilisation des méthodes UploadFrom ou de la méthode OpenWrite.Specifically, encryption is supported when users use the UploadFrom methods or the OpenWrite method. Les téléchargements complets et de plages sont tous deux pris en charge.For downloads, both complete and range downloads are supported.

Au cours du chiffrement, la bibliothèque cliente génère un vecteur d’initialisation aléatoire (IV) de 16 octets avec une clé de chiffrement de contenu (CEK) aléatoire de 32 octets, puis effectue le chiffrement d’enveloppe des données d’objets blob à l’aide de ces informations.During encryption, the client library will generate a random Initialization Vector (IV) of 16 bytes, together with a random content encryption key (CEK) of 32 bytes, and perform envelope encryption of the blob data using this information. La clé de chiffrement de contenu encapsulée ainsi que des métadonnées de chiffrement supplémentaires sont ensuite stockées en tant que métadonnées d’objet blob en même temps que l’objet blob chiffré sur le service.The wrapped CEK and some additional encryption metadata are then stored as blob metadata along with the encrypted blob on the service.

Avertissement

Si vous modifiez ou téléchargez vos propres métadonnées pour l’objet blob, vous devez vous assurer que ces métadonnées sont conservées.If you are editing or uploading your own metadata for the blob, you need to ensure that this metadata is preserved. Si vous téléchargez de nouvelles métadonnées sans ces métadonnées, la clé de chiffrement de contenu encapsulée, le vecteur d’initialisation et d’autres métadonnées seront perdus et le contenu de l’objet blob ne sera plus jamais récupérable.If you upload new metadata without this metadata, the wrapped CEK, IV, and other metadata will be lost and the blob content will never be retrievable again.

Le téléchargement d’un objet blob chiffré implique de récupérer le contenu de l’objet blob entier à l’aide des méthodes pratiques DownloadTo/BlobReadStream.Downloading an encrypted blob involves retrieving the content of the entire blob using the DownloadTo/BlobReadStream convenience methods. La clé de chiffrement de contenu encapsulée est désencapsulée et utilisée en combinaison avec le vecteur d’initialisation (stocké en tant que métadonnées d’objet blob dans cet exemple) pour renvoyer les données déchiffrées aux utilisateurs.The wrapped CEK is unwrapped and used together with the IV (stored as blob metadata in this case) to return the decrypted data to the users.

Le téléchargement d’une plage arbitraire (méthodes DownloadRange) dans l’objet blob chiffré implique d’ajuster la plage fournie par les utilisateurs pour obtenir une petite quantité de données supplémentaires susceptibles d’être utilisées pour déchiffrer la plage demandée.Downloading an arbitrary range (DownloadRange methods) in the encrypted blob involves adjusting the range provided by users in order to get a small amount of additional data that can be used to successfully decrypt the requested range.

Tous les types d’objets blob (objets blob de blocs, objets blob de pages et objets blob d’ajouts) peuvent être chiffrés/déchiffrés à l’aide de ce schéma.All blob types (block blobs, page blobs, and append blobs) can be encrypted/decrypted using this scheme.

Files d’attenteQueues

Dans la mesure où les messages de la file d’attente peuvent avoir n’importe quel format, la bibliothèque cliente définit un format personnalisé qui inclut le vecteur d’initialisation (IV) et la clé de chiffrement de contenu (CEK) chiffrée dans le texte du message.Since queue messages can be of any format, the client library defines a custom format that includes the Initialization Vector (IV) and the encrypted content encryption key (CEK) in the message text.

Au cours du chiffrement, la bibliothèque cliente génère un vecteur d’initialisation aléatoire de 16 octets avec une clé de chiffrement de contenu aléatoire de 32 octets, puis effectue le chiffrement d’enveloppe du texte du message de la file d’attente à l’aide de ces informations.During encryption, the client library generates a random IV of 16 bytes along with a random CEK of 32 bytes and performs envelope encryption of the queue message text using this information. La clé de chiffrement de contenu encapsulée et les métadonnées de chiffrement supplémentaires sont ensuite ajoutées au message chiffré de la file d’attente.The wrapped CEK and some additional encryption metadata are then added to the encrypted queue message. Ce message modifié (illustré ci-dessous) est stocké sur le service.This modified message (shown below) is stored on the service.

<MessageText>{"EncryptedMessageContents":"6kOu8Rq1C3+M1QO4alKLmWthWXSmHV3mEfxBAgP9QGTU++MKn2uPq3t2UjF1DO6w","EncryptionData":{…}}</MessageText>

Au cours du déchiffrement, la clé encapsulée est extraite du message de la file d’attente et désencapsulée.During decryption, the wrapped key is extracted from the queue message and unwrapped. Le vecteur d’initialisation est également extrait du message de la file d’attente et utilisé en combinaison avec la clé désencapsulée pour déchiffrer les données du message de la file d’attente.The IV is also extracted from the queue message and used along with the unwrapped key to decrypt the queue message data. Notez que les métadonnées de chiffrement sont peu volumineuses (moins de 500 octets). Donc, même si elles entrent en compte dans la limite de 64 Ko du message de la file d’attente, leur impact reste facile à gérer.Note that the encryption metadata is small (under 500 bytes), so while it does count toward the 64KB limit for a queue message, the impact should be manageable.

TablesTables

La bibliothèque cliente prend en charge le chiffrement des propriétés de l’entité pour les opérations d’insertion et de remplacement.The client library supports encryption of entity properties for insert and replace operations.

Notes

La fusion n’est pas prise en charge pour le moment.Merge is not currently supported. Si un sous-ensemble de propriétés a été chiffré précédemment à l’aide d’une clé différente, la fusion des nouvelles propriétés et la mise à jour des métadonnées entraîne une perte de données.Since a subset of properties may have been encrypted previously using a different key, simply merging the new properties and updating the metadata will result in data loss. L’opération de fusion nécessite d’effectuer des appels de service supplémentaires pour lire l’entité pré-existante à partir du service ou d’utiliser une nouvelle clé par propriété. Ces deux solutions ne conviennent pas pour des raisons de performances.Merging either requires making extra service calls to read the pre-existing entity from the service, or using a new key per property, both of which are not suitable for performance reasons.

Le chiffrement des données d’une table fonctionne de la manière suivante :Table data encryption works as follows:

  1. Les utilisateurs spécifient les propriétés à chiffrer.Users specify the properties to be encrypted.
  2. La bibliothèque cliente génère un vecteur d’initialisation (IV) aléatoire de 16 octets et une clé de chiffrement de contenu (CEK) aléatoire de 32 octets pour chaque entité, puis effectue le chiffrement d’enveloppe sur les propriétés individuelles à chiffrer en dérivant un nouveau vecteur d’initialisation par propriété.The client library generates a random Initialization Vector (IV) of 16 bytes along with a random content encryption key (CEK) of 32 bytes for every entity, and performs envelope encryption on the individual properties to be encrypted by deriving a new IV per property. La propriété chiffrée est stockée en tant que données binaires.The encrypted property is stored as binary data.
  3. La clé de chiffrement de contenu encapsulée et certaines métadonnées de chiffrement supplémentaires sont ensuite stockées sous la forme de deux propriétés réservées supplémentaires.The wrapped CEK and some additional encryption metadata are then stored as two additional reserved properties. La première propriété réservée (_ClientEncryptionMetadata1) est une propriété de type chaîne qui conserve les informations sur le vecteur d’initialisation, la version et la clé encapsulée.The first reserved property (_ClientEncryptionMetadata1) is a string property that holds the information about IV, version, and wrapped key. La seconde propriété réservée (_ClientEncryptionMetadata2) est une propriété de type binaire qui conserve les informations sur les propriétés chiffrées.The second reserved property (_ClientEncryptionMetadata2) is a binary property that holds the information about the properties that are encrypted. Les informations contenues dans cette seconde propriété (_ClientEncryptionMetadata2) sont elles-mêmes chiffrées.The information in this second property (_ClientEncryptionMetadata2) is itself encrypted.
  4. En raison de ces propriétés réservées supplémentaires requises pour le chiffrement, les utilisateurs ne peuvent désormais avoir que 250 propriétés personnalisées au lieu de 252.Due to these additional reserved properties required for encryption, users may now have only 250 custom properties instead of 252. La taille totale de l’entité doit être inférieure à 1 Mo.The total size of the entity must be less than 1 MB.

Notez que seules les propriétés de type chaîne peuvent être chiffrées.Note that only string properties can be encrypted. Si d’autres types de propriétés doivent être chiffrés, ils doivent être convertis en chaînes.If other types of properties are to be encrypted, they must be converted to strings. Les chaînes chiffrées sont stockées sur le service en tant que propriétés binaires, et elles sont converties en chaînes après le déchiffrement.The encrypted strings are stored on the service as binary properties, and they are converted back to strings after decryption.

Pour les tables, outre la stratégie de chiffrement, les utilisateurs doivent spécifier les propriétés à chiffrer.For tables, in addition to the encryption policy, users must specify the properties to be encrypted. Pour ce faire, il faut spécifier un attribut EncryptProperty (pour les entités POCO qui dérivent de TableEntity) ou un programme de résolution de chiffrement dans les options de requête.This can be done by either specifying an [EncryptProperty] attribute (for POCO entities that derive from TableEntity) or an encryption resolver in request options. Un programme de résolution de chiffrement est un délégué qui prend une clé de partition, une clé de ligne et un nom de propriété, puis renvoie une valeur booléenne indiquant si cette propriété doit être chiffrée.An encryption resolver is a delegate that takes a partition key, row key, and property name and returns a Boolean that indicates whether that property should be encrypted. Au cours du chiffrement, la bibliothèque cliente utilise ces informations pour décider si une propriété doit être chiffrée lors de l’écriture en ligne.During encryption, the client library will use this information to decide whether a property should be encrypted while writing to the wire. Le délégué fournit également la possibilité de définir la manière dont les propriétés sont chiffrées l’aide d’un programme logique.The delegate also provides for the possibility of logic around how properties are encrypted. (Par exemple, si X, alors chiffrer la propriété A ; sinon chiffrer les propriétés A et B.) Notez qu’il n’est pas nécessaire de fournir ces informations lors de la lecture ou de l’interrogation des entités.(For example, if X, then encrypt property A; otherwise encrypt properties A and B.) Note that it is not necessary to provide this information while reading or querying entities.

Opérations de traitement par lotsBatch Operations

Dans les opérations de traitement par lots, la même clé de chiffrement de clés (KEK) est utilisée pour toutes les lignes d’une même opération, car la bibliothèque cliente n’accepte qu’un seul objet d’options (et par conséquent, une seule stratégie/clé de chiffrement de clés) par opération de traitement par lots.In batch operations, the same KEK will be used across all the rows in that batch operation because the client library only allows one options object (and hence one policy/KEK) per batch operation. Toutefois, la bibliothèque cliente génère en interne un nouveau vecteur d’initialisation (IV) aléatoire et une clé de chiffrement de contenu (CEK) aléatoire par ligne dans le lot.However, the client library will internally generate a new random IV and random CEK per row in the batch. Les utilisateurs peuvent également choisir de chiffrer différentes propriétés pour chaque opération dans le lot en définissant ce comportement dans le programme de résolution de chiffrement.Users can also choose to encrypt different properties for every operation in the batch by defining this behavior in the encryption resolver.

RequêtesQueries

Notes

Comme les entités sont chiffrées, vous ne pouvez pas exécuter des requêtes qui filtrent sur une propriété chiffrée.Because the entities are encrypted, you cannot run queries that filter on an encrypted property. Si vous essayez, les résultats seront incorrects, car le service essaiera de comparer les données chiffrées aux données non chiffrées.If you try, results will be incorrect, because the service would be trying to compare encrypted data with unencrypted data.

Pour effectuer des opérations de requête, vous devez spécifier un programme de résolution de clé capable de résoudre toutes les clés dans le jeu de résultats.To perform query operations, you must specify a key resolver that is able to resolve all the keys in the result set. Si une entité contenue dans le résultat de la requête ne peut pas être résolue par rapport à un fournisseur, la bibliothèque cliente génère une erreur.If an entity contained in the query result cannot be resolved to a provider, the client library will throw an error. Pour toute requête effectuant des projections côté serveur, la bibliothèque cliente ajoute par défaut les propriétés de métadonnées de chiffrement spéciales (_ClientEncryptionMetadata1 et _ClientEncryptionMetadata2) aux colonnes sélectionnées.For any query that performs server-side projections, the client library will add the special encryption metadata properties (_ClientEncryptionMetadata1 and _ClientEncryptionMetadata2) by default to the selected columns.

Azure Key VaultAzure Key Vault

Azure Key Vault permet de protéger les clés de chiffrement et les secrets utilisés par les services et les applications cloud.Azure Key Vault helps safeguard cryptographic keys and secrets used by cloud applications and services. En utilisant Azure Key Vault, les utilisateurs peuvent chiffrer les clés et secrets (tels que les clés d’authentification, les clés de compte de stockage, les clés de chiffrement de données, les fichiers .PFX et les mots de passe) à l’aide de clés protégées par des modules de sécurité matériels (HSM).By using Azure Key Vault, users can encrypt keys and secrets (such as authentication keys, storage account keys, data encryption keys, .PFX files, and passwords) by using keys that are protected by hardware security modules (HSMs). Pour plus d’informations, consultez la page Qu’est-ce qu’Azure Key Vault ?For more information, see What is Azure Key Vault?.

La bibliothèque cliente de stockage utilise la bibliothèque principale du coffre de clés Key Vault afin de fournir une infrastructure commune de gestion des clés sur Azure.The storage client library uses the Key Vault core library in order to provide a common framework across Azure for managing keys. Les utilisateurs ont un avantage supplémentaire : la possibilité d’utiliser la bibliothèque d’extensions du coffre de clés.Users also get the additional benefit of using the Key Vault extensions library. La bibliothèque d’extensions fournit une fonctionnalité utile basée sur des fournisseurs de clés Symmetric/RSA simples et transparents, en local et dans le cloud, avec capacité d’agrégation et de mise en cache.The extensions library provides useful functionality around simple and seamless Symmetric/RSA local and cloud key providers as well as with aggregation and caching.

Interfaces et dépendancesInterface and dependencies

Il existe trois packages de coffre de clés :There are three Key Vault packages:

  • Microsoft.Azure.KeyVault.Core contient IKey et IKeyResolver.Microsoft.Azure.KeyVault.Core contains the IKey and IKeyResolver. Il s’agit d’un petit package sans dépendances.It is a small package with no dependencies. La bibliothèque cliente de stockage pour .NET le définit en tant que dépendance.The storage client library for .NET defines it as a dependency.
  • Microsoft.Azure.KeyVault contient le client REST du coffre de clés.Microsoft.Azure.KeyVault contains the Key Vault REST client.
  • Microsoft.Azure.KeyVault.Extensions contient le code d’extension qui inclut des implémentations d’algorithmes de chiffrement, RSAKey et SymmetricKey.Microsoft.Azure.KeyVault.Extensions contains extension code that includes implementations of cryptographic algorithms and an RSAKey and a SymmetricKey. Il repose sur les espaces de noms Core et KeyVault, et fournit une fonctionnalité permettant de définir un programme de résolution d’agrégation (lorsque les utilisateurs veulent utiliser plusieurs fournisseurs de clés) et un programme de résolution de clé de mise en cache.It depends on the Core and KeyVault namespaces and provides functionality to define an aggregate resolver (when users want to use multiple key providers) and a caching key resolver. Bien que la bibliothèque cliente de stockage ne dépende pas directement de ce package, si les utilisateurs veulent utiliser Azure Key Vault pour stocker leurs clés ou utiliser les extensions du coffre de clés pour recourir aux fournisseurs de chiffrement en local et dans le cloud, ils ont besoin de ce package.Although the storage client library does not directly depend on this package, if users wish to use Azure Key Vault to store their keys or to use the Key Vault extensions to consume the local and cloud cryptographic providers, they will need this package.

Le coffre de clés est conçu pour les clés principales de valeur élevée et les seuils de limitation par coffre de clés sont définies avec cela à l’esprit.Key Vault is designed for high-value master keys, and throttling limits per Key Vault are designed with this in mind. Lors du chiffrement côté client avec le coffre de clés, il est préférable d’utiliser les clés principales Symmetric stockées en tant que secrets dans le coffre de clés et mises en cache localement.When performing client-side encryption with Key Vault, the preferred model is to use symmetric master keys stored as secrets in Key Vault and cached locally. Les utilisateurs doivent procéder comme suit :Users must do the following:

  1. Créer un secret hors connexion et le télécharger dans le coffre de clés.Create a secret offline and upload it to Key Vault.
  2. Utiliser l’identificateur de base du secret comme paramètre pour résoudre la version actuelle du secret pour le chiffrement et mettre en cache ces informations localement.Use the secret's base identifier as a parameter to resolve the current version of the secret for encryption and cache this information locally. Utiliser CachingKeyResolver pour la mise en cache ; les utilisateurs ne doivent pas implémenter leur propre programme logique de mise en cache.Use CachingKeyResolver for caching; users are not expected to implement their own caching logic.
  3. Utiliser le programme de résolution de mise en cache en tant qu’entrée lors de la création de la stratégie de chiffrement.Use the caching resolver as an input while creating the encryption policy.

Vous trouverez plus d’informations concernant l’utilisation du coffre de clés dans les exemples de code de chiffrement.More information regarding Key Vault usage can be found in the encryption code samples.

Bonnes pratiquesBest practices

La prise en charge du chiffrement est disponible uniquement dans la bibliothèque cliente de stockage pour .NET.Encryption support is available only in the storage client library for .NET. Windows Phone et Windows Runtime ne prennent pas en charge le chiffrement pour le moment.Windows Phone and Windows Runtime do not currently support encryption.

Important

Tenez compte des points importants suivants quand vous utilisez le chiffrement côté client :Be aware of these important points when using client-side encryption:

  • Pendant la lecture d’un objet blob chiffré ou l’écriture dans un objet blob chiffré, utilisez les commandes de chargement d’objets entiers et de téléchargement d’objets blob entiers/par plage.When reading from or writing to an encrypted blob, use whole blob upload commands and range/whole blob download commands. N’écrivez pas dans un objet blob chiffré à l’aide d’opérations de protocole telles que Put Block, Put Block List, Write Pages, Clear Pages ou Append Block au risque d’endommager l’objet blob chiffré et de le rendre illisible.Avoid writing to an encrypted blob using protocol operations such as Put Block, Put Block List, Write Pages, Clear Pages, or Append Block; otherwise you may corrupt the encrypted blob and make it unreadable.
  • Pour les tables, une contrainte similaire existe.For tables, a similar constraint exists. Veillez à ne pas mettre à jour les propriétés chiffrées sans aussi mettre à jour les métadonnées de chiffrement.Be careful to not update encrypted properties without updating the encryption metadata.
  • Si vous définissez des métadonnées sur l’objet blob chiffré, vous risquez de remplacer les métadonnées relatives au chiffrement et nécessaires au déchiffrement, car la définition des métadonnées n’est pas additive.If you set metadata on the encrypted blob, you may overwrite the encryption-related metadata required for decryption, since setting metadata is not additive. Cela est également vrai pour les instantanés : évitez de spécifier des métadonnées lors de la création d’un instantané d’objet blob chiffré.This is also true for snapshots; avoid specifying metadata while creating a snapshot of an encrypted blob. Si des métadonnées doivent être définies, veillez à appeler la méthode FetchAttributes pour obtenir les métadonnées de chiffrement actuelles et éviter des écritures simultanées pendant la définition des métadonnées.If metadata must be set, be sure to call the FetchAttributes method first to get the current encryption metadata, and avoid concurrent writes while metadata is being set.
  • Activez la propriété RequireEncryption dans les options de requête par défaut pour les utilisateurs qui doivent recourir uniquement à des données chiffrées.Enable the RequireEncryption property in the default request options for users that should work only with encrypted data. Pour plus d’informations, consultez la section ci-dessous.See below for more info.

API/Interface clienteClient API / Interface

Lors de la création d’un objet EncryptionPolicy, les utilisateurs peuvent fournir une clé seulement (implémentation de IKey), un programme de résolution seulement (implémentation de IKeyResolver), ou les deux.While creating an EncryptionPolicy object, users can provide only a Key (implementing IKey), only a resolver (implementing IKeyResolver), or both. IKey est le type de clé de base identifié à l’aide d’un identificateur de clé. Il fournit le programme logique pour l’encapsulage/le désencapsulage.IKey is the basic key type that is identified using a key identifier and that provides the logic for wrapping/unwrapping. IKeyResolver est utilisé pour résoudre une clé pendant le processus de déchiffrement.IKeyResolver is used to resolve a key during the decryption process. Il définit une méthode ResolveKey qui renvoie un IKey avec un identificateur de clé.It defines a ResolveKey method that returns an IKey given a key identifier. Les utilisateurs ont ainsi la possibilité de choisir entre plusieurs clés gérées dans plusieurs emplacements.This provides users the ability to choose between multiple keys that are managed in multiple locations.

  • Pour le chiffrement, la clé est toujours utilisée et l’absence de clé entraîne une erreur.For encryption, the key is used always and the absence of a key will result in an error.
  • Pour le déchiffrement :For decryption:
    • S’il est spécifié, le programme de résolution de clé est appelé pour obtenir la clé.The key resolver is invoked if specified to get the key. Si le programme de résolution est spécifié, mais ne comporte pas de mappage pour l’identificateur de clé, une erreur est générée.If the resolver is specified but does not have a mapping for the key identifier, an error is thrown.
    • Si le programme de résolution n’est pas spécifié, mais qu’une clé est spécifiée, celle-ci est utilisée si son identificateur correspond à l’identificateur de clé nécessaire.If resolver is not specified but a key is specified, the key is used if its identifier matches the required key identifier. Si l’identificateur ne correspond pas, une erreur est générée.If the identifier does not match, an error is thrown.

Les exemples de code dans cet article montrent comment définir une stratégie de chiffrement et comment utiliser des données chiffrées. Toutefois, ils n’expliquent pas comment utiliser Azure Key Vault.The code examples in this article demonstrate setting an encryption policy and working with encrypted data, but do not demonstrate working with Azure Key Vault. Les exemples de chiffrement sur GitHub présentent un scénario de bout en bout plus détaillé pour les objets blob, les files d’attente et les tables, ainsi que pour l’intégration à Key Vault.The encryption samples on GitHub demonstrate a more detailed end-to-end scenario for blobs, queues and tables, along with Key Vault integration.

Mode RequireEncryptionRequireEncryption mode

Les utilisateurs peuvent éventuellement activer un mode de fonctionnement dans lequel tous les chargements et téléchargements doivent être chiffrés.Users can optionally enable a mode of operation where all uploads and downloads must be encrypted. Dans ce mode, les tentatives de chargement de données sans une stratégie de chiffrement ou de téléchargement de données non chiffrées sur le service échouent sur le client.In this mode, attempts to upload data without an encryption policy or download data that is not encrypted on the service will fail on the client. La propriété RequireEncryption de l’objet d’options de requête contrôle ce comportement.The RequireEncryption property of the request options object controls this behavior. Si votre application chiffre tous les objets stockés dans Azure Storage, vous pouvez définir la propriété RequireEncryption sur les options de requête par défaut pour l’objet client de service.If your application will encrypt all objects stored in Azure Storage, then you can set the RequireEncryption property on the default request options for the service client object. Par exemple, définissez CloudBlobClient.DefaultRequestOptions.RequireEncryption sur true pour imposer le chiffrement pour toutes les opérations d’objet blob effectuées par le biais de cet objet client.For example, set CloudBlobClient.DefaultRequestOptions.RequireEncryption to true to require encryption for all blob operations performed through that client object.

Chiffrement du service BLOBBlob service encryption

Créez un objet BlobEncryptionPolicy et définissez-le dans les options de requête (par API ou au niveau client à l’aide de DefaultRequestOptions).Create a BlobEncryptionPolicy object and set it in the request options (per API or at a client level by using DefaultRequestOptions). Tout le reste est géré par la bibliothèque cliente en interne.Everything else will be handled by the client library internally.

// Create the IKey used for encryption.
 RsaKey key = new RsaKey("private:key1" /* key identifier */);

 // Create the encryption policy to be used for upload and download.
 BlobEncryptionPolicy policy = new BlobEncryptionPolicy(key, null);

 // Set the encryption policy on the request options.
 BlobRequestOptions options = new BlobRequestOptions() { EncryptionPolicy = policy };

 // Upload the encrypted contents to the blob.
 blob.UploadFromStream(stream, size, null, options, null);

 // Download and decrypt the encrypted contents from the blob.
 MemoryStream outputStream = new MemoryStream();
 blob.DownloadToStream(outputStream, null, options, null);

Chiffrement du service de File d’attenteQueue service encryption

Créez un objet QueueEncryptionPolicy et définissez-le dans les options de requête (par API ou au niveau client à l’aide de DefaultRequestOptions).Create a QueueEncryptionPolicy object and set it in the request options (per API or at a client level by using DefaultRequestOptions). Tout le reste est géré par la bibliothèque cliente en interne.Everything else will be handled by the client library internally.

// Create the IKey used for encryption.
 RsaKey key = new RsaKey("private:key1" /* key identifier */);

 // Create the encryption policy to be used for upload and download.
 QueueEncryptionPolicy policy = new QueueEncryptionPolicy(key, null);

 // Add message
 QueueRequestOptions options = new QueueRequestOptions() { EncryptionPolicy = policy };
 queue.AddMessage(message, null, null, options, null);

 // Retrieve message
 CloudQueueMessage retrMessage = queue.GetMessage(null, options, null);

Chiffrement du service de TableTable service encryption

En plus de créer une stratégie de chiffrement et de la définir dans les options de requête, vous devez spécifier un EncryptionResolver dans TableRequestOptions ou définir l’attribut [EncryptProperty] sur l’entité.In addition to creating an encryption policy and setting it on request options, you must either specify an EncryptionResolver in TableRequestOptions, or set the [EncryptProperty] attribute on the entity.

Utilisation du programme de résolutionUsing the resolver

// Create the IKey used for encryption.
 RsaKey key = new RsaKey("private:key1" /* key identifier */);

 // Create the encryption policy to be used for upload and download.
 TableEncryptionPolicy policy = new TableEncryptionPolicy(key, null);

 TableRequestOptions options = new TableRequestOptions()
 {
    EncryptionResolver = (pk, rk, propName) =>
     {
        if (propName == "foo")
         {
            return true;
         }
         return false;
     },
     EncryptionPolicy = policy
 };

 // Insert Entity
 currentTable.Execute(TableOperation.Insert(ent), options, null);

 // Retrieve Entity
 // No need to specify an encryption resolver for retrieve
 TableRequestOptions retrieveOptions = new TableRequestOptions()
 {
    EncryptionPolicy = policy
 };

 TableOperation operation = TableOperation.Retrieve(ent.PartitionKey, ent.RowKey);
 TableResult result = currentTable.Execute(operation, retrieveOptions, null);

Utilisation des attributsUsing attributes

Comme mentionné ci-dessus, si l’entité implémente TableEntity, les propriétés peuvent être décorées avec l’attribut [EncryptProperty] au lieu de spécifier un EncryptionResolver.As mentioned above, if the entity implements TableEntity, then the properties can be decorated with the [EncryptProperty] attribute instead of specifying the EncryptionResolver.

[EncryptProperty]
 public string EncryptedProperty1 { get; set; }

Chiffrement et performancesEncryption and performance

Notez que le chiffrement de vos données de stockage affecte les performances.Note that encrypting your storage data results in additional performance overhead. La clé de contenu et le vecteur d’initialisation doivent être générés, le contenu proprement dit doit être chiffré et des métadonnées supplémentaires doivent être mises en forme et téléchargées.The content key and IV must be generated, the content itself must be encrypted, and additional meta-data must be formatted and uploaded. Cette surcharge varie selon la quantité de données chiffrées.This overhead will vary depending on the quantity of data being encrypted. Nous recommandons de tester systématiquement les performances des applications au cours du développement.We recommend that customers always test their applications for performance during development.

Étapes suivantesNext steps