SecureString SecureString SecureString SecureString Class

Definition

Stellt Text dar, der vertraulich behandelt werden soll, etwa durch Löschen aus dem Arbeitsspeicher des Computers, wenn er nicht mehr benötigt wird.Represents text that should be kept confidential, such as by deleting it from computer memory when no longer needed. Diese Klasse kann nicht vererbt werden.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
Vererbung
SecureStringSecureStringSecureStringSecureString
Implementiert

Beispiele

Im folgenden Beispiel wird veranschaulicht, wie ein SecureString verwendet wird, um das Kennwort eines Benutzers für die Verwendung als Anmelde Informationen zu sichern, um einen neuen Prozess zu starten.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

Hinweise

Wichtig

Es wird nicht empfohlen, die- SecureString Klasse für die neue Entwicklung zu verwenden.We don't recommend that you use the SecureString class for new development. Weitere Informationen finden Sie unter SecureString sollte nicht auf GitHub verwendet werden.For more information, see SecureString shouldn't be used on GitHub.

SecureStringist ein Zeichen Folgentyp, der ein Maß für Sicherheit bereitstellt.SecureString is a string type that provides a measure of security. Es wird versucht, potenziell sensible Zeichen folgen im Prozess Speicher als Klartext zu speichern.It tries to avoid storing potentially sensitive strings in process memory as plain text. (Informationen zu Einschränkungen finden Sie jedoch im Abschnitt wie sicher ist SecureString? .) Der Wert einer Instanz von SecureString wird automatisch mithilfe eines Mechanismus geschützt, der von der zugrunde liegenden Plattform unterstützt wird, wenn die Instanz initialisiert wird oder wenn der Wert geändert wird.(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. Die Anwendung kann die Instanz unveränderlich darstellen und eine weitere Änderung verhindern, indem Sie MakeReadOnly die-Methode aufruft.Your application can render the instance immutable and prevent further modification by invoking the MakeReadOnly method.

Die maximale Länge einer SecureString -Instanz beträgt 65.536 Zeichen.The maximum length of a SecureString instance is 65,536 characters.

Wichtig

Dieser Typ implementiert die IDisposable-Schnittstelle.This type implements the IDisposable interface. Wenn Sie die Verwendung einer Instanz des Typs abgeschlossen haben, sollten Sie Sie entweder direkt oder indirekt verwerfen.When you have finished using an instance of the type, you should dispose of it either directly or indirectly. Zum direkten Löschen des Typs rufen Sie seine Dispose-Methode in einem try/catch-Block auf.To dispose of the type directly, call its Dispose method in a try/catch block. Zum indirekten Löschen verwenden Sie ein Sprachkonstrukt wie using (in C#) oder Using (in Visual Basic).To dispose of it indirectly, use a language construct such as using (in C#) or Using (in Visual Basic). Weitere Informationen finden Sie im Abschnitt „Verwenden eines Objekts, das IDisposable implementiert“ des Themas „Die IDisposable-Schnittstelle“.For more information, see the "Using an Object that Implements IDisposable" section in the IDisposable interface topic.

Die SecureString -Klasse und ihre Member sind für com nicht sichtbar.The SecureString class and its members are not visible to COM. Weitere Informationen finden Sie unter ComVisibleAttribute.For more information, see ComVisibleAttribute.

In diesem AbschnittIn this section:

Zeichenfolge im Vergleich zu SecureString String vs. SecureString
SecureString-Vorgänge SecureString operations
SecureString und Interop SecureString and interop
Wie sicher ist SecureString?How secure is SecureString?

Zeichenfolge im Vergleich zu SecureStringString versus SecureString

Eine Instanz der System.String -Klasse ist unveränderlich und kann, wenn Sie nicht mehr benötigt wird, nicht Programm gesteuert für Garbage Collection geplant werden, d. h., die Instanz ist nach der Erstellung schreibgeschützt, und es ist nicht möglich, vorherzusagen, wann die Instanz aus dem Arbeitsspeicher des Computers gelöscht.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. Da System.String -Instanzen unveränderlich sind, erstellen Vorgänge, die anscheinend eine vorhandene Instanz ändern, tatsächlich eine Kopie davon, um Sie zu bearbeiten.Because System.String instances are immutable, operations that appear to modify an existing instance actually create a copy of it to manipulate. Wenn ein String -Objekt vertrauliche Informationen wie Kenn Wörter, Kreditkartennummern oder persönliche Daten enthält, besteht daher das Risiko, dass die Informationen nach der Verwendung offengelegt werden, da Ihre Anwendung die Daten nicht aus dem Arbeitsspeicher des Computers löschen kann. .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.

Ein SecureString -Objekt ähnelt einem String -Objekt darin, dass es über einen Textwert verfügt.A SecureString object is similar to a String object in that it has a text value. Der Wert eines SecureString -Objekts wird jedoch im Arbeitsspeicher fixiert, kann einen Schutzmechanismus verwenden, wie z. b. die Verschlüsselung, der vom zugrunde liegenden Betriebssystem bereitgestellt wird, kann geändert werden, bis die Anwendung ihn als schreibgeschützt kennzeichnet und aus dem Arbeitsspeicher des Computers gelöscht werden kann. entweder von der Anwendung, die Dispose die-Methode aufrufen, oder vom .NET Framework Garbage Collector.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.

Eine Erläuterung der Einschränkungen SecureString der-Klasse finden Sie im Abschnitt wie sicher ist SecureString? .For a discussion of the limitations of the SecureString class, see the How secure is SecureString? section.

Zurück nach obenBack to top

SecureString-VorgängeSecureString operations

Die SecureString -Klasse enthält Member, mit denen Sie die folgenden Aufgaben ausführen können:The SecureString class includes members that allow you to do the following:

Instanziieren eines SecureString -ObjektsInstantiate a SecureString object
Instanziieren Sie ein SecureString -Objekt, indem Sie den Parameter losen Konstruktor aufrufen.You instantiate a SecureString object by calling its parameterless constructor.

Hinzufügen von Zeichen SecureString zu einem-ObjektAdd characters to a SecureString object
Sie können einem- SecureString Objekt jeweils ein einzelnes Zeichen hinzufügen, indem Sie die AppendChar zugehörige-oder InsertAt -Methode aufrufen.You can add a single character at a time to a SecureString object by calling its AppendChar or InsertAt method.

Wichtig

Ein SecureString -Objekt sollte nie aus einer Stringerstellt werden, da die sensiblen Daten bereits den Auswirkungen der Speicher Persistenz der unveränderlichen String Klasse unterliegen.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. Die beste Möglichkeit zum Erstellen eines SecureString -Objekts ist die Erstellung eines-Objekts aus einer nicht verwalteten Zeichenfolge, z. b Console.ReadKey . die-Methode.The best way to construct a SecureString object is from a character-at-a-time unmanaged source, such as the Console.ReadKey method.

Entfernen von Zeichen aus SecureString einem-ObjektRemove characters from a SecureString object
Sie können ein einzelnes Zeichen ersetzen, indem Sie SetAt die-Methode aufrufen, ein einzelnes Zeichen entfernen RemoveAt , indem Sie die-Methode aufrufen, SecureString oder alle Zeichen aus Clear der-Instanz entfernen, indem Sie die-Methode aufrufen.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.

Legen Sie SecureString das Objekt als schreibgeschütztMake the SecureString object read-only
Nachdem Sie die Zeichenfolge definiert haben, SecureString die das Objekt darstellt, wird MakeReadOnly die zugehörige-Methode aufgerufen, um die Zeichenfolge als schreibgeschützt festzulegen.Once you have defined the string that the SecureString object represents, you call its MakeReadOnly method to make the string read-only.

Informationen zum SecureString Objekt erhaltenGet information about the SecureString object
Die SecureString -Klasse verfügt nur über zwei Member, die Informationen über die Zeichen Length Folge bereitstellen: die-Eigenschaft, die die Anzahl der UTF16-codierten Code Einheiten IsReadOnlyin der Zeichenfolge angibt, und die-Methode, die angibt, ob die Instanz schreibgeschützt.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.

Freigeben des Speichers, der der SecureString Instanz zugeordnet istRelease the memory allocated to the SecureString instance
Da SecureString Dispose die IDisposable -Schnittstelle implementiert, geben Sie den Speicher frei, indem Sie die-Methode aufrufen.Because SecureString implements the IDisposable interface, you release its memory by calling the Dispose method.

Die SecureString -Klasse verfügt über keine Member, die den Wert SecureStringeines überprüfen, vergleichen oder konvertieren.The SecureString class has no members that inspect, compare, or convert the value of a SecureString. Das Fehlen dieser Member trägt dazu bei, den Wert der Instanz vor versehentlicher oder böswilliger Gefährdung zu schützen.The absence of such members helps protect the value of the instance from accidental or malicious exposure. Verwenden Sie geeignete Member der System.Runtime.InteropServices.Marshal -Klasse, z. SecureStringToBSTR b. die-Methode, um den SecureString Wert eines-Objekts zu bearbeiten.Use appropriate members of the System.Runtime.InteropServices.Marshal class, such as the SecureStringToBSTR method, to manipulate the value of a SecureString object.

In der .NET Framework-Klassenbibliothek SecureString werden häufig-Instanzen auf folgende Weise verwendet:The .NET Framework Class Library commonly uses SecureString instances in the following ways:

Zurück nach obenBack to top

SecureString und InteropSecureString and interop

Da das Betriebssystem nicht direkt unterstützt SecureString, müssen Sie den Wert SecureString des Objekts in den erforderlichen Zeichen Folgentyp konvertieren, bevor Sie die Zeichenfolge an eine native Methode übergeben.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. Die Marshal -Klasse verfügt über fünf Methoden, die Folgendes ausführen:The Marshal class has five methods that do this:

Jede dieser Methoden erstellt eine klar Text Zeichenfolge im nicht verwalteten Speicher.Each of these methods creates a clear-text string in unmanaged memory. Es liegt in der Verantwortung des Entwicklers, diesen Speicher freizugeben, sobald er nicht mehr benötigt wird.It is the responsibility of the developer to zero out and free that memory as soon as it is no longer needed. Jede der Zeichen folgen Konvertierungs-und Speicher Belegungs Methoden weist eine entsprechende Methode auf, um den zugeordneten Arbeitsspeicher freizugeben und freizugeben:Each of the string conversion and memory allocation methods has a corresponding method to zero out and free the allocated memory:

Zuordnungs-und KonvertierungsmethodeAllocation and conversion method NULL-und Free-MethodeZero and free method
Marshal.SecureStringToBSTR Marshal.ZeroFreeBSTR
Marshal.SecureStringToCoTaskMemAnsi Marshal.ZeroFreeCoTaskMemAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeCoTaskMemUnicode
Marshal.SecureStringToGlobalAllocAnsi Marshal.ZeroFreeGlobalAllocAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeGlobalAllocUnicode

Zurück nach obenBack to top

Wie sicher ist SecureString?How secure is SecureString?

Wenn eine SecureString -Instanz ordnungsgemäß erstellt wurde, bietet Sie mehr StringDatenschutz als eine-Instanz.When created properly, a SecureString instance provides more data protection than a String. Beim Erstellen einer Zeichenfolge aus einer Zeichen-at-a-Time- String Quelle erstellt mehrere Zwischenspeicher im Arbeits SecureString Speicher, während nur eine einzelne Instanz von erstellt wird.When creating a string from a character-at-a-time source, String creates multiple intermediate in memory, whereas SecureString creates just a single instance. Die Garbage Collection String von Objekten ist nicht deterministisch.Garbage collection of String objects is non-deterministic. Da der Arbeitsspeicher nicht fixiert ist, werden die Garbage Collector darüber hinaus zusätzliche Kopien von String Werten erstellen, wenn der Arbeitsspeicher verschoben und komprimiert wird.In addition, because its memory is not pinned, the garbage collector will make additional copies of String values when moving and compacting memory. Im Gegensatz dazu wird der Speicher, der SecureString einem-Objekt zugeordnet ist, fixiert, und der Speicher kann durch Aufrufen Dispose der-Methode freigegeben werden.In contrast, the memory allocated to a SecureString object is pinned, and that memory can be freed by calling the Dispose method.

Obwohl die in einer SecureString -Instanz gespeicherten Daten sicherer als in einer String -Instanz gespeicherte Daten sind, gibt es bedeutende Einschränkungen hinsichtlich der SecureString Sicherheit einer-Instanz.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. Dazu gehören:These include:

PlattformPlatform
Auf dem Windows-Betriebssystem wird der Inhalt des SecureString internen Zeichen Arrays einer Instanz verschlüsselt.On the Windows operating system, the contents of a SecureString instance's internal character array are encrypted. Unabhängig davon, ob die Verschlüsselung aufgrund fehlender APIs oder Schlüssel Verwaltungsprobleme nicht auf allen Plattformen verfügbar ist.However, whether because of missing APIs or key management issues, encryption is not available on all platforms. Aufgrund dieser Plattformabhängigkeit SecureString verschlüsselt nicht den internen Speicher auf einer nicht-Windows-Plattform.Because of this platform dependency, SecureString does not encrypt the internal storage on non-Windows platform. Auf diesen Plattformen werden andere Techniken verwendet, um zusätzlichen Schutz zu bieten.Other techniques are used on those platforms to provide additional protection.

DauerDuration
Auch wenn die SecureString Implementierung in der Lage ist, die Verschlüsselung zu nutzen, kann der der SecureString Instanz zugewiesene Klartext zu verschiedenen Zeitpunkten verfügbar gemacht werden: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:

  • Da Windows keine sichere Zeichen folgen Implementierung auf Betriebssystemebene bietet, muss der .NET Framework den Wert der sicheren Zeichenfolge weiterhin in seine nur-Text-Darstellung konvertieren, damit er verwendet werden kann.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.

  • Wenn der Wert der sicheren Zeichenfolge durch Methoden wie AppendChar oder RemoveAtgeändert wird, muss er entschlüsselt (d. h. zurück in nur-Text konvertiert), geändert und erneut verschlüsselt werden.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.

  • Wenn die sichere Zeichenfolge in einem Interop-Befehl verwendet wird, muss Sie in eine ANSI-Zeichenfolge, eine Unicode-Zeichenfolge oder eine binäre Zeichenfolge (BSTR) konvertiert werden.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). Weitere Informationen finden Sie im Abschnitt SecureString und Interop .For more information, see the SecureString and interop section.

Das Zeitintervall, für das SecureString der Wert der-Instanz verfügbar gemacht wird String , wird im Vergleich zur-Klasse lediglich gekürzt.The time interval for which the SecureString instance's value is exposed is merely shortened in comparison to the String class.

Speicherung im Vergleich zu VerwendungStorage versus usage
Im allgemeinen definiert die SecureString -Klasse einen Speichermechanismus für Zeichen folgen Werte, die geschützt oder vertraulich aufbewahrt werden sollen.More generally, the SecureString class defines a storage mechanism for string values that should be protected or kept confidential. Außerhalb der .NET Framework selbst unterstützt SecureStringjedoch kein Verwendungs Mechanismus.However, outside of the .NET Framework itself, no usage mechanism supports SecureString. Dies bedeutet, dass die sichere Zeichenfolge in eine verwendbare Form (in der Regel ein Klartext-Formular) konvertiert werden muss, die von Ihrem Ziel erkannt werden kann, und dass das Entschlüsseln und konvertieren im Benutzerbereich erfolgen muss.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.

Insgesamt ist sicherer als String da es die Gefährdung sensibler Zeichen folgen Daten einschränkt. SecureStringOverall, SecureString is more secure than String because it limits the exposure of sensitive string data. Diese Zeichen folgen sind jedoch möglicherweise weiterhin für jeden Prozess oder jeden Vorgang verfügbar, der Zugriff auf den unformatierten Speicher hat, z. b. einen bösartigen Prozess, der auf dem Host Computer ausgeführt wird, ein Prozess Abbild oder eine vom Benutzer sichtbare Auslagerungs Datei.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. SecureString Anstatt zum Schützen von Kenn Wörtern zu verwenden, empfiehlt es sich, ein nicht transparentes Handle für Anmelde Informationen zu verwenden, die außerhalb des Prozesses gespeichert werden.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.

Zurück nach obenBack to top

Konstruktoren

SecureString() SecureString() SecureString() SecureString()

Initialisiert eine neue Instanz der SecureString-Klasse.Initializes a new instance of the SecureString class.

SecureString(Char*, Int32) SecureString(Char*, Int32) SecureString(Char*, Int32) SecureString(Char*, Int32)

Initialisiert eine neue Instanz der SecureString-Klasse aus einem Unterarray von Char-Objekten.Initializes a new instance of the SecureString class from a subarray of Char objects.

Dieser Konstruktor ist nicht CLS-kompatibel.This constructor is not CLS-compliant. Die CLS-kompatible Alternative ist SecureString().The CLS-compliant alternative is SecureString().

Eigenschaften

Length Length Length Length

Ruft die Anzahl der Zeichen in der aktuellen sicheren Zeichenfolge ab.Gets the number of characters in the current secure string.

Methoden

AppendChar(Char) AppendChar(Char) AppendChar(Char) AppendChar(Char)

Fügt am Ende der aktuellen sicheren Zeichenfolge ein Zeichen an.Appends a character to the end of the current secure string.

Clear() Clear() Clear() Clear()

Löscht den Wert der aktuellen sicheren Zeichenfolge.Deletes the value of the current secure string.

Copy() Copy() Copy() Copy()

Erstellt eine Kopie der aktuellen sicheren Zeichenfolge.Creates a copy of the current secure string.

Dispose() Dispose() Dispose() Dispose()

Gibt alle vom aktuellen SecureString-Objekt verwendeten Ressourcen frei.Releases all resources used by the current SecureString object.

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

Bestimmt, ob das angegebene Objekt mit dem aktuellen Objekt identisch ist.Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

Fungiert als Standardhashfunktion.Serves as the default hash function.

(Inherited from Object)
GetType() GetType() GetType() GetType()

Ruft den Type der aktuellen Instanz ab.Gets the Type of the current instance.

(Inherited from Object)
InsertAt(Int32, Char) InsertAt(Int32, Char) InsertAt(Int32, Char) InsertAt(Int32, Char)

Fügt in dieser sicheren Zeichenfolge an der angegebenen Indexposition ein Zeichen ein.Inserts a character in this secure string at the specified index position.

IsReadOnly() IsReadOnly() IsReadOnly() IsReadOnly()

Gibt an, ob diese sichere Zeichenfolge als schreibgeschützt markiert ist.Indicates whether this secure string is marked read-only.

MakeReadOnly() MakeReadOnly() MakeReadOnly() MakeReadOnly()

Legt den Textwert dieser sicheren Zeichenfolge als schreibgeschützt fest.Makes the text value of this secure string read-only.

MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

Erstellt eine flache Kopie des aktuellen Object.Creates a shallow copy of the current Object.

(Inherited from Object)
RemoveAt(Int32) RemoveAt(Int32) RemoveAt(Int32) RemoveAt(Int32)

Entfernt das Zeichen an der angegebenen Indexposition aus dieser sicheren Zeichenfolge.Removes the character at the specified index position from this secure string.

SetAt(Int32, Char) SetAt(Int32, Char) SetAt(Int32, Char) SetAt(Int32, Char)

Ersetzt das an der angegebenen Indexposition vorhandene Zeichen durch ein anderes Zeichen.Replaces the existing character at the specified index position with another character.

ToString() ToString() ToString() ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.Returns a string that represents the current object.

(Inherited from Object)

Gilt für:

Siehe auch