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
Inheritance
SecureString
Implements

Examples

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

Remarks

Important

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.

SecureString ist 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 erzeugen und eine weitere Änderung verhindern, indem Sie die MakeReadOnly-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.

Important

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.

Inhalt dieses Abschnitts:In 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 eingeplant werden. Das heißt, 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 wird.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 scheinbar 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 die 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, indem die Anwendung die Dispose-Methode oder die .NET Framework Garbage Collector aufrufen.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 der SecureString-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.

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
Sie instanziieren eine SecureString Objekt, indem Sie den Parameter losen Konstruktor aufrufen.You instantiate a SecureString object by calling its parameterless constructor.

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

Important

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 Methode zum Erstellen eines SecureString Objekts ist eine nicht verwaltete Zeichenfolge, z. b. die Console.ReadKey-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 einem SecureString ObjektRemove characters from a SecureString object
Sie können ein einzelnes Zeichen ersetzen, indem Sie die SetAt-Methode aufrufen, ein einzelnes Zeichen entfernen, indem Sie die RemoveAt-Methode aufrufen, oder alle Zeichen aus der SecureString Instanz entfernen, indem Sie die Clear-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.

Schreibschutz für das SecureString Objekt festlegenMake the SecureString object read-only
Nachdem Sie die vom SecureString Objekt dargestellte Zeichenfolge definiert haben, wird die MakeReadOnly-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 ObjektGet information about the SecureString object
Die SecureString-Klasse verfügt nur über zwei Member, die Informationen über die Zeichenfolge bereitstellen: Ihre Length-Eigenschaft, die die Anzahl der UTF16-codierten Code Einheiten in der Zeichenfolge angibt. und die IsReadOnly,-Methode, die angibt, ob die-Instanz schreibgeschützt ist.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.

Geben Sie den der SecureString Instanz zugeordneten Arbeitsspeicher frei.Release the memory allocated to the SecureString instance
Da SecureString die IDisposable-Schnittstelle implementiert, geben Sie den Arbeitsspeicher frei, indem Sie die Dispose-Methode aufrufen.Because SecureString implements the IDisposable interface, you release its memory by calling the Dispose method.

Die SecureString-Klasse besitzt keine Member, die den Wert einer SecureStringüberprüfen, vergleichen oder konvertieren.The SecureString class has no members that inspect, compare, or convert the value of a SecureString. Das Fehlen solcher Member erleichtert es, den Wert der Instanz vor versehentlicher oder böswilliger Verfügbarmachung 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. b. die SecureStringToBSTR-Methode, um den Wert eines SecureString 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 werden häufig SecureString Instanzen auf folgende Weise verwendet:The .NET Framework Class Library commonly uses SecureString instances in the following ways:

Nach obenBack to top

SecureString und InteropSecureString and interop

Da das Betriebssystem SecureStringnicht direkt unterstützt, müssen Sie den Wert des SecureString 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

Nach obenBack to top

Wie sicher ist SecureString?How secure is SecureString?

Wenn eine SecureString Instanz ordnungsgemäß erstellt wurde, bietet Sie mehr Datenschutz als ein String.When created properly, a SecureString instance provides more data protection than a String. Beim Erstellen einer Zeichenfolge aus einer Zeichen-at-a-Time-Quelle erstellt String mehrere Zwischenspeicher im Arbeitsspeicher, während SecureString nur eine einzelne Instanz erstellt.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 von String-Objekten ist nicht deterministisch.Garbage collection of String objects is non-deterministic. Da der Arbeitsspeicher nicht fixiert ist, werden von der Garbage Collector zusätzliche Kopien String Werte erstellt, 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 Arbeitsspeicher, der einem SecureString Objekt zugeordnet ist, fixiert, und der Speicher kann durch Aufrufen der Dispose-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 Sicherheit einer SecureString 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 internen Zeichen Arrays einer SecureString 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 verschlüsselt SecureString 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.

DurationDuration
Auch wenn die SecureString-Implementierung die Verschlüsselung nutzen kann, kann der nur-Text, der der SecureString Instanz zugewiesen ist, zu unterschiedlichen 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 der Wert der SecureString Instanz verfügbar gemacht wird, wird im Vergleich zur String 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 jedoch kein Verwendungs Mechanismus SecureString.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 SecureString sicherer als String, da dadurch die Gefährdung sensibler Zeichen folgen Daten eingeschränkt wird.Overall, 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. Anstatt SecureString 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.

Nach obenBack to top

Constructors

SecureString()

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

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-konforme Alternative ist SecureString().The CLS-compliant alternative is SecureString().

Properties

Length

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

Methods

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()

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

Copy()

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

Dispose()

Gibt alle vom aktuellen SecureString-Objekt verwendeten Ressourcen frei.Releases all resources used by the current SecureString 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()

Fungiert als Standardhashfunktion.Serves as the default hash function.

(Inherited from Object)
GetType()

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

(Inherited from Object)
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()

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

MakeReadOnly()

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

MemberwiseClone()

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

(Inherited from Object)
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)

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()

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

(Inherited from Object)

Applies to

See also