System.Security.SecureString, klasa

Ważne

Zalecamy, aby nie używać SecureString klasy do tworzenia nowych aplikacji na platformie .NET (Core) ani podczas migracji istniejącego kodu na platformę .NET (Core). Aby uzyskać więcej informacji, zobacz SecureString nie należy używać.

Ten artykuł zawiera dodatkowe uwagi dotyczące dokumentacji referencyjnej dla tego interfejsu API.

SecureString to typ ciągu, który zapewnia miarę zabezpieczeń. Próbuje uniknąć przechowywania potencjalnie poufnych ciągów w pamięci procesu jako zwykłego tekstu. (Aby uzyskać jednak ograniczenia, zobacz Jak bezpieczny jest ciąg SecureString? sekcja).) Wartość wystąpienia SecureString programu jest automatycznie chroniona przy użyciu mechanizmu obsługiwanego przez platformę bazową, gdy wystąpienie jest inicjowane lub gdy wartość jest modyfikowana. Aplikacja może renderować wystąpienie niezmienne i zapobiegać dalszym modyfikacjom, wywołując metodę MakeReadOnly .

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

Ważne

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

Klasa SecureString i jej składowe nie są widoczne dla modelu COM. W celu uzyskania więcej informacji, zobacz następujący temat: ComVisibleAttribute.

Ciąg a ciąg SecureString

Wystąpienie System.String klasy jest niezmienne i, gdy nie jest już potrzebne, nie można programowo zaplanować odzyskiwania 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 komputera. Ponieważ System.String wystąpienia są niezmienne, operacje, które wydają się modyfikować istniejące wystąpienie, faktycznie tworzą kopię do manipulowania. W związku z tym, jeśli String obiekt zawiera poufne informacje, takie jak hasło, numer karty kredytowej lub dane osobowe, istnieje ryzyko, że informacje mogą zostać ujawnione po jego użyciu, ponieważ aplikacja nie może usunąć danych z pamięci komputera.

Obiekt SecureString jest podobny do String obiektu, który ma wartość tekstową. Jednak wartość SecureString obiektu jest przypięta w pamięci, może użyć mechanizmu ochrony, takiego jak szyfrowanie dostarczone przez bazowy system operacyjny, można zmodyfikować, dopóki aplikacja nie oznaczy go jako tylko do odczytu i może zostać usunięta z pamięci komputera przez aplikację wywołującą Dispose metodę lub przez moduł odśmiecania pamięci platformy .NET.

Aby zapoznać się z ograniczeniami SecureString klasy, zobacz sekcję How secure is SecureString? (Jak bezpieczny jest protokół SecureString? ).

Operacje SecureString

Klasa SecureString zawiera elementy członkowskie, które umożliwiają wykonywanie następujących czynności:

SecureString Utwórz wystąpienie obiektu, tworząc wystąpienie SecureString obiektu, wywołując jego konstruktor bez parametrów.

Dodaj znaki do SecureString obiektu Możesz dodać pojedynczy znak jednocześnie do SecureString obiektu, wywołując jego AppendChar metodę lub InsertAt .

Ważne

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

Usuń znaki z SecureString obiektu Możesz zastąpić pojedynczy znak, wywołując metodę, usuwając pojedynczy znak przez wywołanie RemoveAtSetAt metody lub usuwając wszystkie znaki z SecureString wystąpienia, wywołując metodęClear.

SecureString Ustaw obiekt tylko do odczytu po zdefiniowaniu ciągu reprezentowanego przez SecureString obiekt, należy wywołać jego MakeReadOnly metodę, aby ciąg był tylko do odczytu.

Uzyskaj informacje o SecureString obiekcie Klasa SecureString ma tylko dwa elementy członkowskie, które zawierają informacje o ciągu: jego Length właściwość, która wskazuje liczbę jednostek kodu zakodowanych w formacie UTF16 w ciągu; i IsReadOnlymetodę , która wskazuje, czy wystąpienie jest tylko do odczytu.

Zwolnij pamięć przydzieloną SecureString do wystąpienia, ponieważ SecureString implementuje IDisposable interfejs, należy zwolnić jego pamięć przez wywołanie Dispose metody .

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

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

Zabezpieczanie ciągów i międzyoperajności

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

Każda z tych metod tworzy ciąg zwykłego tekstu w niezarządzanej pamięci. Jest to odpowiedzialność dewelopera za zero i zwolnienie tej pamięci, gdy tylko nie jest już potrzebna. Każda z metod konwersji ciągów i alokacji pamięci ma odpowiednią metodę zerową i zwolni przydzieloną pamięć:

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

Jak bezpieczny jest ciąg SecureString?

Po poprawnym utworzeniu SecureString wystąpienie zapewnia większą ochronę danych niż String. Podczas tworzenia ciągu na podstawie źródła String znaków w czasie tworzy wiele pośrednich w pamięci, podczas gdy SecureString tworzy tylko jedno wystąpienie. Odzyskiwanie String pamięci obiektów nie jest deterministyczne. Ponadto, ponieważ jego pamięć nie jest przypięta, moduł odśmiecania pamięci spowoduje dodatkowe kopie String wartości podczas przenoszenia i kompaktowania pamięci. Z kolei pamięć przydzielona do obiektu jest przypięta SecureString , a pamięć może zostać zwolniona przez wywołanie Dispose metody .

Chociaż dane przechowywane w wystąpieniu SecureString są bezpieczniejsze niż dane przechowywane w wystąpieniu String , istnieją znaczne ograniczenia dotyczące zabezpieczania SecureString wystąpienia. Są to:

Platforma

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

Czas trwania

Nawet jeśli implementacja SecureString może korzystać z szyfrowania, zwykły tekst przypisany do SecureString wystąpienia może być uwidoczniony w różnych momentach:

  • Ponieważ system Windows nie oferuje bezpiecznej implementacji ciągów na poziomie systemu operacyjnego, platforma .NET nadal musi przekonwertować wartość bezpiecznego ciągu na reprezentację zwykłego tekstu w celu jej użycia.

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

  • Jeśli bezpieczny ciąg jest używany w wywołaniu międzyoperacyjnym, 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 współdziałanie).

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

Ogólnie rzecz biorąc, SecureString klasa definiuje mechanizm przechowywania dla wartości ciągów, które powinny być chronione lub przechowywane poufne. Jednak poza samą platformą .NET żaden mechanizm użycia nie obsługuje SecureStringprogramu . Oznacza to, że bezpieczny ciąg musi zostać przekonwertowany na formularz nadający się do użycia (zazwyczaj formularz zwykłego tekstu), który może zostać rozpoznany przez element docelowy, a odszyfrowywanie i konwersja muszą wystąpić w przestrzeni użytkownika.

Ogólnie rzecz biorąc, jest bezpieczniejsza niż String dlatego, SecureString że ogranicza narażenie poufnych danych ciągów. Jednak te ciągi mogą być nadal widoczne dla dowolnego procesu lub operacji, która ma dostęp do nieprzetworzonej pamięci, takich jak złośliwy proces uruchomiony na komputerze hosta, zrzut procesu lub plik zamiany możliwy do wyświetlenia przez użytkownika. Zamiast chronić SecureString hasła, zalecaną alternatywą jest użycie nieprzezroczystego dojścia do poświadczeń przechowywanych poza procesem.