Classe System.Security.SecureString
Important
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 vous offre des remarques complémentaires à la documentation de référence pour 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, toutefois, consultez le Comment SecureString est-il sécurisé ? section.) 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.
Important
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 Dispose, appelez sa méthode dans un bloc try
/catch
. Pour la supprimer indirectement, utilisez une construction de langage telle que using
(dans C#) ou Using
(dans Visual Basic). Pour plus d’informations, consultez la section « Utilisation d’un objet qui implémente IDisposable » dans la rubrique de l’interface IDisposable.
La SecureString classe et ses membres ne sont pas visibles par COM. Pour plus d’informations, consultez ComVisibleAttribute.
Chaîne 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 objet contient des informations sensibles telles qu’un String mot de passe, un crédit carte nombre 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é jusqu’à ce que votre application le marque en lecture seule et puisse être supprimée de la mémoire de l’ordinateur par votre application appelant la Dispose méthode ou par le garbage collector .NET.
Pour une discussion sur les limitations de la SecureString classe, consultez la section Comment secure is SecureString ?
Opérations SecureString
La SecureString classe inclut des membres qui vous permettent d’effectuer les opérations suivantes :
Instanciez un SecureString objet Que vous instanciez un SecureString objet en appelant son constructeur sans paramètre.
Ajoutez des caractères à un SecureString objet, vous pouvez ajouter un caractère unique à la fois à un SecureString objet en appelant son ou InsertAt sa AppendChar méthode.
Important
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 provient d’une source non managée à la fois, telle que la Console.ReadKey méthode.
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 SecureString couramment les instances de la manière suivante :
Pour fournir des informations de mot de passe à un processus à l’aide de la ProcessStartInfo structure ou en appelant une surcharge de la Process.Start méthode qui a un paramètre de type SecureString.
Pour fournir des informations de mot de passe réseau en appelant un NetworkCredential constructeur de classe qui a un paramètre de type SecureString ou à l’aide de la NetworkCredential.SecurePassword propriété.
Pour fournir des informations de mot de passe pour l’authentification SQL Server en appelant le SqlCredential.SqlCredential constructeur ou en récupérant la valeur de la SqlCredential.Password propriété.
Pour passer une chaîne à du code non managé. Pour plus d’informations, consultez la section SecureString et interopérabilité .
SecureString et interopérabilité
É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 :
Marshal.SecureStringToBSTR, qui convertit la SecureString valeur de chaîne en chaîne binaire (BSTR) reconnue par COM.
Marshal.SecureStringToCoTaskMemAnsi et Marshal.SecureStringToGlobalAllocAnsi, qui copient la SecureString valeur de chaîne dans une chaîne ANSI en mémoire non managée.
Marshal.SecureStringToCoTaskMemUnicode et Marshal.SecureStringToGlobalAllocUnicode, qui copient la SecureString valeur de chaîne dans une chaîne Unicode en mémoire non managée.
Chacune de ces méthodes crée une chaîne de texte clair en mémoire non managée. Il incombe au développeur de zéro sortir 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 à zéro et libère la mémoire allouée :
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 à la fois, String crée plusieurs intermédiaires en mémoire, tandis qu’il SecureString crée simplement une seule instance. Le garbage collection d’objets n’est String pas déterministe. En outre, étant donné que sa mémoire n’est pas épinglée, le garbage collector effectue des copies supplémentaires de valeurs lors du String déplacement et du compactage de la mémoire. En revanche, la mémoire allouée à un SecureString objet est épinglée et cette mémoire peut être libérée en appelant la Dispose méthode.
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. Il s’agit notamment des paramètres suivants :
Plateforme
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.
Stockage par rapport à 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.