SecureString Classe

Définition

Représente le texte qui doit rester confidentiel, par exemple en le supprimant de la mémoire de l'ordinateur quand il n'est plus nécessaire.Represents text that should be kept confidential, such as by deleting it from computer memory when no longer needed. Cette classe ne peut pas être héritée.This class cannot be inherited.

public ref class SecureString sealed : IDisposable
public sealed class SecureString : IDisposable
type SecureString = class
    interface IDisposable
Public NotInheritable Class SecureString
Implements IDisposable
Héritage
SecureString
Implémente

Exemples

L’exemple suivant montre comment utiliser un SecureString pour sécuriser le mot de passe d’un utilisateur en vue de son utilisation en tant qu’informations d’identification pour démarrer un nouveau processus.The following example demonstrates how to use a SecureString to secure a user's password for use as a credential to start a new process.

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Security;

public class Example
{
    public static void Main()
    {
        // Instantiate the secure string.
        SecureString securePwd = new SecureString();
        ConsoleKeyInfo key;

        Console.Write("Enter password: ");
        do {
           key = Console.ReadKey(true);
           
           // Ignore any key out of range.
           if (((int) key.Key) >= 65 && ((int) key.Key <= 90)) {
              // Append the character to the password.
              securePwd.AppendChar(key.KeyChar);
              Console.Write("*");
           }   
        // Exit if Enter key is pressed.
        } while (key.Key != ConsoleKey.Enter);
        Console.WriteLine();
        
        try {
            Process.Start("Notepad.exe", "MyUser", securePwd, "MYDOMAIN");
        }
        catch (Win32Exception e) {
            Console.WriteLine(e.Message);
        }
        finally {
           securePwd.Dispose();
        }
    }
}
Imports System.ComponentModel
Imports System.Diagnostics
Imports System.Security

Public Class Example
    Public Shared Sub Main()
        ' Instantiate the secure string.
        Dim securePwd As New SecureString()
        Dim key As ConsoleKeyInfo
        
        Console.Write("Enter password: ")
        Do
           key = Console.ReadKey(True)

           ' Ignore any key out of range
           If CInt(key.Key) >= 65 And CInt(key.Key <= 90) Then    
              ' Append the character to the password.
              securePwd.AppendChar(key.KeyChar)
              Console.Write("*")
           End If                                    
        ' Exit if Enter key is pressed.
        Loop While key.Key <> ConsoleKey.Enter
        Console.WriteLine()
        
        Try
            Process.Start("Notepad.exe", "MyUser", securePwd, "MYDOMAIN")
        Catch e As Win32Exception
            Console.WriteLine(e.Message)
        Finally
           securePwd.Dispose()
        End Try
    End Sub
End Class

Remarques

Important

Nous vous déconseillons d’utiliser SecureString la classe pour un nouveau développement.We don't recommend that you use the SecureString class for new development. Pour plus d’informations, consultez SecureString ne doit pas être utilisé sur GitHub.For more information, see SecureString shouldn't be used on GitHub.

SecureStringtype chaîne qui fournit une mesure de sécurité.SecureString is a string type that provides a measure of security. Il tente d’éviter de stocker des chaînes potentiellement sensibles dans la mémoire de processus sous forme de texte brut.It tries to avoid storing potentially sensitive strings in process memory as plain text. (Toutefois, pour les limitations, consultez la section Comment sécuriser le mode 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.(For limitations, however, see the How secure is SecureString? section.) The value of an instance of SecureString is automatically protected using a mechanism supported by the underlying platform when the instance is initialized or when the value is modified. Votre application peut restituer l’instance immuable et empêcher toute modification supplémentaire en appelant la MakeReadOnly méthode.Your application can render the instance immutable and prevent further modification by invoking the MakeReadOnly method.

La longueur maximale d’une SecureString instance est de 65 536 caractères.The maximum length of a SecureString instance is 65,536 characters.

Important

Ce type implémente l'interface IDisposable.This type implements the IDisposable interface. Lorsque vous avez fini d’utiliser une instance du type, vous devez la supprimer directement ou indirectement.When you have finished using an instance of the type, you should dispose of it either directly or indirectly. Pour supprimer directement le type Dispose, appelez sa méthode dans un bloc try/catch.To dispose of the type directly, call its Dispose method in a try/catch block. Pour la supprimer indirectement, utilisez une construction de langage telle que using (dans C#) ou Using (dans Visual Basic).To dispose of it indirectly, use a language construct such as using (in C#) or Using (in Visual Basic). Pour plus d’informations, consultez la section « Utilisation d’un objet qui implémente IDisposable » dans la rubrique de l’interface IDisposable.For more information, see the "Using an Object that Implements IDisposable" section in the IDisposable interface topic.

La SecureString classe et ses membres ne sont pas visibles par com.The SecureString class and its members are not visible to COM. Pour plus d'informations, consultez ComVisibleAttribute.For more information, see ComVisibleAttribute.

Dans cette section :In this section:

Chaîne et SecureString String vs. SecureString
Opérations SecureString SecureString operations
SecureString et Interop SecureString and interop
Quelle est la sécurité de SecureString?How secure is SecureString?

Chaîne et SecureStringString versus SecureString

Une instance de la System.String classe est à la fois immuable et, quand vous n’en avez plus besoin, elle ne peut pas être planifiée par programmation pour 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é de la mémoire de l’ordinateur.An instance of the System.String class is both immutable and, when no longer needed, cannot be programmatically scheduled for garbage collection; that is, the instance is read-only after it is created, and it is not possible to predict when the instance will be deleted from computer memory. Étant System.String donné que les instances sont immuables, les opérations qui semblent modifier une instance existante créent en fait une copie à manipuler.Because System.String instances are immutable, operations that appear to modify an existing instance actually create a copy of it to manipulate. Par conséquent, si String un 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 soient révélées après leur utilisation, car votre application ne peut pas supprimer les données de la mémoire de l’ordinateur .Consequently, if a String object contains sensitive information such as a password, credit card number, or personal data, there is a risk the information could be revealed after it is used because your application cannot delete the data from computer memory.

Un SecureString objet est semblable à un String objet en ce qu’il a une valeur de texte.A SecureString object is similar to a String object in that it has a text value. 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 comme étant en lecture seule et qu’il puisse être supprimé de la mémoire de l’ordinateur. soit par votre application appelant la Dispose méthode, soit par le garbage collector .NET Framework.However, the value of a SecureString object is pinned in memory, may use a protection mechanism, such as encryption, provided by the underlying operating system, can be modified until your application marks it as read-only, and can be deleted from computer memory either by your application calling the Dispose method or by the .NET Framework garbage collector.

Pour plus d’informations sur les limitations de SecureString la classe, consultez la section How Secured is SecureString .For a discussion of the limitations of the SecureString class, see the How secure is SecureString? section.

Retour au débutBack to top

Opérations SecureStringSecureString operations

La SecureString classe comprend des membres qui vous permettent d’effectuer les opérations suivantes:The SecureString class includes members that allow you to do the following:

Instancier SecureString un objetInstantiate a SecureString object
Vous instanciez SecureString un objet en appelant son constructeur sans paramètre.You instantiate a SecureString object by calling its parameterless constructor.

Ajouter des caractères à SecureString un objetAdd characters to a SecureString object
Vous pouvez ajouter un seul caractère à la fois à un SecureString objet en appelant sa AppendChar méthode InsertAt ou.You can add a single character at a time to a SecureString object by calling its AppendChar or InsertAt method.

Important

Un SecureString objet ne doit jamais être construit à Stringpartir d’un, car les données sensibles sont déjà soumises aux conséquences de la persistance de String la mémoire de la classe immuable.A SecureString object should never be constructed from a String, because the sensitive data is already subject to the memory persistence consequences of the immutable String class. La meilleure façon de construire un SecureString objet provient d’une source non managée à caractère à la fois, telle que la Console.ReadKey méthode.The best way to construct a SecureString object is from a character-at-a-time unmanaged source, such as the Console.ReadKey method.

Supprimer les caractères d' SecureString un objetRemove characters from a SecureString object
Vous pouvez remplacer un caractère individuel en appelant la SetAt méthode, supprimer un caractère individuel en appelant la RemoveAt méthode, ou supprimer tous les caractères de SecureString l’instance en appelant Clear la méthode.You can replace an individual character by calling the SetAt method, remove an individual character by calling the RemoveAt method, or remove all characters from the SecureString instance by calling the Clear method.

Rendre l' SecureString objet en lecture seuleMake the SecureString object read-only
Une fois que vous avez défini la chaîne SecureString que l’objet représente, vous MakeReadOnly appelez sa méthode pour que la chaîne soit en lecture seule.Once you have defined the string that the SecureString object represents, you call its MakeReadOnly method to make the string read-only.

Obtenir des informations sur SecureString l’objetGet information about the SecureString object
La SecureString classe n’a que deux membres qui fournissent des informations sur la chaîne Length : sa propriété, qui indique le nombre d’unités de code encodées en UTF16 dans la chaîne IsReadOnly; et la méthode, qui indique si l’instance est lecture seule.The SecureString class has only two members that provide information about the string: its Length property, which indicates the number of UTF16-encoded code units in the string; and the IsReadOnly, method, which indicates whether the instance is read-only.

Libérer la mémoire allouée SecureString à l’instanceRelease the memory allocated to the SecureString instance
Étant SecureString donné que implémente l' IDisposable interface, vous libérez sa mémoire Dispose en appelant la méthode.Because SecureString implements the IDisposable interface, you release its memory by calling the Dispose method.

La SecureString classe n’a aucun membre qui inspecte, compare ou convertit SecureStringla valeur d’un.The SecureString class has no members that inspect, compare, or convert the value of a SecureString. L’absence de ces membres contribue à protéger la valeur de l’instance contre toute exposition accidentelle ou malveillante.The absence of such members helps protect the value of the instance from accidental or malicious exposure. Utilisez les membres appropriés de System.Runtime.InteropServices.Marshal la classe, tels que SecureStringToBSTR la méthode, pour manipuler la valeur d' SecureString un objet.Use appropriate members of the System.Runtime.InteropServices.Marshal class, such as the SecureStringToBSTR method, to manipulate the value of a SecureString object.

La bibliothèque de classes .NET Framework utilise SecureString généralement des instances des manières suivantes:The .NET Framework Class Library commonly uses SecureString instances in the following ways:

Retour au débutBack to top

SecureString et InteropSecureString and interop

Étant donné que le système d’exploitation ne SecureStringprend pas directement en charge, vous devez SecureString convertir la valeur de l’objet en type de chaîne requis avant de passer la chaîne à une méthode native.Because the operating system does not directly support SecureString, you must convert the value of the SecureString object to the required string type before passing the string to a native method. La Marshal classe a cinq méthodes qui le font:The Marshal class has five methods that do this:

Chacune de ces méthodes crée une chaîne de texte clair dans la mémoire non managée.Each of these methods creates a clear-text string in unmanaged memory. Il incombe au développeur de zéro et de libérer cette mémoire dès qu’elle n’est plus nécessaire.It is the responsibility of the developer to zero out and free that memory as soon as it is no longer needed. 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:Each of the string conversion and memory allocation methods has a corresponding method to zero out and free the allocated memory:

Méthode d’allocation et de conversionAllocation and conversion method Méthode Zero et FreeZero and free method
Marshal.SecureStringToBSTR Marshal.ZeroFreeBSTR
Marshal.SecureStringToCoTaskMemAnsi Marshal.ZeroFreeCoTaskMemAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeCoTaskMemUnicode
Marshal.SecureStringToGlobalAllocAnsi Marshal.ZeroFreeGlobalAllocAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeGlobalAllocUnicode

Retour au débutBack to top

Quelle est la sécurité de SecureString?How secure is SecureString?

Lorsqu’elle est créée correctement SecureString , une instance fournit plus de protection Stringdes données qu’un.When created properly, a SecureString instance provides more data protection than a String. Lors de la création d’une chaîne à partir d’une source caractère à la String fois, crée plusieurs intermédiaires en mémoire SecureString , tandis que crée une seule instance.When creating a string from a character-at-a-time source, String creates multiple intermediate in memory, whereas SecureString creates just a single instance. Le garbage collection String d’objets n’est pas déterministe.Garbage collection of String objects is non-deterministic. En outre, étant donné que sa mémoire n’est pas épinglée, le garbage collector crée String des copies supplémentaires des valeurs lors du déplacement et du compactage de la mémoire.In addition, because its memory is not pinned, the garbage collector will make additional copies of String values when moving and compacting memory. En revanche, la mémoire allouée SecureString à un objet est épinglée et cette mémoire peut être libérée en Dispose appelant la méthode.In contrast, the memory allocated to a SecureString object is pinned, and that memory can be freed by calling the Dispose method.

Bien que les données stockées SecureString dans une instance soient plus sécurisées que les String données stockées dans une instance, il existe des limitations SecureString importantes sur la sécurisation d’une instance.Although data stored in a SecureString instance is more secure than data stored in a String instance, there are significant limitations on how secure a SecureString instance is. Elles incluent notamment :These include:

PlateformePlatform
Sur le système d’exploitation Windows, le contenu du SecureString tableau de caractères interne d’une instance est chiffré.On the Windows operating system, the contents of a SecureString instance's internal character array are encrypted. Toutefois, en raison des API manquantes ou des problèmes de gestion de clés, le chiffrement n’est pas disponible sur toutes les plateformes.However, whether because of missing APIs or key management issues, encryption is not available on all platforms. En raison de cette dépendance de SecureString plateforme, ne chiffre pas le stockage interne sur une plateforme non-Windows.Because of this platform dependency, SecureString does not encrypt the internal storage on non-Windows platform. D’autres techniques sont utilisées sur ces plateformes pour fournir une protection supplémentaire.Other techniques are used on those platforms to provide additional protection.

DurationDuration
Même si l' SecureString implémentation est en mesure de tirer parti du chiffrement, le texte brut affecté SecureString à l’instance peut être exposé à différents moments:Even if the SecureString implementation is able to take advantage of encryption, the plain text assigned to the SecureString instance may be exposed at various times:

  • Étant donné que Windows n’offre pas une implémentation de chaîne sécurisée au niveau du système d’exploitation, le .NET Framework doit toujours convertir la valeur de chaîne sécurisée en sa représentation en texte brut afin de l’utiliser.Because Windows doesn't offer a secure string implementation at the operating system level, the .NET Framework still has to convert the secure string value to its plain text representation in order to use it.

  • Chaque fois que la valeur de la chaîne sécurisée est modifiée par AppendChar des RemoveAtméthodes telles que ou, elle doit être déchiffrée (c’est-à-dire reconvertie en texte brut), modifiée, puis chiffrée à nouveau.Whenever the value of the secure string is modified by methods such as AppendChar or RemoveAt, it must be decrypted (that is, converted back to plain text), modified, and then encrypted again.

  • Si la chaîne sécurisée est utilisée dans un appel Interop, elle doit être convertie en une chaîne ANSI, une chaîne Unicode ou une chaîne binaire (BSTR).If the secure string is used in an interop call, it must be converted to an ANSI string, a Unicode string, or a binary string (BSTR). Pour plus d’informations, consultez la section SecureString et Interop .For more information, see the SecureString and interop section.

L’intervalle de temps pendant lequel SecureString la valeur de l’instance est exposée est simplement réduit par rapport String à la classe.The time interval for which the SecureString instance's value is exposed is merely shortened in comparison to the String class.

Stockage et utilisationStorage versus usage
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 gardées confidentielles.More generally, the SecureString class defines a storage mechanism for string values that should be protected or kept confidential. Toutefois, en dehors du .NET Framework lui-même, aucun mécanisme SecureStringd’utilisation n’est pris en charge.However, outside of the .NET Framework itself, no usage mechanism supports SecureString. Cela signifie que la chaîne sécurisée doit être convertie en une forme utilisable (en général un formulaire en texte clair) qui peut être reconnue par sa cible, et que le déchiffrement et la conversion doivent se produire dans l’espace utilisateur.This means that the secure string must be converted to a usable form (typically a clear text form) that can be recognized by its target, and that decryption and conversion must occur in user space.

Globalement, SecureString est plus sécurisé que String parce qu’il limite l’exposition des données de chaîne sensibles.Overall, SecureString is more secure than String because it limits the exposure of sensitive string data. Toutefois, ces chaînes peuvent toujours être exposées à n’importe quel processus ou opération ayant accès à la mémoire brute, par exemple un processus malveillant s’exécutant sur l’ordinateur hôte, un vidage de processus ou un fichier d’échange affichable par l’utilisateur.However, those strings may still be exposed to any process or operation that has access to raw memory, such as a malicious process running on the host computer, a process dump, or a user-viewable swap file. Au lieu d' SecureString utiliser pour protéger les mots de passe, l’alternative recommandée consiste à utiliser un handle opaque pour les informations d’identification qui sont stockées en dehors du processus.Instead of using SecureString to protect passwords, the recommended alternative is to use an opaque handle to credentials that are stored outside of the process.

Retour au débutBack to top

Constructeurs

SecureString()

Initialise une nouvelle instance de la classe SecureString.Initializes a new instance of the SecureString class.

SecureString(Char*, Int32)

Initialise une nouvelle instance de la classe SecureString à partir d'un sous-tableau d'objets Char.Initializes a new instance of the SecureString class from a subarray of Char objects.

Ce constructeur n’est pas conforme CLS.This constructor is not CLS-compliant. L’alternative conforme CLS est SecureString().The CLS-compliant alternative is SecureString().

Propriétés

Length

Obtient le nombre de caractères dans la chaîne sécurisée actuelle.Gets the number of characters in the current secure string.

Méthodes

AppendChar(Char)

Ajoute un caractère à la fin de la chaîne sécurisée actuelle.Appends a character to the end of the current secure string.

Clear()

Supprime la valeur de la chaîne sécurisée actuelle.Deletes the value of the current secure string.

Copy()

Crée une copie de la chaîne sécurisée actuelle.Creates a copy of the current secure string.

Dispose()

Libère toutes les ressources utilisées par l’objet SecureString actuel.Releases all resources used by the current SecureString object.

Equals(Object)

Détermine si l'objet spécifié est identique à l'objet actuel.Determines whether the specified object is equal to the current object.

(Hérité de Object)
GetHashCode()

Fait office de fonction de hachage par défaut.Serves as the default hash function.

(Hérité de Object)
GetType()

Obtient le Type de l'instance actuelle.Gets the Type of the current instance.

(Hérité de Object)
InsertAt(Int32, Char)

Insère un caractère dans cette chaîne sécurisée à la position d'index spécifiée.Inserts a character in this secure string at the specified index position.

IsReadOnly()

Indique si cette chaîne sécurisée est en lecture seule.Indicates whether this secure string is marked read-only.

MakeReadOnly()

Met en lecture seule la valeur texte de cette chaîne sécurisée.Makes the text value of this secure string read-only.

MemberwiseClone()

Crée une copie superficielle de l'objet Object actuel.Creates a shallow copy of the current Object.

(Hérité de Object)
RemoveAt(Int32)

Supprime de cette chaîne sécurisée le caractère situé à la position d'index spécifiée.Removes the character at the specified index position from this secure string.

SetAt(Int32, Char)

Remplace le caractère existant à la position d'index spécifiée par un autre caractère.Replaces the existing character at the specified index position with another character.

ToString()

Retourne une chaîne qui représente l'objet actuel.Returns a string that represents the current object.

(Hérité de Object)

S’applique à

Voir aussi