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 Ein verwendet wird, um das Kennwort eines Benutzers für die Verwendung als Anmeldeinformationen zu schützen, SecureString um einen neuen Prozess zu starten.
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 -Klasse für neue SecureString Entwicklungen zu verwenden. Weitere Informationen finden Sie unter SecureString shouldn't be used on GitHub.
SecureString ist ein Zeichenfolgentyp, der ein Maß an Sicherheit bietet. Es wird versucht, das Speichern potenziell sensibler Zeichenfolgen im Prozessspeicher als Nur-Text zu vermeiden. (Informationen zu Einschränkungen finden Sie jedoch im Abschnitt Wie sicher ist SecureString?.) Der Wert einer Instanz von wird automatisch mithilfe eines Mechanismus geschützt, der von der zugrunde liegenden Plattform unterstützt wird, wenn die Instanz initialisiert oder der Wert SecureString geändert wird. Ihre Anwendung kann die Instanz unveränderlich rendern und weitere Änderungen verhindern, indem sie die -Methode MakeReadOnly 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 veräußern. 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 -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 nach derEntstellen schreibgeschützt, und es ist nicht möglich vorherzusagen, wann die Instanz aus dem Computerspeicher gelöscht System.String wird. Da Instanzen unveränderlich sind, erstellen Vorgänge, die eine vorhandene Instanz zu ändern scheinen, tatsächlich eine Kopie davon, um System.String sie zu bearbeiten. Wenn ein Objekt vertrauliche Informationen wie ein Kennwort, eine Kreditkartennummer oder personenbezogene Daten enthält, besteht daher das Risiko, dass die Informationen nach ihrer Verwendung angezeigt werden, da Ihre Anwendung die Daten nicht aus dem Computerspeicher löschen String kann.
Ein SecureString -Objekt ähnelt einem String -Objekt, da es über einen Textwert verfügt. Der Wert eines -Objekts ist jedoch im Arbeitsspeicher angeheftet, verwendet möglicherweise einen Schutzmechanismus, 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 entweder durch aufrufende Anwendung oder durch den .NET Framework-Garbage Collector aus dem Computerspeicher gelöscht werden SecureString Dispose kann.
Eine Erörterung der Einschränkungen der -Klasse SecureString finden Sie im Abschnitt Wie sicher ist SecureString?.
SecureString-Vorgänge
Die SecureString -Klasse enthält Member, mit denen Sie Folgendes tun können:
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 ein einzelnes Zeichen gleichzeitig hinzufügen, SecureString indem Sie dessen - oder AppendChar -Methode InsertAt aufrufen.
Wichtig
Ein -Objekt sollte nie aus einem erstellt werden, da die sensiblen Daten bereits den Folgen der Speicherpersistenz der SecureString String unveränderlichen Klasse String unterliegen. Die beste Möglichkeit, ein -Objekt zu erstellen, ist eine nicht verwaltete Zeichenquelle, z. B. SecureString die Console.ReadKey -Methode.
Entfernen von Zeichen aus einem SecureString -Objekt
Sie können ein einzelnes Zeichen ersetzen, indem Sie die -Methode aufrufen, ein einzelnes Zeichen entfernen, indem Sie die -Methode aufrufen, oder alle Zeichen aus der -Instanz entfernen, indem Sie SetAt RemoveAt die SecureString -Methode Clear aufrufen.
SecureStringSchreibgeschütztes Objekt
Nachdem Sie die Zeichenfolge definiert haben, die das -Objekt darstellt, rufen Sie die -Methode auf, um SecureString MakeReadOnly die Zeichenfolge schreibgeschützt zu machen.
Informationen zum SecureString Objekt
Die -Klasse verfügt nur über zwei Member, die Informationen über die Zeichenfolge bereitstellen: ihre -Eigenschaft, die die Anzahl der SecureString UTF16-codierten Codeeinheiten in der Zeichenfolge angibt, und die -Methode, die angibt, ob die Instanz schreibgeschützt Length IsReadOnly ist.
Geben Sie den der Instanz zugeordneten Arbeitsspeicher SecureString frei.
Da SecureString die -Schnittstelle IDisposable implementiert, geben Sie ihren Arbeitsspeicher frei, indem Sie die -Methode Dispose aufrufen.
Die SecureString -Klasse verfügt über keine Member, die den Wert eines überprüfen, vergleichen oder SecureString 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 -Objekts zu SecureString bearbeiten.
Die .NET Framework-Klassenbibliothek verwendet SecureString -Instanzen in der Regel auf folgende Weise:
Zum Bereitstellen von Kennwortinformationen für einen Prozess mithilfe der -Struktur oder durch Aufrufen einer Überladung der -Methode, die ProcessStartInfo über einen Parameter vom Typ Process.Start SecureString verfügt.
Zum Bereitstellen von Netzwerkkennwortinformationen durch Aufrufen eines Klassenkonstruktors, der über einen Parameter vom NetworkCredential Typ SecureString verfügt, oder mithilfe der NetworkCredential.SecurePassword -Eigenschaft.
Zum Bereitstellen von Kennwortinformationen für SQL Server Authentifizierung durch Aufrufen des Konstruktors oder Abrufen SqlCredential.SqlCredential des Werts der SqlCredential.Password -Eigenschaft.
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, müssen Sie den Wert des -Objekts in den erforderlichen Zeichenfolgentyp konvertieren, bevor Sie die Zeichenfolge an eine SecureString SecureString native Methode übergeben. Die Marshal -Klasse verfügt über fünf Methoden, die dies tun:
Marshal.SecureStringToBSTR, der den SecureString Zeichenfolgenwert in eine binäre Zeichenfolge (BSTR) konvertiert, die 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, diesen Speicher zu befreien und frei zu geben, sobald er nicht mehr benötigt wird. Jede der Methoden für die Zeichenfolgenkonvertierung und Speicherzuweisung verfügt über eine entsprechende Methode, um null zu verwenden und den zugeordneten Arbeitsspeicher freizuspeichern:
Wie sicher ist SecureString?
Wenn eine -Instanz ordnungsgemäß erstellt SecureString wird, bietet sie mehr Datenschutz als String eine . Erstellt beim Erstellen einer Zeichenfolge aus einer Zeichen-zu-Zeit-Quelle mehrere Zwischenspeicher, während nur String SecureString eine einzelne Instanz erstellt. Die Garbage Collection String von Objekten ist nicht deterministisch. Da der Speicher nicht angeheftet ist, werden vom Garbage Collector beim Verschieben und Komprimieren des Speichers zusätzliche Kopien String von Werten kopiert. Im Gegensatz dazu wird der einem -Objekt zugeordnete Arbeitsspeicher angeheftet, und dieser Speicher kann durch Aufrufen der -Methode SecureString frei Dispose werden.
Obwohl die in einer -Instanz gespeicherten Daten sicherer als die in einer -Instanz gespeicherten Daten sind, gibt es erhebliche Einschränkungen hinsichtlich der Sicherheit SecureString String einer SecureString Instanz. Dazu gehören:
Plattform
Auf dem Windows wird der Inhalt des internen Zeichenarrays einer SecureString Instanz verschlüsselt. Unabhängig davon, ob es sich um fehlende APIs oder Probleme bei der Schlüsselverwaltung handelt, ist die Verschlüsselung jedoch nicht auf allen Plattformen verfügbar. Aufgrund dieser Plattformabhängigkeit verschlüsselt SecureString nicht den internen Speicher auf nicht Windows Plattform. Andere Techniken werden auf diesen Plattformen verwendet, um zusätzlichen Schutz zu bieten.
Duration
Auch wenn die Implementierung die Verschlüsselung nutzen kann, kann der der Instanz zugewiesene Nur-Text SecureString zu verschiedenen Zeiten verfügbar gemacht SecureString werden:
Da Windows keine sichere Zeichenfolgenimplementierung auf Betriebssystemebene bietet, muss die .NET Framework den sicheren Zeichenfolgenwert weiterhin in ihre Nur-Text-Darstellung konvertieren, um ihn zu verwenden.
Wenn der Wert der sicheren Zeichenfolge durch Methoden wie oder geändert wird, muss er entschlüsselt (d. h. zurück in Nur-Text konvertiert), geändert und AppendChar RemoveAt 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 Wert der Instanz verfügbar gemacht wird, wird im Vergleich zur SecureString -Klasse lediglich String verkürzt.
Storage im Vergleich zur Nutzung
Im Allgemeinen definiert die SecureString -Klasse einen Speichermechanismus für Zeichenfolgenwerte, die geschützt oder vertraulich gehalten werden sollen. Außerhalb der Anwendung selbst .NET Framework jedoch kein Verwendungsmechanismus SecureString unterstützt. Dies bedeutet, dass die sichere Zeichenfolge in ein nutzbares Formular (in der Regel ein Klartextformular) konvertiert werden muss, das vom Ziel erkannt werden kann, und dass Entschlüsselung und Konvertierung im Benutzerbereich erfolgen müssen.
Insgesamt ist SecureString sicherer als , da es die Gefährdung String vertraulicher Zeichenfolgendaten einschränkt. Diese Zeichenfolgen können jedoch weiterhin für jeden Prozess oder Vorgang verfügbar gemacht werden, der Zugriff auf unformatten Arbeitsspeicher hat, z. B. einen schädlichen Prozess, der auf dem Hostcomputer ausgeführt wird, ein Prozessabbild oder eine vom Benutzer angezeigte Auslagerungsdatei. Anstatt zum Schutz von Kennwörtern zu verwenden, ist die empfohlene Alternative die Verwendung eines nicht transparenten Handles für Anmeldeinformationen, die außerhalb SecureString des Prozesses gespeichert werden.
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) |