System.Security.SecureString-Klasse
Wichtig
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, potenziell sensible Zeichenfolgen im Prozessspeicher als Nur-Text zu speichern. (Einschränkungen finden Sie jedoch unter Wie sicher ist SecureString? section.) 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.
Wichtig
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. 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.
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 scheinbar eine vorhandene Instanz ändern, tatsächlich eine Kopie davon, um sie zu bearbeiten. Wenn ein String Objekt vertrauliche Informationen wie ein Kennwort, kreditwürdige Karte Nummer oder personenbezogene Daten enthält, 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 Member, mit denen Sie folgende Aktionen ausführen können:
Instanziieren Sie ein SecureString Objekt, das Sie instanziieren SecureString , indem Sie den parameterlosen Konstruktor aufrufen.
Hinzufügen von Zeichen zu einem SecureString Objekt Sie können einem Objekt jeweils ein einzelnes Zeichen SecureString hinzufügen, indem Sie dessen AppendChar Methode aufrufen InsertAt .
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 Methode zum Erstellen eines SecureString Objekts stammt aus einer nicht verwalteten Quelle, z. B. aus 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 vom Objekt dargestellte Zeichenfolge definiert haben, rufen Sie dessen MakeReadOnly Methode auf, um die Zeichenfolge SecureString 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 zugewiesenen SecureString Speicher frei, da SecureString die IDisposable Schnittstelle implementiert wird, geben Sie den Speicher frei, indem Sie die Dispose Methode aufrufen.
Die SecureString Klasse verfügt über keine Member, die den Wert einer .- SecureStringKlasse 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:
Zum Bereitstellen von Kennwortinformationen für einen Prozess mithilfe der ProcessStartInfo Struktur oder durch Aufrufen einer Überladung der Process.Start Methode mit einem Parameter vom Typ SecureString.
Um Netzwerkkennwortinformationen durch Aufrufen eines NetworkCredential Klassenkonstruktors mit einem Parameter vom Typ SecureString oder mithilfe der NetworkCredential.SecurePassword Eigenschaft bereitzustellen.
So stellen Sie Kennwortinformationen für die SQL Server-Authentifizierung bereit, indem Sie den SqlCredential.SqlCredential Konstruktor aufrufen oder den Wert der SqlCredential.Password Eigenschaft abrufen.
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 SecureStringwird, müssen Sie den Wert des SecureString Objekts in den erforderlichen Zeichenfolgentyp konvertieren, bevor Sie die Zeichenfolge an eine systemeigene Methode übergeben. Die Marshal Klasse verfügt über fünf Methoden, die dies tun:
Marshal.SecureStringToBSTR, der den Zeichenfolgenwert in eine binäre Zeichenfolge (BSTR) konvertiert, die SecureString von COM erkannt wird.
Marshal.SecureStringToCoTaskMemAnsi und Marshal.SecureStringToGlobalAllocAnsi, die den SecureString Zeichenfolgenwert in eine ANSI-Zeichenfolge im nicht verwalteten Speicher kopieren.
Marshal.SecureStringToCoTaskMemUnicode und Marshal.SecureStringToGlobalAllocUnicode, die den SecureString Zeichenfolgenwert in eine Unicode-Zeichenfolge im nicht verwalteten Speicher kopieren.
Jede dieser Methoden erstellt eine Klartextzeichenfolge im nicht verwalteten Speicher. Es liegt in der Verantwortung des Entwicklers, den Speicher freizugeben, sobald er nicht mehr benötigt wird. Jede Zeichenfolgenkonvertierungs- und Speicherzuordnungsmethode weist eine entsprechende Methode auf null und geben den zugewiesenen Speicher frei:
Wie sicher ist SecureString?
Wenn eine Instanz ordnungsgemäß erstellt wird, bietet eine SecureString Instanz mehr Datenschutz als eine String. Beim Erstellen einer Zeichenfolge aus einer Zeitquelle String werden mehrere Zwischenspeicher erstellt, während SecureString nur eine einzelne Instanz erstellt wird. Die Garbage Collection von String Objekten ist nicht deterministisch. Da der Speicher nicht angeheftet ist, macht der Garbage Collector beim Verschieben und Komprimieren des Arbeitsspeichers zusätzliche Kopien von String Werten. Im Gegensatz dazu wird der einem SecureString Objekt zugeordnete Speicher angeheftet, und dieser Speicher kann durch Aufrufen der Dispose Methode freigegeben werden.
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.
Duration
Auch wenn die Implementierung die SecureString Verschlüsselung nutzen kann, kann der der Instanz zugewiesene SecureString Nur-Text zu verschiedenen Zeiten verfügbar gemacht 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.
Wenn der Wert der sicheren Zeichenfolge von Methoden wie AppendChar oder RemoveAt, sie muss entschlüsselt werden (d. h. wieder in Nur-Text konvertiert), geändert und dann 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. Außerhalb von .NET 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 die Entschlüsselung und Konvertierung im Benutzerbereich erfolgen muss.
Insgesamt ist sicherer, SecureString als String weil sie die Belichtung vertraulicher Zeichenfolgendaten 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. 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.