Freigeben über


System.Security.SecureString-Klasse

Von Bedeutung

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

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 wird jedoch im Arbeitsspeicher angeheftet, kann einen Schutzmechanismus verwenden, z. B. verschlüsselung, die vom zugrunde liegenden Betriebssystem bereitgestellt wird, kann geändert werden, bis die Anwendung es als schreibgeschützt markiert und entweder von Der Anwendung, die die Dispose Methode aufruft, oder durch den .NET Garbage Collector aus dem Computerspeicher gelöscht werden kann.

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 gehören:

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.

Dauer

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 Verwendung 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.