SecureString Klasse

Definition

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

Zurück nach oben

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:

Zurück nach oben

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:

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:

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

Zurück nach oben

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.

Zurück nach oben

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)

Gilt für:

Siehe auch