SecureString Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Stellt Text dar, der vertraulich behandelt werden soll, etwa durch Löschen aus dem Arbeitsspeicher des Computers, 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 Sie ein SecureString verwenden, um das Kennwort eines Benutzers für die Verwendung als Anmeldeinformationen zum Starten eines neuen Prozesses zu schützen.
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 neue Entwicklungen zu verwenden. Weitere Informationen finden Sie unter SecureString sollte nicht auf GitHub verwendet werden.
SecureString ist ein Zeichenfolgentyp, der ein Maß an Sicherheit bietet. Es wird versucht, das Speichern potenziell vertraulicher Zeichenfolgen im Prozessspeicher als Nur-Text zu vermeiden. (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. Ihre Anwendung kann die Instanz unveränderlich rendern und weitere Änderungen verhindern, indem sie die MakeReadOnly -Methode aufruft.
Die maximale Länge einer SecureString Instanz beträgt 65.536 Zeichen.
Wichtig
Dieser Typ implementiert die IDisposable-Schnittstelle. Wenn Sie die Verwendung einer Instanz des Typs abgeschlossen haben, sollten Sie sie entweder direkt oder indirekt verwerfen. Zum direkten Löschen des Typs rufen Sie seine Dispose-Methode in einem try
/catch
-Block auf. Zum indirekten Löschen verwenden Sie ein Sprachkonstrukt wie using
(in C#) oder Using
(in Visual Basic). Weitere Informationen finden Sie im Abschnitt „Verwenden eines Objekts, das IDisposable implementiert“ des Themas „Die IDisposable-Schnittstelle“.
Die SecureString Klasse und ihre Member sind für COM nicht sichtbar. Weitere Informationen finden Sie unter ComVisibleAttribute.
Inhalt dieses Abschnitts:
Zeichenfolge im Vergleich zu SecureString
SecureString-Vorgänge
SecureString und Interop
Wie sicher ist SecureString?
Zeichenfolge im Vergleich zu 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 eine vorhandene Instanz zu ändern scheinen, tatsächlich eine Kopie der Instanz zur Bearbeitung. Wenn ein String Objekt vertrauliche Informationen wie ein Kennwort, eine Kreditkartennummer 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 Computerspeicher löschen kann.
Ein SecureString -Objekt ähnelt einem String -Objekt insofern, als es über einen Textwert verfügt. Der Wert eines SecureString Objekts ist jedoch im Arbeitsspeicher angeheftet, kann einen Schutzmechanismus verwenden, z. B. die Verschlüsselung, die vom zugrunde liegenden Betriebssystem bereitgestellt wird, kann geändert werden, bis ihre Anwendung es als schreibgeschützt markiert, und kann aus dem Computerspeicher gelöscht werden, entweder durch Ihre Anwendung, die die Dispose Methode aufruft oder durch den .NET Framework Garbage Collector.
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 Member, die Folgendes ermöglichen:
Instanziieren eines SecureString Objekts
Sie instanziieren ein SecureString Objekt, indem Sie seinen parameterlosen Konstruktor aufrufen.
Hinzufügen von Zeichen zu einem SecureString Objekt
Sie können einem Objekt jeweils ein einzelnes SecureString Zeichen hinzufügen, indem Sie dessen AppendChar -Methode oder InsertAt aufrufen.
Wichtig
Ein SecureString -Objekt sollte niemals aus einem Stringerstellt werden, da die vertraulichen Daten bereits den Speicherpersistenzfolgen der unveränderlichen String Klasse unterliegen. Die beste Möglichkeit, ein SecureString Objekt zu erstellen, ist aus einer nicht verwalteten Zeichenquelle, 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 durch Aufrufen der RemoveAt -Methode entfernen oder alle Zeichen aus der SecureString -Instanz entfernen, indem Sie die Clear -Methode aufrufen.
SecureString Das Objekt schreibgeschützt machen
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: ihre Length Eigenschaft, die die Anzahl der UTF16-codierten Codeeinheiten in der Zeichenfolge angibt, und die Methode , die IsReadOnlyangibt, ob die Instanz schreibgeschützt ist.
Freigeben des der Instanz zugeordneten Arbeitsspeichers SecureString
Da SecureString die IDisposable Schnittstelle implementiert wird, geben Sie ihren Arbeitsspeicher durch Aufrufen der Dispose -Methode frei.
Die SecureString -Klasse verfügt über keine Member, die den Wert eines SecureStringüberprüfen, vergleichen oder konvertieren. Das Fehlen solcher Member erleichtert es, den Wert der Instanz vor versehentlicher oder böswilliger Verfügbarmachung zu schützen. 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 Framework-Klassenbibliothek verwendet SecureString Instanzen häufig auf folgende Weise:
So stellen Sie Kennwortinformationen für einen Prozess mithilfe der ProcessStartInfo -Struktur oder durch Aufrufen einer Überladung der -Methode bereit, die Process.Start über einen Parameter vom Typ verfügt SecureString.
So stellen Sie Netzwerkkennwortinformationen bereit, indem Sie einen NetworkCredential Klassenkonstruktor aufrufen, der über einen Parameter vom Typ SecureString verfügt, oder mithilfe der NetworkCredential.SecurePassword -Eigenschaft.
Um Kennwortinformationen für SQL Server Authentifizierung durch Aufrufen des SqlCredential.SqlCredential Konstruktors oder Abrufen des Werts der SqlCredential.Password -Eigenschaft bereitzustellen.
So übergeben Sie eine Zeichenfolge an nicht verwalteten Code. Weitere Informationen finden Sie im Abschnitt SecureString und Interop .
SecureString und Interop
Da das Betriebssystem nicht direkt unterstützt SecureString, müssen Sie den Wert des Objekts in den SecureString erforderlichen Zeichenfolgentyp konvertieren, bevor Sie die Zeichenfolge an eine native Methode übergeben. Die Marshal Klasse verfügt über fünf Methoden, die dies tun:
Marshal.SecureStringToBSTR, der den SecureString Zeichenfolgenwert in eine von COM erkannte binäre Zeichenfolge (BSTR) konvertiert.
Marshal.SecureStringToCoTaskMemAnsi und Marshal.SecureStringToGlobalAllocAnsi, die den SecureString Zeichenfolgenwert in eine ANSI-Zeichenfolge im nicht verwalteten Arbeitsspeicher kopieren.
Marshal.SecureStringToCoTaskMemUnicode und Marshal.SecureStringToGlobalAllocUnicode, die den SecureString Zeichenfolgenwert in eine Unicode-Zeichenfolge im nicht verwalteten Arbeitsspeicher kopieren.
Jede dieser Methoden erstellt eine Klartextzeichenfolge im nicht verwalteten Arbeitsspeicher. Es liegt in der Verantwortung des Entwicklers, diesen Arbeitsspeicher auf null zu 0 und freizugeben, sobald er nicht mehr benötigt wird. Jede Zeichenfolgenkonvertierungs- und Speicherzuordnungsmethode verfügt über eine entsprechende Methode, um den zugeordneten Arbeitsspeicher auf null zu verteilen:
Wie sicher ist SecureString?
Bei ordnungsgemäßer Erstellung bietet eine SecureString Instanz mehr Datenschutz als eine String. Erstellt beim Erstellen einer Zeichenfolge aus einer Zeichen-zu-Zeit-Quelle String mehrere Zwischenprodukte im Arbeitsspeicher, während SecureString nur eine einzelne Instanz erstellt wird. Die Garbage Collection von String Objekten ist nicht deterministisch. Da der Arbeitsspeicher nicht angeheftet ist, erstellt der Garbage Collector beim Verschieben und Komprimieren des Arbeitsspeichers zusätzliche Kopien von String Werten. Im Gegensatz dazu wird der einem SecureString Objekt zugeordnete Arbeitsspeicher angeheftet, und dieser Speicher kann durch Aufrufen der Dispose -Methode freigegeben werden.
Obwohl in einer SecureString Instanz gespeicherte Daten sicherer sind als daten, die in einer String Instanz gespeichert sind, gibt es erhebliche Einschränkungen hinsichtlich der Sicherheit einer SecureString Instanz. Dazu gehören:
Plattform
Auf dem Windows-Betriebssystem wird der Inhalt des internen Zeichenarrays einer SecureString Instanz verschlüsselt. Die Verschlüsselung ist jedoch nicht auf allen Plattformen verfügbar, unabhängig davon, ob es sich um fehlende APIs oder Probleme bei der Schlüsselverwaltung handelt. Aufgrund dieser Plattformabhängigkeit SecureString verschlüsselt nicht den internen Speicher auf der Nicht-Windows-Plattform. Auf diesen Plattformen werden andere Techniken verwendet, um zusätzlichen Schutz zu bieten.
Duration
Selbst wenn die Implementierung die SecureString Verschlüsselung nutzen kann, kann der der SecureString Instanz zugewiesene Nur-Text zu verschiedenen Zeiten verfügbar gemacht werden:
Da Windows keine sichere Zeichenfolgenimplementierung auf Betriebssystemebene bietet, muss der .NET Framework den Wert der sicheren Zeichenfolge weiterhin in seine Nur-Text-Darstellung konvertieren, um ihn verwenden zu können.
Wenn der Wert der sicheren Zeichenfolge durch Methoden wie AppendChar oder RemoveAtgeändert wird, muss er entschlüsselt (d. h. wieder in Nur-Text konvertiert), geändert und dann erneut verschlüsselt werden.
Wenn die sichere Zeichenfolge in einem Interop-Aufruf 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 SecureString Instanzwert verfügbar gemacht wird, wird im Vergleich zur String -Klasse lediglich verkürzt.
Speicher im Vergleich zur Nutzung
Im Allgemeinen definiert die SecureString -Klasse einen Speichermechanismus für Zeichenfolgenwerte, die geschützt oder vertraulich behandelt werden sollen. Außerhalb des .NET Framework selbst unterstützt SecureStringjedoch kein Verwendungsmechanismus . 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 entschlüsselt und konvertiert werden muss.
Insgesamt ist sicherer, SecureString als String weil es die Offenlegung vertraulicher Zeichenfolgendaten einschränkt. Diese Zeichenfolgen können jedoch weiterhin für alle Prozesse oder Vorgänge verfügbar gemacht werden, die Zugriff auf rohen Arbeitsspeicher haben, z. B. einen schädlichen Prozess, der auf dem Hostcomputer ausgeführt wird, ein Prozessabbild oder eine vom Benutzer angezeigte Auslagerungsdatei. SecureString Anstatt kennwörter zu schützen, empfiehlt es sich, ein undurchsichtiges Handle für Anmeldeinformationen zu verwenden, die außerhalb des Prozesses gespeichert sind.
Konstruktoren
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
Length |
Ruft die Anzahl der Zeichen in der aktuellen sicheren Zeichenfolge ab. |
Methoden
AppendChar(Char) |
Fügt am Ende der aktuellen sicheren Zeichenfolge ein Zeichen 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 gleich dem aktuellen Objekt ist. (Geerbt von Object) |
GetHashCode() |
Fungiert als Standardhashfunktion. (Geerbt von Object) |
GetType() |
Ruft den Type der aktuellen Instanz ab. (Geerbt von Object) |
InsertAt(Int32, Char) |
Fügt in dieser sicheren Zeichenfolge an der angegebenen Indexposition ein Zeichen ein. |
IsReadOnly() |
Gibt an, ob diese sichere Zeichenfolge als schreibgeschützt markiert ist. |
MakeReadOnly() |
Legt den Textwert dieser sicheren Zeichenfolge als schreibgeschützt fest. |
MemberwiseClone() |
Erstellt eine flache Kopie des aktuellen Object. (Geerbt von Object) |
RemoveAt(Int32) |
Entfernt das Zeichen an der angegebenen Indexposition aus dieser sicheren Zeichenfolge. |
SetAt(Int32, Char) |
Ersetzt das an der angegebenen Indexposition vorhandene Zeichen durch ein anderes Zeichen. |
ToString() |
Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt. (Geerbt von Object) |