SecureString Klasa

Definicja

Reprezentuje tekst, który powinien być poufny, na przykład przez usunięcie go z pamięci komputera, gdy nie jest już potrzebny. Klasa ta nie może być dziedziczona.

public ref class SecureString sealed : IDisposable
public sealed class SecureString : IDisposable
type SecureString = class
    interface IDisposable
Public NotInheritable Class SecureString
Implements IDisposable
Dziedziczenie
SecureString
Implementuje

Przykłady

W poniższym przykładzie pokazano, jak za pomocą funkcji zabezpieczyć hasło użytkownika do użycia jako poświadczenie w celu SecureString rozpoczęcia nowego procesu.

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

Uwagi

Ważne

Nie zalecamy używania klasy SecureString do tworzenia nowych aplikacji. Aby uzyskać więcej informacji, zobacz SecureString shouldn be used on GitHub (Nie należy używać secureString na GitHub).

SecureString to typ ciągu, który zapewnia miarę zabezpieczeń. Stara się unikać przechowywania potencjalnie poufnych ciągów w pamięci procesu jako zwykłego tekstu. (Aby uzyskać jednak ograniczenia, zobacz sekcję Jak bezpieczne jest SecureString?). Wartość wystąpienia jest automatycznie chroniona przy użyciu mechanizmu obsługiwanego przez podstawową platformę podczas inicjowania wystąpienia lub modyfikacji SecureString wartości. Aplikacja może renderować wystąpienie niezmienne i uniemożliwić dalsze modyfikacje przez wywołania MakeReadOnly metody .

Maksymalna długość wystąpienia SecureString wynosi 65 536 znaków.

Ważne

Ten typ implementuje IDisposable interfejs. Po zakończeniu korzystania z wystąpienia typu należy usunąć je bezpośrednio lub pośrednio. Aby bezpośrednio usunąć typ, wywołaj jego Dispose metodę w try / catch bloku. Aby usunąć go pośrednio, użyj konstrukcji języka, takiej jak using (w języku C#) lub Using (w Visual Basic). Aby uzyskać więcej informacji, zobacz sekcję "Używanie obiektu, który implementuje interfejs IDisposable" w IDisposable temacie interfejsu.

Klasa SecureString i jej składowe nie są widoczne dla com. Aby uzyskać więcej informacji, zobacz ComVisibleAttribute.

W tej sekcji:

String a SecureString
Operacje SecureString
SecureString i interop
Jak bezpieczny jest secureString?

Ciąg a SecureString

Wystąpienie klasy jest niezmienne i, gdy nie jest już potrzebne, nie można programowo zaplanować odśmiecania pamięci. Oznacza to, że wystąpienie jest tylko do odczytu po jego utworzeniu i nie można przewidzieć, kiedy wystąpienie zostanie usunięte z pamięci System.String komputera. Ponieważ wystąpienia są niezmienne, operacje, które wydają się modyfikować istniejące wystąpienie, w rzeczywistości tworzą jego kopię w System.String celu manipulowania nimi. W związku z tym, jeśli obiekt zawiera poufne informacje, takie jak hasło, numer karty kredytowej lub dane osobowe, istnieje ryzyko, że te informacje zostaną ujawnione po ich użyciu, ponieważ aplikacja nie może usunąć danych z pamięci String komputera.

Obiekt SecureString jest podobny do obiektu w String tym, że ma wartość tekstową. Jednak wartość obiektu jest przypięta do pamięci, może korzystać z mechanizmu ochrony, takiego jak szyfrowanie, zapewniane przez bazowy system operacyjny, może być modyfikowana, dopóki aplikacja nie oznacza go jako tylko do odczytu i może zostać usunięta z pamięci komputera przez aplikację wywołującą metodę lub przez moduł odśmiecania SecureString Dispose pamięci .NET Framework.

Omówienie ograniczeń klasy znajduje się w sekcji SecureString How secure is SecureString? (Jak bezpieczny jest secureString?).

Powrót do początku

Operacje SecureString

Klasa SecureString zawiera składowe, które umożliwiają:

Iniekcjuje SecureString obiekt
Obiekt tworzy się przez SecureString wywołanie jego konstruktora bez parametrów.

Dodawanie znaków do SecureString obiektu
Pojedynczy znak można dodać jednocześnie do obiektu, SecureString wywołując jego AppendChar metodę lub InsertAt .

Ważne

Obiekt nigdy nie powinien być konstruowany z obiektu , ponieważ poufne dane podlegają już konsekwencjom trwałości pamięci klasy SecureString String String niezmiennej. Najlepszym sposobem konstruowania obiektu jest ze źródła znaków w czasie SecureString niezaiemawanym, takiego jak Console.ReadKey metoda .

Usuwanie znaków z SecureString obiektu
Pojedynczy znak można zastąpić przez wywołanie metody , usunięcie pojedynczego znaku przez wywołanie metody lub usunięcie wszystkich znaków z wystąpienia przez SetAt RemoveAt wywołanie metody SecureString Clear .

SecureStringSprawić, aby obiekt był tylko do odczytu
Po zdefiniować ciąg, który reprezentuje obiekt, należy wywołać jego metodę, aby SecureString ciąg był tylko do MakeReadOnly odczytu.

Uzyskiwanie informacji o SecureString obiekcie
Klasa ma tylko dwa składowe, które dostarczają informacje o ciągu: jego właściwość, która wskazuje liczbę jednostek kodu zakodowanych w formacie SecureString UTF16 w ciągu, oraz metodę , która wskazuje, czy wystąpienie jest tylko do Length IsReadOnly odczytu.

Zwalnianie pamięci przydzielonej do SecureString wystąpienia
Ponieważ SecureString implementuje IDisposable interfejs, zwalniasz jego pamięć, wywołując Dispose metodę .

Klasa SecureString nie ma składowych, które sprawdzają, porównują lub konwertują wartość SecureString klasy . Brak takich elementów członkowskich pomaga chronić wartość wystąpienia przed przypadkowym lub złośliwym narażeniem na ryzyko. Użyj odpowiednich składowych klasy, takich jak metoda , aby System.Runtime.InteropServices.Marshal SecureStringToBSTR manipulować wartością SecureString obiektu.

Biblioteka .NET Framework klasy często SecureString używa wystąpień w następujący sposób:

Powrót do początku

SecureString i interop

Ponieważ system operacyjny nie obsługuje bezpośrednio , należy przekonwertować wartość obiektu na wymagany typ ciągu przed przekazaniem ciągu SecureString SecureString do metody natywnej. Klasa Marshal ma pięć metod, które to robią:

Każda z tych metod tworzy ciąg w postaci jednoznacznie tekstowej w pamięci nieza zarządzania. Deweloper ponosi odpowiedzialność za wyzerowanie i wolne tej pamięci, gdy tylko nie będzie już potrzebna. Każda z metod konwersji ciągów i alokacji pamięci ma odpowiednią metodę do zera i wolnej przydzielonej pamięci:

Metoda alokacji i konwersji Metoda zerowa i bezpłatna
Marshal.SecureStringToBSTR Marshal.ZeroFreeBSTR
Marshal.SecureStringToCoTaskMemAnsi Marshal.ZeroFreeCoTaskMemAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeCoTaskMemUnicode
Marshal.SecureStringToGlobalAllocAnsi Marshal.ZeroFreeGlobalAllocAnsi
Marshal.SecureStringToGlobalAllocUnicode Marshal.ZeroFreeGlobalAllocUnicode

Powrót do początku

Jak bezpieczny jest secureString?

Po prawidłowym utworzeniu SecureString wystąpienie zapewnia większą ochronę danych niż wystąpienie klasy String . Podczas tworzenia ciągu ze źródła znaków w czasie program tworzy wiele pośrednich znaków w pamięci, natomiast tworzy String SecureString tylko jedno wystąpienie. Odzyskiwanie pamięci String obiektów nie jest deterministyczne. Ponadto, ponieważ pamięć nie jest przypięta, moduł odśmiecania pamięci będzie ować dodatkowe kopie wartości podczas przenoszenia String i kompaktowania pamięci. Z kolei pamięć przydzielona do obiektu jest przypięta i pamięć może zostać wyzięty przez wywołanie SecureString Dispose metody .

Chociaż dane przechowywane w wystąpieniu są bezpieczniejsze niż dane przechowywane w wystąpieniu, istnieją znaczące ograniczenia dotyczące SecureString String bezpieczeństwa SecureString wystąpienia. Są one następujące:

Platforma
W Windows operacyjnym zawartość wewnętrznej tablicy znaków wystąpienia SecureString jest szyfrowana. Jednak z powodu braku interfejsów API lub problemów z zarządzaniem kluczami szyfrowanie nie jest dostępne na wszystkich platformach. Ze względu na tę zależność od platformy program nie szyfruje magazynu wewnętrznego na platformie SecureString Windows platformie. Inne techniki są używane na tych platformach w celu zapewnienia dodatkowej ochrony.

Czas trwania
Nawet jeśli implementacja jest w stanie wykorzystać szyfrowanie, zwykły tekst przypisany do wystąpienia może zostać SecureString SecureString ujawniony w różnych momentach:

  • Ponieważ Windows nie oferuje bezpiecznej implementacji ciągu na poziomie systemu operacyjnego, .NET Framework nadal musi przekonwertować wartość ciągu bezpiecznego na reprezentację w postaci zwykłego tekstu, aby można było jej użyć.

  • Za każdym razem, gdy wartość bezpiecznego ciągu jest modyfikowana przez metody takie jak lub , musi zostać odszyfrowana (tj. przekonwertowana z powrotem na zwykły tekst), zmodyfikowana, a następnie AppendChar RemoveAt zaszyfrowana ponownie.

  • Jeśli bezpieczny ciąg jest używany w wywołaniu międzyoptykowym, musi zostać przekonwertowany na ciąg ANSI, ciąg Unicode lub ciąg binarny (BSTR). Aby uzyskać więcej informacji, zobacz sekcję SecureString and interop (Zabezpieczanie i międzyplatplatowe).

Przedział czasu, dla którego jest ujawniona wartość wystąpienia, jest SecureString tylko skrócony w porównaniu z String klasą .

Storage a użycie
Mówiąc ogólnie, klasa definiuje mechanizm magazynu dla SecureString wartości ciągów, które powinny być chronione lub poufne. Jednak poza samym .NET Framework żaden mechanizm użycia nie obsługuje funkcji SecureString . Oznacza to, że bezpieczny ciąg musi zostać przekonwertowany na formularz użyteczny (zazwyczaj postać bezpiecznego tekstu), który może zostać rozpoznany przez jego obiekt docelowy, a odszyfrowywanie i konwersja musi nastąpić w przestrzeni użytkownika.

Ogólnie rzecz SecureString ujmuje to w String zabezpieczenia, ponieważ ogranicza narażenie poufnych danych ciągów. Jednak te ciągi mogą nadal być widoczne dla dowolnego procesu lub operacji, które mają dostęp do pierwotnej pamięci, na przykład złośliwego procesu uruchomionego na komputerze-hoście, zrzutu procesu lub pliku wymiany widocznego dla użytkownika. Zamiast używać metody do ochrony haseł, zaleca się użycie nieprzezroczystego dojścia do poświadczeń przechowywanych SecureString poza procesem.

Powrót do początku

Konstruktory

SecureString()

Inicjuje nowe wystąpienie klasy SecureString.

SecureString(Char*, Int32)

Inicjuje nowe wystąpienie SecureString klasy z podarrai Char obiektów .

Ten konstruktor nie jest zgodny ze specyfikacją CLS. Alternatywą zgodną ze specyfikacją CLS jest SecureString() .

Właściwości

Length

Pobiera liczbę znaków w bieżącym bezpiecznym ciągu.

Metody

AppendChar(Char)

Dołącza znak na końcu bieżącego bezpiecznego ciągu.

Clear()

Usuwa wartość bieżącego bezpiecznego ciągu.

Copy()

Tworzy kopię bieżącego bezpiecznego ciągu.

Dispose()

Zwalnia wszystkie zasoby używane przez bieżący SecureString obiekt.

Equals(Object)

Określa, czy dany obiekt jest taki sam, jak bieżący obiekt.

(Odziedziczone po Object)
GetHashCode()

Służy jako domyślna funkcja skrótu.

(Odziedziczone po Object)
GetType()

Type Pobiera wartość bieżącego wystąpienia.

(Odziedziczone po Object)
InsertAt(Int32, Char)

Wstawia znak w tym bezpiecznym ciągu na określonej pozycji indeksu.

IsReadOnly()

Wskazuje, czy ten bezpieczny ciąg jest oznaczony jako tylko do odczytu.

MakeReadOnly()

Sprawia, że wartość tekstowa tego bezpiecznego ciągu jest tylko do odczytu.

MemberwiseClone()

Tworzy płytkią kopię bieżącego Objectelementu .

(Odziedziczone po Object)
RemoveAt(Int32)

Usuwa znak w określonej pozycji indeksu z tego bezpiecznego ciągu.

SetAt(Int32, Char)

Zastępuje istniejący znak w określonej pozycji indeksu innym znakiem.

ToString()

Zwraca ciąg reprezentujący bieżący obiekt.

(Odziedziczone po Object)

Dotyczy

Zobacz też