SecureString Klasse

Definition

Stellt Text dar, der vertraulich gehalten werden soll, z. B. durch Löschen aus dem Computerspeicher, wenn er nicht mehr benötigt wird. Diese Klasse kann nicht vererbt werden.

public ref class SecureString sealed : IDisposable
public sealed class SecureString : IDisposable
type SecureString = class
    interface IDisposable
Public NotInheritable Class SecureString
Implements IDisposable
Vererbung
SecureString
Implementiert

Beispiele

Im folgenden Beispiel wird veranschaulicht, wie ein Benutzerkennwort für die Verwendung als Anmeldeinformationen zum Starten eines neuen Prozesses verwendet SecureString wird.

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

Von Bedeutung

Es wird empfohlen, die Klasse nicht für die SecureString neue Entwicklung auf .NET (Core) oder beim Migrieren von .NET Framework zu verwenden. Weitere Informationen finden Sie unter SecureString sollte nicht verwendet werden.

Note

Dieser Artikel enthält ergänzende Hinweise zur Referenzdokumentation für diese API.

SecureString ist ein Zeichenfolgentyp, der ein Maß an Sicherheit bereitstellt. Es versucht zu vermeiden, potenziell sensible Zeichenfolgen im Arbeitsspeicher als Klartext zu speichern. (Einschränkungen finden Sie im Abschnitt "Wie sicher ist SecureString? " jedoch.) 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. Ihre Anwendung kann die Instanz unveränderlich rendern und durch Aufrufen der MakeReadOnly Methode weitere Änderungen verhindern.

Die maximale Länge einer SecureString Instanz beträgt 65.536 Zeichen.

Von Bedeutung

Dieser Typ implementiert die IDisposable Schnittstelle. Wenn Sie die Verwendung einer Instanz des Typs abgeschlossen haben, sollten Sie sie entweder direkt oder indirekt löschen. Rufen Sie die Methode Dispose in einem try/catch-Block auf, um den Typ direkt zu entsorgen. Verwenden Sie zum indirekten Löschen ein Sprachkonstrukt wie using (in C#) oder Using (in Visual Basic). Weitere Informationen finden Sie im Abschnitt "Verwenden eines Objekts, das IDisposable implementiert" im IDisposable Schnittstellenthema.

Die SecureString Klasse und ihre Member sind für COM nicht sichtbar. Weitere Informationen finden Sie unter ComVisibleAttribute.

Zeichenfolge versus SecureString

Eine Instanz der System.String Klasse ist unveränderlich und kann, wenn sie nicht mehr benötigt wird, nicht programmgesteuert für die Garbage Collection geplant werden. Das heißt, die Instanz ist schreibgeschützt, nachdem sie erstellt wurde, und es ist nicht möglich, vorherzusagen, wann die Instanz aus dem Computerspeicher gelöscht wird. 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. Wenn ein String Objekt vertrauliche Informationen enthält, z. B. ein Kennwort, eine Kreditkartennummer oder personenbezogene Daten, besteht daher das Risiko, dass die Informationen nach der Verwendung offengelegt werden können, da ihre Anwendung die Daten nicht aus dem Computerspeicher löschen kann.

Ein SecureString Objekt ähnelt einem String Objekt, in dem es einen Textwert aufweist. Der Wert eines SecureString Objekts:

  • Ist im Arbeitsspeicher angeheftet.
  • Verwenden Sie möglicherweise einen Schutzmechanismus, z. B. verschlüsselung, der vom zugrunde liegenden Betriebssystem bereitgestellt wird.
  • Kann geändert werden, bis ihre Anwendung sie als schreibgeschützt markiert.
  • Kann entweder von der Anwendung, die die Dispose Methode aufruft, oder durch den .NET Garbage Collector aus dem Computerspeicher gelöscht werden.

Eine Erläuterung der Einschränkungen der SecureString Klasse finden Sie im Abschnitt "Wie sicher ist SecureString?"

SecureString-Vorgänge

Die SecureString Klasse enthält Mitglieder, mit denen Sie folgende Aktionen ausführen können:

Instanziieren Sie ein SecureString-Objekt. Sie instanziieren ein SecureString-Objekt, indem Sie dessen parameterlosen Konstruktor aufrufen.

Hinzufügen von Zeichen zu einem SecureString-Objekt Sie können einem SecureString-Objekt jeweils ein einzelnes Zeichen hinzufügen, indem Sie die Methode AppendChar oder InsertAt aufrufen.

Von Bedeutung

Ein SecureString Objekt sollte niemals aus einem StringErstellt werden, da die vertraulichen Daten bereits den Speicherpersistenzfolgen der unveränderlichen String Klasse unterliegen. Ein SecureString-Objekt lässt sich am besten aus einer zeichenweisen, nicht verwalteten Quelle konstruieren, wie z. B. der Console.ReadKey-Methode.

Entfernen von Zeichen aus einem SecureString Objekt 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.

Legen Sie das SecureString-Objekt schreibgeschützt fest. Nachdem Sie die Zeichenfolge definiert haben, die das SecureString-Objekt darstellt, rufen Sie dessen MakeReadOnly-Methode auf, um die Zeichenfolge schreibgeschützt zu machen.

Abrufen von Informationen zum SecureString Objekt Die SecureString Klasse verfügt nur über zwei Member, die Informationen zur Zeichenfolge bereitstellen: die Length Eigenschaft, die die Anzahl der UTF16-codierten Codeeinheiten in der Zeichenfolge angibt; und die IsReadOnlyMethode, die angibt, ob die Instanz schreibgeschützt ist.

Geben Sie den der Instanz SecureString zugewiesenen Speicher frei. Da SecureString die IDisposable Schnittstelle implementiert, geben Sie den Speicher frei, indem Sie die Dispose Methode aufrufen.

Die SecureString-Klasse verfügt über keine Mitglieder, die den Wert eines SecureString untersuchen, vergleichen oder konvertieren. Das Fehlen solcher Mitglieder trägt zum Schutz des Werts der Instanz vor versehentlicher oder böswilliger Exposition bei. Verwenden Sie geeignete Member der System.Runtime.InteropServices.Marshal Klasse, z. B. die SecureStringToBSTR Methode, um den Wert eines SecureString Objekts zu bearbeiten.

Die .NET-Klassenbibliothek verwendet SecureString in der Regel Instanzen auf folgende Weise:

SecureString und Interop

Da das Betriebssystem SecureString nicht direkt unterstützt, müssen Sie den Wert des SecureString Objekts in das erforderliche Zeichenfolgenformat konvertieren, bevor Sie die Zeichenfolge an eine systemeigene Methode übergeben. Die Marshal Klasse verfügt über fünf Methoden, die dies tun:

Jede dieser Methoden erstellt eine Klartextzeichenfolge im nicht verwalteten Speicher. Es liegt in der Verantwortung des Entwicklers, den Speicher auf Null zu setzen und freizugeben, sobald er nicht mehr benötigt wird. Jede Zeichenfolgenkonvertierungs- und Speicherzuordnungsmethode weist eine entsprechende Methode auf, um den zugewiesenen Speicher auf null zu setzen und freizugeben.

Zuordnungs- und Konvertierungsmethode Null und kostenlose Methode
Marshal.SecureStringToBSTR Marshal.ZeroFreeBSTR
Marshal.SecureStringToCoTaskMemAnsi Marshal.ZeroFreeCoTaskMemAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeCoTaskMemUnicode
Marshal.SecureStringToGlobalAllocAnsi Marshal.ZeroFreeGlobalAllocAnsi
Marshal.SecureStringToGlobalAllocUnicode Marshal.ZeroFreeGlobalAllocUnicode

Wie sicher ist SecureString?

Wenn eine Instanz ordnungsgemäß erstellt wird, bietet eine SecureString Instanz mehr Datenschutz als eine String. Wenn Sie eine Zeichenfolge aus einer zeichenweisen Quelle erstellen, erstellt String mehrere Zwischenstufen im Speicher, während SecureString nur eine einzige Instanz erstellt. Die Garbage Collection von String-Objekten ist nicht-deterministisch. Da der Speicher nicht angeheftet ist, erstellt der Garbage Collector beim Verschieben und Verdichten von Speicher zusätzliche Kopien von String-Werten. Im Gegensatz dazu wird der einem SecureString Objekt zugeordnete Speicherplatz fixiert, und dieser Speicherplatz kann durch Aufrufen der Dispose-Methode freiwerden.

Obwohl daten, die in einer SecureString Instanz gespeichert sind, sicherer als in einer String Instanz gespeicherte Daten sind, gibt es erhebliche Einschränkungen hinsichtlich der Sicherheit einer SecureString Instanz. Dazu zählen:

  • Plattform

    Auf dem Windows-Betriebssystem werden die Inhalte des internen Zeichenarrays einer SecureString Instanz verschlüsselt. Unabhängig davon, ob aufgrund fehlender APIs oder Schlüsselverwaltungsprobleme verschlüsselung auf allen Plattformen nicht verfügbar ist. Aufgrund dieser Plattformabhängigkeit SecureString wird der interne Speicher nicht auf einer Nicht-Windows-Plattform verschlüsselt. Andere Techniken werden auf diesen Plattformen verwendet, um zusätzlichen Schutz zu bieten.

  • Duration

    Auch wenn die SecureString Implementierung die Verschlüsselung nutzen kann, kann der Instanz zugewiesene SecureString Klartext zu verschiedenen Zeiten offengelegt werden:

    • Da Windows keine sichere Zeichenfolgenimplementierung auf Betriebssystemebene bietet, muss .NET den sicheren Zeichenfolgenwert trotzdem in seine Nur-Text-Darstellung konvertieren, um ihn zu verwenden.
    • Wann immer der Wert der sicheren Zeichenfolge durch Methoden wie AppendChar oder RemoveAt geändert wird, muss er entschlüsselt werden (d. h. wieder in Klartext konvertiert), dann modifiziert und erneut verschlüsselt werden.
    • Wenn die sichere Zeichenfolge in einem Interopaufruf verwendet wird, muss sie in eine ANSI-Zeichenfolge, eine Unicode-Zeichenfolge oder eine Binäre Zeichenfolge (BSTR) konvertiert werden. Weitere Informationen finden Sie im Abschnitt "SecureString" und "Interop ".

    Das Zeitintervall, für das der Wert der SecureString Instanz verfügbar gemacht wird, wird lediglich im Vergleich zur String Klasse gekürzt.

  • Speicher im Vergleich zur Nutzung

    Im Allgemeinen definiert die SecureString Klasse einen Speichermechanismus für Zeichenfolgenwerte, die geschützt oder vertraulich gehalten werden sollen. Jedoch unterstützt außerhalb von .NET selbst kein Verwendungsmechanismus SecureString. Dies bedeutet, dass die sichere Zeichenfolge in ein verwendbares Formular (in der Regel ein Klartextformular) konvertiert werden muss, das vom Ziel erkannt werden kann und dass die Entschlüsselung und Konvertierung im Benutzerbereich erfolgen muss.

Insgesamt ist SecureString sicherer als String, weil es die Exposition vertraulicher Zeichendaten begrenzt. Diese Zeichenfolgen können jedoch weiterhin für alle Prozesse oder Vorgänge verfügbar gemacht werden, die Zugriff auf unformatierten Arbeitsspeicher haben, z. B. einen bösartigen Prozess, der auf dem Hostcomputer ausgeführt wird, ein Prozessabbild oder eine vom Benutzer angezeigte Auslagerungsdatei. Statt SecureString zur Sicherung von Passwörtern zu verwenden, wird empfohlen, ein undurchsichtiges Handle für Anmeldeinformationen zu nutzen, die außerhalb des Prozesses gespeichert sind.

Konstruktoren

Name Beschreibung
SecureString()

Initialisiert eine neue Instanz der SecureString-Klasse.

SecureString(Char*, Int32)

Initialisiert eine neue Instanz der SecureString Klasse aus einem Unterarray von Char Objekten.

Dieser Konstruktor ist nicht CLS-kompatibel. Die CLS-kompatible Alternative ist SecureString().

Eigenschaften

Name Beschreibung
Length

Ruft die Anzahl der Zeichen in der aktuellen sicheren Zeichenfolge ab.

Methoden

Name Beschreibung
AppendChar(Char)

Fügt ein Zeichen an das Ende der aktuellen sicheren Zeichenfolge an.

Clear()

Löscht den Wert der aktuellen sicheren Zeichenfolge.

Copy()

Erstellt eine Kopie der aktuellen sicheren Zeichenfolge.

Dispose()

Gibt alle vom aktuellen SecureString Objekt verwendeten Ressourcen frei.

Equals(Object)

Bestimmt, ob das angegebene Objekt dem aktuellen Objekt entspricht.

(Geerbt von Object)
GetHashCode()

Dient als Standardhashfunktion.

(Geerbt von Object)
GetType()

Ruft die Type der aktuellen Instanz ab.

(Geerbt von Object)
InsertAt(Int32, Char)

Fügt ein Zeichen in diese sichere Zeichenfolge an der angegebenen Indexposition ein.

IsReadOnly()

Gibt an, ob diese sichere Zeichenfolge schreibgeschützt markiert ist.

MakeReadOnly()

Macht den Textwert dieser sicheren Zeichenfolge schreibgeschützt.

MemberwiseClone()

Erstellt eine flache Kopie der aktuellen Object.

(Geerbt von Object)
RemoveAt(Int32)

Entfernt das Zeichen an der angegebenen Indexposition aus dieser sicheren Zeichenfolge.

SetAt(Int32, Char)

Ersetzt das vorhandene Zeichen an der angegebenen Indexposition durch ein anderes Zeichen.

ToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.

(Geerbt von Object)

Gilt für:

Weitere Informationen