SecureString Klasa

Definicja

Reprezentuje tekst, który powinien zostać zachowany poufne, na przykład przez usunięcie go z pamięci komputera, gdy nie jest już potrzebne.Represents text that should be kept confidential, such as by deleting it from computer memory when no longer needed. Klasa ta nie może być dziedziczona.This class cannot be inherited.

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

Poniższy przykład ilustruje sposób użycia SecureString, aby zabezpieczyć hasło użytkownika do użycia jako poświadczenia do uruchomienia nowego procesu.The following example demonstrates how to use a SecureString to secure a user's password for use as a credential to start a new process.

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 zaleca się używania klasy SecureString w celu nowego rozwoju.We don't recommend that you use the SecureString class for new development. Aby uzyskać więcej informacji, zobacz SecureString nie powinien być używany w serwisie GitHub.For more information, see SecureString shouldn't be used on GitHub.

SecureString jest typem ciągu, który zapewnia miarę zabezpieczeń.SecureString is a string type that provides a measure of security. Próbuje uniknąć przechowywania potencjalnie poufnych ciągów w pamięci procesu jako zwykłego tekstu.It tries to avoid storing potentially sensitive strings in process memory as plain text. (W przypadku ograniczeń należy jednak zapoznać się z sekcją jak bezpiecznie jest to SecureString? ). Wartość wystąpienia SecureString jest automatycznie chroniona przy użyciu mechanizmu obsługiwanego przez podstawową platformę, gdy wystąpienie zostanie zainicjowane lub gdy wartość zostanie zmodyfikowana.(For limitations, however, see the How secure is SecureString? section.) The value of an instance of SecureString is automatically protected using a mechanism supported by the underlying platform when the instance is initialized or when the value is modified. Aplikacja może renderować wystąpienie niezmienne i uniemożliwiać dalsze modyfikacje, wywołując metodę MakeReadOnly.Your application can render the instance immutable and prevent further modification by invoking the MakeReadOnly method.

Maksymalna długość wystąpienia SecureString to 65 536 znaków.The maximum length of a SecureString instance is 65,536 characters.

Ważne

Ten typ implementuje interfejs IDisposable.This type implements the IDisposable interface. Po zakończeniu korzystania z wystąpienia typu należy usunąć jego wartość bezpośrednio lub pośrednio.When you have finished using an instance of the type, you should dispose of it either directly or indirectly. Aby usunąć typ bezpośrednio, wywołaj metodę Dispose w bloku try/catch.To dispose of the type directly, call its Dispose method in a try/catch block. Aby usunąć go pośrednio, użyj konstrukcji językowej, takiej jak using (in C#) lub Using (w Visual Basic).To dispose of it indirectly, use a language construct such as using (in C#) or Using (in Visual Basic). Aby uzyskać więcej informacji, zobacz sekcję "Używanie obiektu implementującego interfejs IDisposable" w temacie interfejsu IDisposable.For more information, see the "Using an Object that Implements IDisposable" section in the IDisposable interface topic.

Klasa SecureString i jej elementy członkowskie nie są widoczne dla modelu COM.The SecureString class and its members are not visible to COM. Aby uzyskać więcej informacji, zobacz ComVisibleAttribute.For more information, see ComVisibleAttribute.

W tej sekcji:In this section:

Ciąg a SecureStringString vs. SecureString
operacji SecureStringSecureString operations
SecureString i międzyoperacyjnySecureString and interop
Jak bezpieczny jest SecureString?How secure is SecureString?

Ciąg a SecureStringString versus SecureString

Wystąpienie klasy System.String jest jednocześnie niemodyfikowalne i, gdy nie jest już potrzebne, nie można programowo zaplanować do wyrzucania elementów bezużytecznych; oznacza to, że wystąpienie jest tylko do odczytu po jego utworzeniu i nie można go przewidzieć, gdy wystąpienie zostanie usunięte z pamięci komputera.An instance of the System.String class is both immutable and, when no longer needed, cannot be programmatically scheduled for garbage collection; that is, the instance is read-only after it is created, and it is not possible to predict when the instance will be deleted from computer memory. Ponieważ wystąpienia System.String są niezmienne, operacje, które pojawiają się w celu zmodyfikowania istniejącego wystąpienia, faktycznie tworzą kopię go do manipulowania.Because System.String instances are immutable, operations that appear to modify an existing instance actually create a copy of it to manipulate. W związku z tym, jeśli obiekt String zawiera poufne informacje, takie jak hasło, numer karty kredytowej lub dane osobowe, istnieje ryzyko, że informacje mogą być ujawnione po ich użyciu, ponieważ aplikacja nie może usunąć danych z pamięci komputera.Consequently, if a String object contains sensitive information such as a password, credit card number, or personal data, there is a risk the information could be revealed after it is used because your application cannot delete the data from computer memory.

Obiekt SecureString jest podobny do String obiektu, w którym ma wartość tekstową.A SecureString object is similar to a String object in that it has a text value. Jednak wartość obiektu SecureString jest przypięta w pamięci, może być modyfikowana za pomocą mechanizmu ochrony, takiego jak szyfrowanie, dostarczonego przez podstawowy system operacyjny, do momentu, gdy aplikacja 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 .NET Framework Moduł wyrzucania elementów bezużytecznych.However, the value of a SecureString object is pinned in memory, may use a protection mechanism, such as encryption, provided by the underlying operating system, can be modified until your application marks it as read-only, and can be deleted from computer memory either by your application calling the Dispose method or by the .NET Framework garbage collector.

Omówienie ograniczeń dotyczących klasy SecureString można znaleźć w sekcji jak bezpiecznie is SecureString? .For a discussion of the limitations of the SecureString class, see the How secure is SecureString? section.

Powrót do początkuBack to top

Operacje SecureStringSecureString operations

Klasa SecureString obejmuje elementy członkowskie, które umożliwiają wykonywanie następujących czynności:The SecureString class includes members that allow you to do the following:

Tworzenie wystąpienia obiektu SecureStringInstantiate a SecureString object
Tworzysz wystąpienie SecureString obiektu przez wywołanie jego konstruktora bez parametrów.You instantiate a SecureString object by calling its parameterless constructor.

Dodawanie znaków do obiektu SecureStringAdd characters to a SecureString object
Można dodać pojedynczy znak jednocześnie do obiektu SecureString, wywołując jego metodę AppendChar lub InsertAt.You can add a single character at a time to a SecureString object by calling its AppendChar or InsertAt method.

Ważne

Obiekt SecureString nigdy nie powinien być zbudowany z String, ponieważ poufne dane są już uzależnione od skutków trwałości pamięci niezmiennej Stringj klasy.A SecureString object should never be constructed from a String, because the sensitive data is already subject to the memory persistence consequences of the immutable String class. Najlepszym sposobem konstruowania obiektu SecureString jest poprzednia niezarządzanym źródłem znaku na czas, takiego jak Metoda Console.ReadKey.The best way to construct a SecureString object is from a character-at-a-time unmanaged source, such as the Console.ReadKey method.

Usuwanie znaków z obiektu SecureStringRemove characters from a SecureString object
Można zastąpić pojedynczy znak, wywołując metodę SetAt, usunąć pojedynczy znak poprzez wywołanie metody RemoveAt lub usunąć wszystkie znaki z wystąpienia SecureString, wywołując metodę Clear.You can replace an individual character by calling the SetAt method, remove an individual character by calling the RemoveAt method, or remove all characters from the SecureString instance by calling the Clear method.

Uczyń obiekt SecureString tylko do odczytuMake the SecureString object read-only
Po zdefiniowaniu ciągu, który reprezentuje obiekt SecureString, należy wywołać metodę MakeReadOnly, aby uzyskać ciąg tylko do odczytu.Once you have defined the string that the SecureString object represents, you call its MakeReadOnly method to make the string read-only.

Pobierz informacje o obiekcie SecureStringGet information about the SecureString object
Klasa SecureString ma tylko dwa elementy członkowskie, które zawierają informacje o ciągu: Właściwość Length, która wskazuje liczbę jednostek kodu zakodowanych UTF16 w ciągu; i IsReadOnly, metoda, która wskazuje, czy wystąpienie jest tylko do odczytu.The SecureString class has only two members that provide information about the string: its Length property, which indicates the number of UTF16-encoded code units in the string; and the IsReadOnly, method, which indicates whether the instance is read-only.

Zwolnij pamięć przydzieloną do wystąpienia SecureStringRelease the memory allocated to the SecureString instance
Ponieważ SecureString implementuje interfejs IDisposable, zwolnij pamięć, wywołując metodę Dispose.Because SecureString implements the IDisposable interface, you release its memory by calling the Dispose method.

Klasa SecureString nie ma elementów członkowskich, które sprawdzają, porównują lub konwertują wartość SecureString.The SecureString class has no members that inspect, compare, or convert the value of a SecureString. Brak takich członków pomaga chronić wartość wystąpienia przed przypadkowym lub złośliwym narażeniem.The absence of such members helps protect the value of the instance from accidental or malicious exposure. Użyj odpowiednich elementów członkowskich klasy System.Runtime.InteropServices.Marshal, takich jak Metoda SecureStringToBSTR, do manipulowania wartością obiektu SecureString.Use appropriate members of the System.Runtime.InteropServices.Marshal class, such as the SecureStringToBSTR method, to manipulate the value of a SecureString object.

Biblioteka klas .NET Framework często używa wystąpień SecureString w następujący sposób:The .NET Framework Class Library commonly uses SecureString instances in the following ways:

Powrót do początkuBack to top

SecureString i InteropSecureString and interop

Ponieważ system operacyjny nie obsługuje bezpośrednio SecureString, przed przekazaniem ciągu do metody natywnej należy skonwertować wartość obiektu SecureString na wymagany typ ciągu.Because the operating system does not directly support SecureString, you must convert the value of the SecureString object to the required string type before passing the string to a native method. Klasa Marshal ma pięć metod, które wykonują następujące czynności:The Marshal class has five methods that do this:

Każda z tych metod tworzy ciąg w postaci zwykłego tekstu w pamięci niezarządzanej.Each of these methods creates a clear-text string in unmanaged memory. Jest odpowiedzialny za wyzerowanie i zwolnienie pamięci przez dewelopera, gdy tylko nie będą potrzebne.It is the responsibility of the developer to zero out and free that memory as soon as it is no longer needed. Każda metoda konwersji ciągów i alokacji pamięci ma odpowiadającą metodę wyzerowania i zwolnienia przydzielonej pamięci:Each of the string conversion and memory allocation methods has a corresponding method to zero out and free the allocated memory:

Metoda alokacji i konwersjiAllocation and conversion method Zero i bezpłatna MetodaZero and free method
Marshal.SecureStringToBSTR Marshal.ZeroFreeBSTR
Marshal.SecureStringToCoTaskMemAnsi Marshal.ZeroFreeCoTaskMemAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeCoTaskMemUnicode
Marshal.SecureStringToGlobalAllocAnsi Marshal.ZeroFreeGlobalAllocAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeGlobalAllocUnicode

Powrót do początkuBack to top

Jak bezpieczny jest SecureString?How secure is SecureString?

Po poprawnym utworzeniu wystąpienie SecureString zapewnia większą ochronę danych niż String.When created properly, a SecureString instance provides more data protection than a String. Podczas tworzenia ciągu z poziomu źródła znaku w czasie, String tworzy wiele pośrednich w pamięci, podczas gdy SecureString tworzy tylko jedno wystąpienie.When creating a string from a character-at-a-time source, String creates multiple intermediate in memory, whereas SecureString creates just a single instance. Wyrzucanie elementów bezużytecznych obiektów String nie jest deterministyczne.Garbage collection of String objects is non-deterministic. Ponadto, ponieważ jej pamięć nie jest przypięta, Moduł wyrzucania elementów bezużytecznych wprowadzi dodatkowe kopie String wartości podczas przesuwania i kompaktowania pamięci.In addition, because its memory is not pinned, the garbage collector will make additional copies of String values when moving and compacting memory. W przeciwieństwie do pamięci przydzielonej do obiektu SecureString jest przypięty, a pamięć może zostać zwolniona przez wywołanie metody Dispose.In contrast, the memory allocated to a SecureString object is pinned, and that memory can be freed by calling the Dispose method.

Mimo że dane przechowywane w wystąpieniu SecureString są bezpieczniejsze niż dane przechowywane w wystąpieniu String, istnieją istotne ograniczenia dotyczące bezpiecznego wystąpienia SecureString.Although data stored in a SecureString instance is more secure than data stored in a String instance, there are significant limitations on how secure a SecureString instance is. Należą do nich:These include:

PlatformaPlatform
W systemie operacyjnym Windows zawartość wewnętrznej tablicy znaków wystąpienia SecureString jest zaszyfrowana.On the Windows operating system, the contents of a SecureString instance's internal character array are encrypted. Jednak bez względu na to, czy z powodu brakujących interfejsów API lub problemów z zarządzaniem kluczami, szyfrowanie nie jest dostępne na wszystkich platformach.However, whether because of missing APIs or key management issues, encryption is not available on all platforms. Ze względu na tę zależność platformy SecureString nie szyfruje wewnętrznego magazynu na platformie innej niż Windows.Because of this platform dependency, SecureString does not encrypt the internal storage on non-Windows platform. Inne techniki są używane na tych platformach w celu zapewnienia dodatkowej ochrony.Other techniques are used on those platforms to provide additional protection.

Czas trwaniaDuration
Nawet jeśli implementacja SecureString jest w stanie korzystać z szyfrowania, zwykły tekst przypisany do wystąpienia SecureString może być narażony w różnym czasie:Even if the SecureString implementation is able to take advantage of encryption, the plain text assigned to the SecureString instance may be exposed at various times:

  • Ponieważ system Windows nie oferuje bezpiecznej implementacji ciągu na poziomie systemu operacyjnego, .NET Framework nadal musi przekonwertować wartość bezpiecznego ciągu na jej reprezentację w postaci zwykłego tekstu, aby można było jej używać.Because Windows doesn't offer a secure string implementation at the operating system level, the .NET Framework still has to convert the secure string value to its plain text representation in order to use it.

  • Za każdym razem, gdy wartość bezpiecznego ciągu jest modyfikowana przy użyciu metod, takich jak AppendChar lub RemoveAt, należy ją odszyfrować (oznacza to, że są konwertowane z powrotem na zwykły tekst), modyfikowane i szyfrowane.Whenever the value of the secure string is modified by methods such as AppendChar or RemoveAt, it must be decrypted (that is, converted back to plain text), modified, and then encrypted again.

  • Jeśli bezpieczny ciąg jest używany w wywołaniu międzyoperacyjnym, musi być konwertowany na ciąg ANSI, ciąg Unicode lub ciąg binarny (BSTR).If the secure string is used in an interop call, it must be converted to an ANSI string, a Unicode string, or a binary string (BSTR). Aby uzyskać więcej informacji, zobacz sekcję SecureString i międzyoperacyjność .For more information, see the SecureString and interop section.

Przedział czasu, dla którego jest uwidaczniana wartość SecureString wystąpienia, jest jedynie skracany w porównaniu do klasy String.The time interval for which the SecureString instance's value is exposed is merely shortened in comparison to the String class.

Magazyn i użycieStorage versus usage
Ogólnie rzecz biorąc, Klasa SecureString definiuje mechanizm magazynowania dla wartości ciągów, które powinny być chronione lub poufne.More generally, the SecureString class defines a storage mechanism for string values that should be protected or kept confidential. Jednakże poza .NET Framework, żaden mechanizm użycia nie obsługuje SecureString.However, outside of the .NET Framework itself, no usage mechanism supports SecureString. Oznacza to, że bezpieczny ciąg musi być konwertowany na przydatny formularz (zazwyczaj formularz czysty tekst), który może zostać rozpoznany przez jego obiekt docelowy, a odszyfrowywanie i konwersja muszą następować w przestrzeni użytkownika.This means that the secure string must be converted to a usable form (typically a clear text form) that can be recognized by its target, and that decryption and conversion must occur in user space.

Ogólnie, SecureString jest bezpieczniejszy niż String, ponieważ ogranicza narażenie poufnych danych ciągu.Overall, SecureString is more secure than String because it limits the exposure of sensitive string data. Jednak te ciągi mogą być nadal uwidocznione w dowolnym procesie lub operacji, które mają dostęp do pamięci nieprzetworzonej, takich jak złośliwy proces uruchomiony na komputerze-hoście, zrzut procesu lub plik wymiany widoczny dla użytkownika.However, those strings may still be exposed to any process or operation that has access to raw memory, such as a malicious process running on the host computer, a process dump, or a user-viewable swap file. Zamiast używać SecureString do ochrony haseł, Zalecaną alternatywą jest użycie nieprzezroczystego uchwytu do poświadczeń przechowywanych poza procesem.Instead of using SecureString to protect passwords, the recommended alternative is to use an opaque handle to credentials that are stored outside of the process.

Powrót do początkuBack to top

Konstruktory

SecureString()

Inicjuje nowe wystąpienie klasy SecureString.Initializes a new instance of the SecureString class.

SecureString(Char*, Int32)

Inicjuje nowe wystąpienie klasy SecureString z podtablicy obiektów Char.Initializes a new instance of the SecureString class from a subarray of Char objects.

Ten konstruktor nie jest zgodny ze specyfikacją CLS.This constructor is not CLS-compliant. Alternatywa zgodna ze specyfikacją CLS jest SecureString().The CLS-compliant alternative is SecureString().

Właściwości

Length

Pobiera liczbę znaków w bieżącym bezpiecznym ciągu.Gets the number of characters in the current secure string.

Metody

AppendChar(Char)

Dołącza znak na końcu bieżącego bezpiecznego ciągu.Appends a character to the end of the current secure string.

Clear()

Usuwa wartość bieżącego bezpiecznego ciągu.Deletes the value of the current secure string.

Copy()

Tworzy kopię bieżącego bezpiecznego ciągu.Creates a copy of the current secure string.

Dispose()

Zwalnia wszystkie zasoby używane przez bieżący obiekt SecureString.Releases all resources used by the current SecureString object.

Equals(Object)

Określa, czy dany obiekt jest taki sam, jak bieżący obiekt.Determines whether the specified object is equal to the current object.

(Odziedziczone po Object)
GetHashCode()

Służy jako domyślna funkcja skrótu.Serves as the default hash function.

(Odziedziczone po Object)
GetType()

Pobiera Type bieżącego wystąpienia.Gets the Type of the current instance.

(Odziedziczone po Object)
InsertAt(Int32, Char)

Wstawia znak w tym bezpiecznym ciągu w podanej pozycji indeksu.Inserts a character in this secure string at the specified index position.

IsReadOnly()

Wskazuje, czy ten bezpieczny ciąg jest oznaczony jako tylko do odczytu.Indicates whether this secure string is marked read-only.

MakeReadOnly()

Powoduje, że wartość tekstowa tego bezpiecznego ciągu jest tylko do odczytu.Makes the text value of this secure string read-only.

MemberwiseClone()

Tworzy skróconą kopię bieżącego Object.Creates a shallow copy of the current Object.

(Odziedziczone po Object)
RemoveAt(Int32)

Usuwa znak z podanej pozycji indeksu z tego bezpiecznego ciągu.Removes the character at the specified index position from this secure string.

SetAt(Int32, Char)

Zastępuje istniejący znak w podanej pozycji indeksu innym znakiem.Replaces the existing character at the specified index position with another character.

ToString()

Zwraca ciąg reprezentujący bieżący obiekt.Returns a string that represents the current object.

(Odziedziczone po Object)

Dotyczy

Zobacz też