Partager via


Classe System.Security.SecureString

Importante

Nous vous recommandons de ne pas utiliser la SecureString classe pour le nouveau développement sur .NET (Core) ou lorsque vous migrez du code existant vers .NET (Core). Pour plus d’informations, consultez SecureString ne doit pas être utilisé.

Cet article fournit des remarques supplémentaires à la documentation de référence de cette API.

SecureString est un type de chaîne qui fournit une mesure de sécurité. Il tente d’éviter de stocker des chaînes potentiellement sensibles dans la mémoire du processus sous forme de texte brut. (Pour connaître les limitations, consultez la section Comment secure is SecureString ? ) La valeur d’une instance de SecureString est automatiquement protégée à l’aide d’un mécanisme pris en charge par la plateforme sous-jacente lorsque l’instance est initialisée ou lorsque la valeur est modifiée. Votre application peut afficher l’instance immuable et empêcher toute modification supplémentaire en appelant la MakeReadOnly méthode.

La longueur maximale d’une SecureString instance est de 65 536 caractères.

Importante

Ce type implémente l’interface IDisposable . Une fois que vous avez fini d’utiliser une instance du type, vous devez la supprimer directement ou indirectement. Pour supprimer directement le type, appelez sa Dispose méthode dans un try/catch bloc. Pour la supprimer indirectement, utilisez une construction de langage telle que using (en C#) ou Using (en Visual Basic). Pour plus d’informations, consultez la section « Utilisation d’un objet implémentant IDisposable » dans la rubrique d’interface IDisposable .

La SecureString classe et ses membres ne sont pas visibles par COM. Pour plus d’informations, consultez ComVisibleAttribute.

String et SecureString

Une instance de la System.String classe est immuable et, lorsqu’elle n’est plus nécessaire, ne peut pas être planifiée par programme pour le garbage collection ; autrement dit, l’instance est en lecture seule après sa création et il n’est pas possible de prédire quand l’instance sera supprimée de la mémoire de l’ordinateur. Étant donné que System.String les instances sont immuables, les opérations qui semblent modifier une instance existante créent réellement une copie de celle-ci pour les manipuler. Par conséquent, si un String objet contient des informations sensibles telles qu’un mot de passe, un numéro de carte de crédit ou des données personnelles, il existe un risque que les informations puissent être révélées après son utilisation, car votre application ne peut pas supprimer les données de la mémoire de l’ordinateur.

Un SecureString objet est similaire à un String objet dans lequel il a une valeur de texte. Toutefois, la valeur d’un SecureString objet est épinglée en mémoire, peut utiliser un mécanisme de protection, tel que le chiffrement, fourni par le système d’exploitation sous-jacent, peut être modifiée jusqu’à ce que votre application le marque en lecture seule, et peut être supprimée de la mémoire de l’ordinateur soit par votre application appelant la méthode Dispose, soit par le collecteur de déchets .NET.

Pour une discussion sur les limitations de la classe SecureString, consultez la section Quelle est la sécurité de SecureString ?

Opérations SecureString

La SecureString classe inclut des membres qui vous permettent d’effectuer les opérations suivantes :

Instanciez un objet SecureString Vous instanciez un objet SecureString en appelant son constructeur sans paramètres.

Ajoutez des caractères à un objet SecureString. Vous pouvez ajouter un caractère unique à la fois à un objet SecureString en appelant sa méthode AppendChar ou InsertAt.

Importante

Un SecureString objet ne doit jamais être construit à partir d’un String, car les données sensibles sont déjà soumises aux conséquences de persistance de la mémoire de la classe immuable String . La meilleure façon de construire un SecureString objet consiste à partir d'une source non managée caractère par caractère, telle que la méthode Console.ReadKey.

Supprimer des caractères d’un SecureString objet Vous pouvez remplacer un caractère individuel en appelant la SetAt méthode, en supprimant un caractère individuel en appelant la RemoveAt méthode ou en supprimant tous les caractères de l’instance SecureString en appelant la Clear méthode.

Définissez l’objet SecureString en lecture seule une fois que vous avez défini la chaîne que l’objet SecureString représente, vous appelez sa MakeReadOnly méthode pour rendre la chaîne en lecture seule.

Obtenez des informations sur l’objet SecureString La SecureString classe n’a que deux membres qui fournissent des informations sur la chaîne : sa Length propriété, qui indique le nombre d’unités de code codées en UTF16 dans la chaîne ; et la IsReadOnlyméthode , qui indique si l’instance est en lecture seule.

Relâchez la mémoire allouée à l’instance SecureString , car SecureString implémente l’interface IDisposable , vous relâchez sa mémoire en appelant la Dispose méthode.

La SecureString classe n’a aucun membre qui inspecte, compare ou convertit la valeur d’un SecureString. L’absence de ces membres permet de protéger la valeur de l’instance contre une exposition accidentelle ou malveillante. Utilisez les membres appropriés de la System.Runtime.InteropServices.Marshal classe, tels que la SecureStringToBSTR méthode, pour manipuler la valeur d’un SecureString objet.

La bibliothèque de classes .NET utilise couramment les instances SecureString de la manière suivante :

SecureString et interop

Étant donné que le système d’exploitation ne prend pas directement en charge SecureString, vous devez convertir la valeur de l’objet SecureString en type de chaîne requis avant de passer la chaîne à une méthode native. La Marshal classe a cinq méthodes qui effectuent cette opération :

Chacune de ces méthodes crée une chaîne de texte clair en mémoire non managée. Il est de la responsabilité du développeur de mettre à zéro et de libérer cette mémoire dès qu'elle n'est plus nécessaire. Chacune des méthodes de conversion de chaîne et d’allocation de mémoire a une méthode correspondante de remise à zéro et de libération de la mémoire allouée.

Méthode d’allocation et de conversion Méthode zéro et libre
Marshal.SecureStringToBSTR Marshal.ZeroFreeBSTR
Marshal.SecureStringToCoTaskMemAnsi Marshal.ZeroFreeCoTaskMemAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeCoTaskMemUnicode
Marshal.SecureStringToGlobalAllocAnsi Marshal.ZeroFreeGlobalAllocAnsi
Marshal.SecureStringToGlobalAllocUnicode Marshal.ZeroFreeGlobalAllocUnicode

Comment SecureString est-il sécurisé ?

Lorsqu’elle est créée correctement, une SecureString instance fournit plus de protection des données qu’un String. Lors de la création d’une chaîne à partir d’une source caractère par caractère, String génère plusieurs objets intermédiaires en mémoire, tandis que SecureString ne crée qu'une seule instance. Le nettoyage de la mémoire des objets String n'est pas déterministe. En outre, étant donné que sa mémoire n’est pas épinglée, le récupérateur de mémoire effectue des copies supplémentaires de valeurs String lors du processus de déplacement et de compactage de la mémoire. En revanche, la mémoire fixée à un objet SecureString peut être libérée en appelant la méthode Dispose.

Bien que les données stockées dans une SecureString instance soient plus sécurisées que celles stockées dans une String instance, il existe des limitations significatives sur la façon dont une SecureString instance est sécurisée. Voici quelques-uns des éléments suivants :

Plate-forme

Sur le système d’exploitation Windows, le contenu du tableau de caractères interne d’une SecureString instance est chiffré. Toutefois, qu’il s’agisse d’API manquantes ou de problèmes de gestion de clés, le chiffrement n’est pas disponible sur toutes les plateformes. En raison de cette dépendance de plateforme, SecureString ne chiffre pas le stockage interne sur la plateforme non-Windows. D’autres techniques sont utilisées sur ces plateformes pour fournir une protection supplémentaire.

Durée

Même si l’implémentation SecureString est en mesure de tirer parti du chiffrement, le texte brut affecté à l’instance SecureString peut être exposé à différents moments :

  • Étant donné que Windows n’offre pas d’implémentation de chaîne sécurisée au niveau du système d’exploitation, .NET doit toujours convertir la valeur de chaîne sécurisée en sa représentation en texte brut afin de l’utiliser.

  • Chaque fois que la valeur de la chaîne sécurisée est modifiée par des méthodes telles que AppendChar ou RemoveAt, elle doit être déchiffrée (autrement dit, convertie en texte brut), modifiée, puis chiffrée à nouveau.

  • Si la chaîne sécurisée est utilisée dans un appel d’interopérabilité, elle doit être convertie en chaîne ANSI, chaîne Unicode ou chaîne binaire (BSTR). Pour plus d’informations, consultez la section SecureString et interopérabilité .

L’intervalle de temps pour lequel la valeur de l’instance SecureString est exposée est simplement raccourci par rapport à la String classe.

Le stockage et l’utilisation plus généralement, la SecureString classe définit un mécanisme de stockage pour les valeurs de chaîne qui doivent être protégées ou conservées confidentielles. Toutefois, en dehors de .NET lui-même, aucun mécanisme d’utilisation ne prend en charge SecureString. Cela signifie que la chaîne sécurisée doit être convertie en formulaire utilisable (généralement un formulaire de texte clair) qui peut être reconnu par sa cible, et que le déchiffrement et la conversion doivent se produire dans l’espace utilisateur.

Dans l’ensemble, SecureString est plus sécurisé que String parce qu’il limite l’exposition des données de chaîne sensibles. Toutefois, ces chaînes peuvent toujours être exposées à n’importe quel processus ou opération qui a accès à la mémoire brute, comme un processus malveillant s’exécutant sur l’ordinateur hôte, un vidage de processus ou un fichier d’échange visible par l’utilisateur. Au lieu d’utiliser SecureString pour protéger les mots de passe, l’alternative recommandée consiste à utiliser un handle opaque pour les informations d’identification stockées en dehors du processus.