SecureString Klasa
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
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?).
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:
Aby przekazać informacje o hasłach do procesu przy użyciu struktury lub przez wywołanie przeciążenia metody, która ProcessStartInfo Process.Start ma parametr typu SecureString .
Aby podać informacje o hasłach sieciowych przez wywołanie NetworkCredential konstruktora klasy, który ma parametr typu SecureString lub przy użyciu właściwości NetworkCredential.SecurePassword .
Aby podać informacje o SQL Server uwierzytelniania przez wywołanie konstruktora lub pobieranie SqlCredential.SqlCredential wartości SqlCredential.Password właściwości.
Aby przekazać ciąg do kodu niezamaniowego. Aby uzyskać więcej informacji, zobacz sekcję SecureString and interop (Zabezpieczanie i międzyplatplatowe).
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ą:
Marshal.SecureStringToBSTR, który konwertuje SecureString wartość ciągu na ciąg binarny (BSTR) rozpoznawany przez com.
Marshal.SecureStringToCoTaskMemAnsi i Marshal.SecureStringToGlobalAllocAnsi , które SecureString kopiują wartość ciągu do ciągu ANSI w pamięci niezaiemianej.
Marshal.SecureStringToCoTaskMemUnicode i Marshal.SecureStringToGlobalAllocUnicode , które kopiują wartość ciągu do ciągu SecureString Unicode w pamięci niezaiemianej.
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:
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.
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) |