Udostępnij za pomocą


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. pl-PL: (Aby zapoznać się z ograniczeniami, zobacz sekcję Jak bezpieczny jest SecureString?). Wartość instancji SecureString jest automatycznie chroniona przez mechanizm wspierany przez platformę bazową, gdy instancja jest inicjowana 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 interfejs IDisposable. Po zakończeniu korzystania z wystąpienia typu należy je zlikwidować bezpośrednio lub pośrednio. Aby usunąć typ bezpośrednio, wywołaj metodę Dispose w bloku try/catch. 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ę "Używanie obiektu implementującego IDisposable" (Using an Object that Implements IDisposable) w temacie interfejsu IDisposable.

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

Ciąg kontra SecureString

Wystąpienie klasy System.String jest zarówno niezmienne, jak i, gdy nie jest już potrzebne, nie można go programowo zaplanować do usuwania przez mechanizm zbierania śmieci; to znaczy, że wystąpienie jest tylko do odczytu po jego utworzeniu i nie można przewidzieć, kiedy 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ą jego kopię w celu manipulacji. 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 korzystać z mechanizmu ochrony, takiego jak szyfrowanie dostarczane przez podstawowy system operacyjny, można ją zmodyfikować, dokąd aplikacja nie oznaczy go jako tylko do odczytu, i może zostać usunięta z pamięci komputera przez aplikację wywołującą metodę Dispose 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:

Tworzenie obiektu SecureString można rozpocząć, wywołując konstruktor bez parametrów tego obiektu SecureString.

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 obiektu SecureString jest korzystanie z niezarządzanego źródła znaków, po jednym znaku na raz, takiego jak metoda Console.ReadKey.

Usuń znaki z SecureString obiektu Możesz zastąpić pojedynczy znak, wywołując metodę SetAt, usunąć pojedynczy znak, wywołując metodę RemoveAt, lub usunąć wszystkie znaki z instancji SecureString, 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ą instancji SecureString, ponieważ SecureString implementuje interfejs IDisposable, jego pamięć należy zwolnić przez wywołanie metody Dispose.

Klasa SecureString nie ma elementów członkowskich, które sprawdzają, porównują lub konwertują wartość klasy SecureString. Brak takich członków pomaga chronić wartość instancji 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 instancji w następujący sposób:

SecureString i interoperacyjność

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, aby wyzerować i zwolnić tę pamięć, jak tylko nie jest już potrzebna. Każda z metod konwersji ciągów i alokacji pamięci ma odpowiednią metodę do wyzerowania i zwolnienia przydzielonej pamięci.

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?

Jeśli zostanie prawidłowo utworzona, instancja SecureString zapewnia większą ochronę danych niż String. Podczas tworzenia ciągu znaków z źródła znak po znaku, String tworzy wiele pośrednich obiektów w pamięci, podczas gdy SecureString tworzy tylko jedno wystąpienie. Zarządzanie pamięcią obiektów String jest niedeterministyczne. Ponadto, ponieważ pamięć nie jest przypięta, moduł odśmiecania pamięci będzie tworzyć dodatkowe kopie wartości String podczas przenoszenia i kompaktowania pamięci. Z kolei pamięć przydzielona do obiektu SecureString jest przypięta, a można ją zwolnić, wywołując metodę Dispose.

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ść wewnętrznej tablicy znaków w instancji SecureString 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ść platformową SecureString nie szyfruje magazynu wewnętrznego na platformach innych 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.

Przedział czasowy, w którym wartość instancji SecureString jest widoczna, został jedynie skrócony w porównaniu z klasą String.

Przechowywanie a użycie Ogólnie rzecz biorąc, klasa SecureString definiuje mechanizm przechowywania dla wartości tekstowych, które powinny być chronione lub przechowywane jako poufne. Jednak poza samą platformą .NET żaden mechanizm użycia nie obsługuje SecureString. 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, SecureString jest bezpieczniejszy niż String, ponieważ 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.