Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Cet article fournit une vue d’ensemble des méthodes et pratiques de chiffrement prises en charge par .NET, y compris les manifestes ClickOnce.
Présentation du chiffrement
Les réseaux publics tels que l’Internet ne fournissent pas de moyens de communication sécurisée entre les entités. La communication sur ces réseaux est susceptible d’être lue ou même modifiée par des tiers non autorisés. Le chiffrement permet de protéger les données contre l’affichage, fournit des moyens de détecter si des données ont été modifiées et permettent de fournir un moyen sécurisé de communication sur des canaux non sécurisés. Par exemple, les données peuvent être chiffrées à l’aide d’un algorithme de chiffrement, transmises dans un état chiffré et déchiffrées ultérieurement par la partie prévue. Si un tiers intercepte les données chiffrées, il sera difficile de déchiffrer.
Dans .NET, les classes de l'espace de noms System.Security.Cryptography gèrent pour vous de nombreux détails de chiffrement. Certains sont des wrappers pour les implémentations du système d’exploitation, tandis que d’autres sont des implémentations purement managées. Vous n’avez pas besoin d’être un expert en chiffrement pour utiliser ces classes. Lorsque vous créez une instance de l’une des classes d’algorithme de chiffrement, les clés sont générées automatiquement pour faciliter l’utilisation et les propriétés par défaut sont aussi sécurisées que possible.
Primitives de chiffrement
Dans une situation typique où le chiffrement est utilisé, deux parties (Alice et Bob) communiquent sur un canal non sécurisé. Alice et Bob veulent s’assurer que leur communication reste incompréhensible par toute personne qui pourrait écouter. En outre, étant donné qu’Alice et Bob se trouvent dans des endroits éloignés, Alice doit s’assurer que les informations qu’elle reçoit de Bob n’ont pas été modifiées par toute personne pendant la transmission. En outre, elle doit s’assurer que l’information provient vraiment de Bob et non d’une personne qui emprunte l’identité de Bob.
Le chiffrement est utilisé pour atteindre les objectifs suivants :
Confidentialité : pour protéger l’identité ou les données d’un utilisateur contre la lecture.
Intégrité des données : pour protéger les données contre la modification.
Authentification : pour vous assurer que les données proviennent d’une partie particulière.
Non répudiation : pour empêcher une partie particulière de nier qu'elle a envoyé un message.
Pour atteindre ces objectifs, vous pouvez utiliser une combinaison d’algorithmes et de pratiques appelés primitives de chiffrement pour créer un schéma de chiffrement. Le tableau suivant répertorie les primitives de chiffrement et leurs utilisations.
| Primitive de chiffrement | Utiliser |
|---|---|
| Chiffrement à clé secrète (chiffrement symétrique) | Effectue une transformation sur les données pour qu’elles ne soient pas lues par des tiers. Ce type de chiffrement utilise une clé secrète partagée unique pour chiffrer et déchiffrer les données. |
| Chiffrement à clé publique (chiffrement asymétrique) | Effectue une transformation sur les données pour qu’elles ne soient pas lues par des tiers. Ce type de chiffrement utilise une paire de clés publique/privée pour chiffrer et déchiffrer des données. |
| Signature de chiffrement | Permet de vérifier que les données proviennent d’une partie spécifique en créant une signature numérique unique à cette partie. Ce processus utilise également des fonctions de hachage. |
| Hachages cryptographiques | Mappe les données de n’importe quelle longueur à une séquence d’octets de longueur fixe. Les hachages sont statistiquement uniques ; Une séquence à deux octets différente ne se hachagera pas sur la même valeur. |
Chiffrement à clé secrète
Les algorithmes de chiffrement à clé secrète utilisent une clé secrète unique pour chiffrer et déchiffrer les données. Vous devez sécuriser la clé contre l'accès des agents non autorisés, car toute partie disposant de la clé peut l'utiliser pour déchiffrer vos données ou chiffrer ses propres données, en prétendant qu'elle provient de vous.
Le chiffrement de clé secrète est également appelé chiffrement symétrique, car la même clé est utilisée pour le chiffrement et le déchiffrement. Les algorithmes de chiffrement à clé secrète sont très rapides (comparés aux algorithmes de clé publique) et conviennent parfaitement à l’exécution de transformations de chiffrement sur de grands flux de données. Les algorithmes de chiffrement asymétrique tels que RSA sont limités mathématiquement dans la quantité de données qu’ils peuvent chiffrer. Les algorithmes de chiffrement symétrique n’ont généralement pas ces problèmes.
Un type d’algorithme de clé secrète appelé chiffrement de bloc est utilisé pour chiffrer un bloc de données à la fois. Les chiffrements de bloc tels que Data Encryption Standard (DES), TripleDES et Advanced Encryption Standard (AES) transforment par chiffrement un bloc d’entrée de n octets en bloc de sortie d’octets chiffrés. Si vous souhaitez chiffrer ou déchiffrer une séquence d’octets, vous devez le bloquer par bloc. Étant donné que n est petit (8 octets pour DES et TripleDES ; 16 octets [valeur par défaut], 24 octets ou 32 octets pour AES), les valeurs de données supérieures à n doivent être chiffrées un bloc à la fois. Les valeurs de données inférieures à n doivent être étendues à n pour être traitées.
Une forme simple de chiffrement de bloc est appelée mode de codebook électronique (BCE). Le mode BCE n’est pas considéré comme sécurisé, car il n’utilise pas de vecteur d’initialisation pour initialiser le premier bloc en texte brut. Pour une clé secrète k donnée, un chiffrement de bloc simple qui n’utilise pas de vecteur d’initialisation chiffre le même bloc d’entrée de texte brut dans le même bloc de sortie de texte chiffré. Par conséquent, si vous avez des blocs en double dans votre flux en texte clair d’entrée, vous aurez des blocs en double dans votre flux de texte chiffré de sortie. Ces blocs de sortie en double alertent les utilisateurs non autorisés au faible chiffrement utilisé par des algorithmes qui pourraient avoir été employés, ainsi qu'aux modes d'attaque possibles. Le mode de chiffrement BCE est donc très vulnérable à l’analyse et, finalement, à la découverte de clés.
Les classes de chiffrement de bloc fournies dans la bibliothèque de classes de base utilisent un mode de chaînage par défaut appelé chaînage de blocs de chiffrement (CBC), bien que vous puissiez modifier cette valeur par défaut si vous le souhaitez.
Les chiffrements CBC dépassent les problèmes associés aux chiffrements BCE à l’aide d’un vecteur d’initialisation (IV) pour chiffrer le premier bloc de texte brut. Chaque bloc de texte en clair suivant subit une opération OR (XOR) exclusive au niveau du bit avec le bloc de texte chiffré précédent avant qu’il ne soit chiffré. Chaque bloc de texte chiffré dépend donc de tous les blocs précédents. Lorsque ce système est utilisé, les en-têtes de message courants qui peuvent être connus d’un utilisateur non autorisé ne peuvent pas être utilisés pour inverser l’ingénierie d’une clé.
Une façon de compromettre les données chiffrées avec un chiffrement CBC consiste à effectuer une recherche exhaustive de chaque clé possible. En fonction de la taille de la clé utilisée pour effectuer le chiffrement, ce type de recherche est très fastidieux à l’aide même des ordinateurs les plus rapides et est donc infeasible. Les tailles de clés plus grandes sont plus difficiles à déchiffrer. Bien que le chiffrement ne rend pas théoriquement impossible pour un adversaire de récupérer les données chiffrées, il augmente le coût de cette opération. S’il faut trois mois pour effectuer une recherche exhaustive pour récupérer des données significatives seulement quelques jours, la méthode de recherche exhaustive est peu pratique.
L’inconvénient du chiffrement de clé secrète est qu’il présume que deux parties ont convenu d’une clé et d’un IV et ont communiqué leurs valeurs. L’IV n’est pas considéré comme un secret et peut être transmis en texte clair avec le message. Toutefois, la clé doit être conservée secrète des utilisateurs non autorisés. En raison de ces problèmes, le chiffrement de clé secrète est souvent utilisé avec le chiffrement à clé publique pour communiquer en privé les valeurs de la clé et de l’IV.
En supposant qu’Alice et Bob sont deux parties qui souhaitent communiquer sur un canal non sécurisé, elles peuvent utiliser le chiffrement de clé secrète comme suit : Alice et Bob acceptent d’utiliser un algorithme particulier (AES, par exemple) avec une clé particulière et iv. Alice compose un message et crée un flux réseau (peut-être un canal nommé ou un e-mail réseau) sur lequel envoyer le message. Ensuite, elle chiffre le texte à l’aide de la clé et de l’IV, et envoie le message chiffré et IV à Bob sur l’intranet. Bob reçoit le texte chiffré et le déchiffre à l’aide de l'IV et de la clé convenue auparavant. Si la transmission est interceptée, l’intercepteur ne peut pas récupérer le message d’origine, car il ne connaît pas la clé. Dans ce scénario, seule la clé doit rester secrète. Dans un scénario réel, Alice ou Bob génère une clé secrète et utilise le chiffrement à clé publique (asymétrique) pour transférer la clé secrète (symétrique) vers l’autre partie. Pour plus d’informations sur le chiffrement à clé publique, consultez la section suivante.
.NET fournit les classes suivantes qui implémentent des algorithmes de chiffrement de clé secrète :
HMACSHA256, HMACSHA384 et HMACSHA512. (Il s’agit d’algorithmes de clé secrète technique, car ils représentent des codes d’authentification de message calculés à l’aide d’une fonction de hachage de chiffrement combinée à une clé secrète. Voir Valeurs de hachage, plus loin dans cet article.)
Chiffrement à clé publique
Le chiffrement à clé publique utilise une clé privée qui doit être conservée secrète d’utilisateurs non autorisés et d’une clé publique qui peut être rendue publique à toute personne. La clé publique et la clé privée sont mathématiquement liées ; les données chiffrées avec la clé publique peuvent être déchiffrées uniquement avec la clé privée, et les données signées avec la clé privée peuvent être vérifiées uniquement avec la clé publique. La clé publique peut être rendue accessible à tout le monde ; il est utilisé pour chiffrer les données à envoyer au gardien de la clé privée. Les algorithmes de chiffrement à clé publique sont également appelés algorithmes asymétriques, car une clé est nécessaire pour chiffrer les données, et une autre clé est nécessaire pour déchiffrer les données. Une règle de chiffrement de base interdit la réutilisation des clés, et les deux clés doivent être uniques pour chaque session de communication. Toutefois, dans la pratique, les clés asymétriques sont généralement durables.
Deux parties (Alice et Bob) peuvent utiliser le chiffrement à clé publique comme suit : Tout d’abord, Alice génère une paire de clés publique/privée. Si Bob veut envoyer un message chiffré à Alice, il lui demande sa clé publique. Alice envoie bob sa clé publique sur un réseau non sécurisé, et Bob utilise cette clé pour chiffrer un message. Bob envoie le message chiffré à Alice, et elle le déchiffre à l’aide de sa clé privée. Si Bob a reçu la clé d’Alice sur un canal non sécurisé, tel qu’un réseau public, Bob est ouvert à une attaque man-in-the-middle. Par conséquent, Bob doit vérifier avec Alice qu’il a une copie correcte de sa clé publique.
Pendant la transmission de la clé publique d’Alice, un agent non autorisé peut intercepter la clé. En outre, le même agent peut intercepter le message chiffré de Bob. Toutefois, l’agent ne peut pas déchiffrer le message avec la clé publique. Le message ne peut être déchiffré qu’avec la clé privée d’Alice, qui n’a pas été transmise. Alice n’utilise pas sa clé privée pour chiffrer un message de réponse à Bob, car toute personne disposant de la clé publique peut déchiffrer le message. Si Alice veut renvoyer un message à Bob, elle demande à Bob pour sa clé publique et chiffre son message à l’aide de cette clé publique. Bob déchiffre ensuite le message à l’aide de sa clé privée associée.
Dans ce scénario, Alice et Bob utilisent le chiffrement à clé publique (asymétrique) pour transférer une clé secrète (symétrique) et utiliser le chiffrement de clé secrète pour le reste de leur session.
La liste suivante propose des comparaisons entre les algorithmes de chiffrement de clé publique et de clé secrète :
Les algorithmes de chiffrement à clé publique utilisent une taille de mémoire tampon fixe, tandis que les algorithmes de chiffrement à clé secrète utilisent une mémoire tampon de longueur variable.
Les algorithmes à clé publique ne peuvent pas être utilisés pour chaîner des données en flux comme le font les algorithmes à clé secrète, car seules de petites quantités de données peuvent être chiffrées avec eux. Par conséquent, les opérations asymétriques n’utilisent pas le même modèle de streaming que les opérations symétriques.
Le chiffrement à clé publique a un espace de clés beaucoup plus grand (plage de valeurs possibles pour la clé) que le chiffrement de clé secrète. Par conséquent, le chiffrement à clé publique est moins vulnérable aux attaques exhaustives qui essaient toutes les clés possibles.
Les clés publiques sont faciles à distribuer, car elles n’ont pas besoin d’être sécurisées, à condition qu’il existe une certaine façon de vérifier l’identité de l’expéditeur.
Certains algorithmes de clé publique (tels que RSA et DSA, mais pas Diffie-Hellman) peuvent être utilisés pour créer des signatures numériques pour vérifier l’identité de l’expéditeur des données.
Les algorithmes de clé publique sont très lents par rapport aux algorithmes de clé secrète et ne sont pas conçus pour chiffrer de grandes quantités de données. Les algorithmes de clé publique sont utiles uniquement pour transférer de très petites quantités de données. En règle générale, le chiffrement à clé publique est utilisé pour chiffrer la clé et le vecteur d'initialisation destiné à être utilisé par un algorithme à clé secrète. Une fois la clé et la clé IV transférées, le chiffrement de clé secrète est utilisé pour le reste de la session.
.NET fournit les classes suivantes qui implémentent des algorithmes de clé publique :
RSA autorise le chiffrement et la signature, mais DSA ne peut être utilisé que pour la signature. DSA n’est pas aussi sécurisé que RSA et nous recommandons RSA. Diffie-Hellman ne peut être utilisé que pour la génération de clés. En général, les algorithmes de clé publique sont plus limités dans leurs utilisations que les algorithmes de clé privée.
Signatures numériques
Les algorithmes de clé publique peuvent également être utilisés pour former des signatures numériques. Les signatures numériques authentifient l’identité d’un expéditeur (si vous approuvez la clé publique de l’expéditeur) et aident à protéger l’intégrité des données. À l’aide d’une clé publique générée par Alice, le destinataire des données d’Alice peut vérifier qu’Alice l’a envoyée en comparant la signature numérique aux données d’Alice et à la clé publique d’Alice.
Pour utiliser le chiffrement à clé publique pour signer numériquement un message, Alice applique d’abord un algorithme de hachage au message pour créer une synthèse de message. La synthèse des messages est une représentation compacte et unique des données. Alice chiffre ensuite le message digest avec sa clé privée pour créer sa signature personnelle. Lors de la réception du message et de la signature, Bob déchiffre la signature à l’aide de la clé publique d’Alice pour récupérer le résumé du message et hachage le message à l’aide du même algorithme de hachage utilisé par Alice. Si le résumé du message que Bob calcule exactement correspond au résumé du message reçu d’Alice, Bob est assuré que le message provient du possesseur de la clé privée et que les données n’ont pas été modifiées. Si Bob fait confiance à Alice est le possesseur de la clé privée, il sait que le message provient d’Alice.
Remarque
Une signature peut être vérifiée par toute personne, car la clé publique de l’expéditeur est une connaissance commune et est généralement incluse dans le format de signature numérique. Cette méthode ne conserve pas le secret du message ; pour que le message soit secret, il doit également être chiffré.
.NET fournit les classes suivantes qui implémentent des algorithmes de signature numérique :
Valeurs de hachage
Les algorithmes de hachage mappent les valeurs binaires d’une longueur arbitraire à des valeurs binaires plus petites d’une longueur fixe, appelées valeurs de hachage. Une valeur de hachage est une représentation numérique d’un élément de données. Si vous hachagez un paragraphe de texte en clair et modifiez même une lettre du paragraphe, un hachage suivant génère une valeur différente. Si le hachage est cryptographiquement robuste, sa valeur change fortement. Par exemple, si un seul bit d’un message est modifié, une fonction de hachage forte peut produire une sortie qui diffère de 50 %. De nombreuses valeurs d’entrée peuvent se hacher sur la même valeur de sortie. Toutefois, il est calculatoirement infaisable de trouver deux entrées distinctes qui hachent à la même valeur.
Deux parties (Alice et Bob) peuvent utiliser une fonction de hachage pour garantir l’intégrité des messages. Ils sélectionnent un algorithme de hachage pour signer leurs messages. Alice écrit un message, puis crée un hachage de ce message à l’aide de l’algorithme sélectionné. Ils suivent ensuite l’une des méthodes suivantes :
Alice envoie le message en texte clair et le message haché (signature numérique) à Bob. Bob reçoit et hache le message, puis compare sa valeur de hachage à celle qu’il a reçue d’Alice. Si les valeurs de hachage sont identiques, le message n’a pas été modifié. Si les valeurs ne sont pas identiques, le message a été modifié après qu’Alice l’a écrit.
Malheureusement, cette méthode n’établit pas l’authenticité de l’expéditeur. Tout le monde peut emprunter l’identité d’Alice et envoyer un message à Bob. Ils peuvent utiliser le même algorithme de hachage pour signer leur message, et tout ce que Bob peut déterminer, c'est que le message correspond à sa signature. Il s'agit d'une forme d'attaque de l'intercepteur. Pour plus d’informations, consultez l’exemple de communication sécurisée CNG (Cryptography Next Generation).
Alice envoie le message en texte clair à Bob via un canal public non sécurisé. Elle envoie le message haché à Bob sur un canal privé sécurisé. Bob reçoit le message en texte clair, le hache, et compare le hachage à celui échangé en privé. Si les hachages correspondent, Jean peut en déduire deux choses :
Le message n’a pas été modifié.
L’expéditeur du message (Alice) est authentique.
Pour que ce système fonctionne, Alice doit cacher sa valeur de hachage d’origine à toutes les parties, sauf Bob.
Alice envoie le message en texte clair à Bob sur un canal public non sécurisé et place le message haché sur son site Web visible publiquement.
Cette méthode empêche toute falsification de message en empêchant toute personne de modifier la valeur de hachage. Bien que le message et son hachage puissent être lus par n’importe qui, la valeur de hachage ne peut être modifiée que par Alice. Un attaquant qui souhaite emprunter l’identité d’Alice nécessite l’accès au site Web d’Alice.
Aucune des méthodes précédentes n’empêchera quelqu’un de lire les messages d’Alice, car ils sont transmis en texte clair. La sécurité complète nécessite généralement des signatures numériques (signature de message) et un chiffrement.
.NET fournit les classes suivantes qui implémentent des algorithmes de hachage :
.NET fournit également MD5 et SHA1. Mais les algorithmes MD5 et SHA-1 ont été détectés comme non sécurisés, et SHA-2 est désormais recommandé à la place. SHA-2 inclut SHA256, SHA384 et SHA512.
Génération de nombres aléatoires
La génération de nombres aléatoires est intégrale à de nombreuses opérations de chiffrement. Par exemple, les clés de chiffrement doivent être aussi aléatoires que possible afin qu'il soit impossible de les reproduire. Les générateurs de nombres aléatoires cryptographiques doivent produire une sortie qu'il est impossible de prédire avec une probabilité supérieure à un demi. Par conséquent, toute méthode de prédiction du bit de sortie suivant ne doit pas fonctionner mieux que l’estimation aléatoire. Les classes de .NET utilisent des générateurs de nombres aléatoires pour générer des clés de chiffrement.
La RandomNumberGenerator classe est une implémentation d’un algorithme de générateur de nombres aléatoires.
Manifestes ClickOnce
Les classes de chiffrement suivantes vous permettent d’obtenir et de vérifier des informations sur les signatures de manifeste pour les applications déployées à l’aide de la technologie ClickOnce :
La ManifestSignatureInformation classe obtient des informations sur une signature de manifeste lorsque vous utilisez ses VerifySignature surcharges de méthode.
Vous pouvez utiliser l’énumération ManifestKinds pour spécifier les manifestes à vérifier. Le résultat de la vérification est l'une des valeurs d'énumération SignatureVerificationResult .
La ManifestSignatureInformationCollection classe fournit une collection en lecture seule d’objets ManifestSignatureInformation des signatures vérifiées.
En outre, les classes suivantes fournissent des informations de signature spécifiques :
StrongNameSignatureInformation contient les informations de signature de nom fort d’un manifeste.
AuthenticodeSignatureInformation représente les informations de signature Authenticode pour un manifeste.
TimestampInformation contient des informations sur l’horodatage sur une signature Authenticode.
TrustStatus fournit un moyen simple de vérifier si une signature Authenticode est approuvée.
Classes CNG (Cryptography Next Generation)
Les classes CNG (Cryptography Next Generation) fournissent un wrapper managé autour des fonctions CNG natives. (CNG est le remplacement de CryptoAPI.) Ces classes ont « Cng » dans le cadre de leurs noms. Au cœur des classes wrapper CNG se trouve la CngKey classe de conteneur de clés, qui abstrait le stockage et l’utilisation des clés CNG. Cette classe vous permet de stocker une paire de clés ou une clé publique en toute sécurité et de les référencer à l’aide d’un nom de chaîne simple. La classe de signature elliptique basée sur ECDsaCng la courbe et la classe de ECDiffieHellmanCng chiffrement peuvent utiliser des CngKey objets.
La CngKey classe est utilisée pour diverses opérations supplémentaires, notamment l’ouverture, la création, la suppression et l’exportation de clés. Elle permet aussi d'accéder au handle de clé sous-jacent à utiliser quand il s'agit d'appeler des fonctions natives directement.
.NET inclut également une variété de classes CNG d'assistance, telles que les suivantes :
CngProvider dispose d’un fournisseur de stockage de clés.
CngAlgorithm dispose d’un algorithme CNG.
CngProperty gère les propriétés de clé fréquemment utilisées.
Voir aussi
- Modèle de chiffrement : décrit comment le chiffrement est implémenté dans la bibliothèque de classes de base.
- Chiffrement multiplateforme
- Vulnérabilités de temporisation avec le déchiffrement symétrique en mode CBC à l’aide du remplissage
- protection des données de base ASP.NET