SecureString SecureString SecureString SecureString Class

Definicja

Reprezentuje tekst, który powinien być poufny, takie jak, usuwając je z pamięci komputera, gdy nie będą 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
SecureStringSecureStringSecureStringSecureString
Implementuje

Przykłady

Poniższy przykład pokazuje sposób użycia SecureString zabezpieczyć hasła użytkownika do użycia jako poświadczenie, aby uruchomić 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żywanie SecureString klasy w przypadku nowych wdrożeń.We don't recommend that you use the SecureString class for new development. Aby uzyskać więcej informacji, zobacz SecureString nie powinna być używana w witrynie GitHub.For more information, see SecureString shouldn't be used on GitHub.

SecureString jest typu ciąg, który jest miarą zabezpieczeń.SecureString is a string type that provides a measure of security. Próbuje uniknąć przechowywania ciągów potencjalnie poufnych w pamięci procesu jako zwykły tekst.It tries to avoid storing potentially sensitive strings in process memory as plain text. (Ograniczenia, jednak zobaczyć jak bezpieczne są SecureString? sekcji.) Wartość wystąpienia SecureString są chronione automatycznie przy użyciu mechanizmu obsługiwane z odpowiedniej platformy podczas inicjowania wystąpienia lub po zmodyfikowaniu wartości.(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. Renderowania wystąpienia niezmienne i unikanie dalszych modyfikacji przez wywołanie aplikacji MakeReadOnly metody.Your application can render the instance immutable and prevent further modification by invoking the MakeReadOnly method.

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

Ważne

Ten typ implementuje IDisposable interfejsu.This type implements the IDisposable interface. Po zakończeniu używania wystąpienia typu, należy usunąć ją bezpośrednio lub pośrednio.When you have finished using an instance of the type, you should dispose of it either directly or indirectly. Do usuwania tego typu, należy wywołać jej Dispose method in Class metoda try / catch bloku.To dispose of the type directly, call its Dispose method in a try/catch block. Aby usunąć ją pośrednio, użyj konstrukcją języka pierwszej klasy takiej jak using (w języku C#) lub Using (w języku 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ę "Przy użyciu obiektu który implementuje interfejs IDisposable" w IDisposable interfejsu.For more information, see the "Using an Object that Implements IDisposable" section in the IDisposable interface topic.

SecureString Klasy i jej elementów członkowskich 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 programu vs. SecureString String vs. SecureString
Operacje SecureString SecureString operations
SecureString i współdziałanie SecureString and interop
Jak bezpieczne jest SecureString?How secure is SecureString?

Ciąg, a SecureStringString versus SecureString

Wystąpienie System.String klasy jest zarówno, które są niezmienne i gdy nie jest już potrzebny, nie może być programowo zaplanowany do wyrzucania elementów bezużytecznych; wystąpienie jest tylko do odczytu po jej utworzeniu, a nie jest możliwe do przewidzenia, kiedy staną się wystąpienia usunięty 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ż System.String wystąpienia są niezmienne, operacje, które są wyświetlane, aby zmodyfikować istniejące wystąpienie utworzyć jej kopię 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 String obiekt zawiera poufne informacje, takie jak hasła, numer karty kredytowej lub dane osobowe, istnieje ryzyko, informacje mogą uzyskać dostęp, gdy jest używane, ponieważ aplikacja nie może usunąć dane 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.

A SecureString obiektu jest podobny do String obiektu, że ma ona wartość tekstową.A SecureString object is similar to a String object in that it has a text value. Jednak wartość SecureString obiekt został przypięty w pamięci, może używać mechanizm ochrony, takie jak szyfrowania, obsługiwanego przez system operacyjny, można modyfikować, dopóki aplikacja oznacza je jako tylko do odczytu i może być usunięty z pamięci komputera przez wywołanie Twojej aplikacji Dispose metody lub przez moduł odśmiecania pamięci środowiska .NET Framework.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ń SecureString klasy, zobacz jak bezpieczne są SecureString? sekcji.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

SecureString Klasa zawiera 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:

Utwórz wystąpienie SecureString obiektuInstantiate a SecureString object
Można utworzyć wystąpienia SecureString obiektu przez wywołanie jego bezparametrowy konstruktor.You instantiate a SecureString object by calling its parameterless constructor.

Dodaj znaki SecureString obiektuAdd characters to a SecureString object
Można dodać pojedynczy znak w czasie SecureString obiektu przez wywołanie jego AppendChar lub InsertAt metody.You can add a single character at a time to a SecureString object by calling its AppendChar or InsertAt method.

Ważne

A SecureString nigdy nie można utworzyć obiektu z String, ponieważ dane poufne już podlega skutków trwałość pamięci niezmienne String 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 SecureString obiekt jest z niezarządzanego źródła znaku w czasie, takie jak Console.ReadKey metody.The best way to construct a SecureString object is from a character-at-a-time unmanaged source, such as the Console.ReadKey method.

Usuń znaki z SecureString obiektuRemove characters from a SecureString object
Możesz zastąpić pojedynczy znak, wywołując SetAt metody, usunąć pojedynczy znak, wywołując RemoveAt metody lub Usuń wszystkie znaki z SecureString wystąpienie przez wywołanie metody Clear metody.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.

Wprowadź SecureString obiektu tylko do odczytuMake the SecureString object read-only
Po zdefiniowaniu ciągu, SecureString reprezentuje obiekt, należy wywołać jej MakeReadOnly metodę, aby utworzyć 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.

Uzyskaj informacje SecureString obiektuGet information about the SecureString object
SecureString Klasa ma tylko dwa elementy członkowskie, które dostarczają informacje na temat ciągu: jego Length właściwość, która wskazuje liczbę jednostek kodu zakodowane w formacie UTF16 w ciągu; i IsReadOnly, metody, która wskazuje, czy to wystąpienie 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ęć przydzielona programowi SecureString wystąpieniaRelease the memory allocated to the SecureString instance
Ponieważ SecureString implementuje IDisposable interfejsu zwolnienie pamięci przez wywołanie metody Dispose metody.Because SecureString implements the IDisposable interface, you release its memory by calling the Dispose method.

SecureString Klasa nie ma elementów członkowskich, które inspekcja, porównaj lub konwertowania wartości SecureString.The SecureString class has no members that inspect, compare, or convert the value of a SecureString. Brak takich elementów członkowskich pomaga w ochronie wartość wystąpienia z przypadkowego lub celowego zagrożeń.The absence of such members helps protect the value of the instance from accidental or malicious exposure. Użyć odpowiednich członków grupy System.Runtime.InteropServices.Marshal klasy, takie jak SecureStringToBSTR metody do manipulowania wartością SecureString obiektu.Use appropriate members of the System.Runtime.InteropServices.Marshal class, such as the SecureStringToBSTR method, to manipulate the value of a SecureString object.

Często używa biblioteki klas programu .NET Framework SecureString wystąpień 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 współdziałanieSecureString and interop

Ponieważ system operacyjny nie obsługuje bezpośrednio SecureString, należy przekonwertować wartość SecureString obiektu na typ ciągu wymagane przed przekazaniem ciąg do metody natywnej.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. Marshal Klasy zawiera pięć metod, które to zrobić: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 deweloperowi się od zera i zwalniają pamięci, jak jest już potrzebne.It is the responsibility of the developer to zero out and free that memory as soon as it is no longer needed. Każdy ciąg konwersji i pamięć alokacji metod ma odpowiedniej metody do zera się i zwalniają ilość 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 free — 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 bezpieczne jest SecureString?How secure is SecureString?

Po utworzeniu prawidłowo, SecureString wystąpienia chroni więcej danych niż String.When created properly, a SecureString instance provides more data protection than a String. Podczas tworzenia ciągu ze źródła znaku w czasie, String tworzy wiele pośredni w pamięci, natomiast SecureString tworzy pojedyncze 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 z String obiektów jest niedeterministyczny.Garbage collection of String objects is non-deterministic. Ponadto, ponieważ jego pamięci nie jest przypięty, moduł zbierający elementy bezużyteczne spowoduje, że dodatkowe kopie String wartości, gdy przenoszenie i kompaktowanie 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. Z kolei ilość pamięci przydzielona do SecureString obiektu jest przypięty i pamięci może zostać uwolniony przez wywołanie metody Dispose metody.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 SecureString wystąpienia jest bezpieczniejszy niż danych przechowywanych w String wystąpienia, istnieją ograniczenia znaczące jak bezpieczne SecureString to wystąpienie.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 następujące elementy:These include:

PlatformaPlatform
W systemie operacyjnym Windows, zawartość SecureString tablicy znaków wewnętrznego wystąpienia są szyfrowane.On the Windows operating system, the contents of a SecureString instance's internal character array are encrypted. Jednakże czy ze względu na Brak 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ętrznej pamięci masowej na platformy inne niż Windows.Because of this platform dependency, SecureString does not encrypt the internal storage on non-Windows platform. Innych technik są używane na tych platformach zapewnia dodatkową ochronę.Other techniques are used on those platforms to provide additional protection.

Czas trwaniaDuration
Nawet wtedy, gdy SecureString wdrożenia jest w stanie korzystać z szyfrowania, zwykły tekst przypisany do SecureString wystąpienie może zostać uwidoczniona 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ż Windows nie oferują implementacji bezpieczny ciąg, na poziomie systemu operacyjnego, programu .NET Framework jest nadal ma można przekonwertować wartości bezpieczny ciąg na jego reprezentację w postaci zwykłego tekstu, aby można było go 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.

  • Zawsze, gdy wartość bezpieczny ciąg jest modyfikowany przez metody takie jak AppendChar lub RemoveAt, może odszyfrować, (który jest konwersji z powrotem na zwykły tekst), zmodyfikować i ponownie 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ędzyoperacyjności, musi zostać przekonwertowana 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 SecureString i międzyoperacyjne sekcji.For more information, see the SecureString and interop section.

Przedział czasu, dla którego SecureString wartość tego wystąpienia jest widoczna tylko został skrócony w porównaniu z String klasy.The time interval for which the SecureString instance's value is exposed is merely shortened in comparison to the String class.

Porównanie użycie magazynówStorage versus usage
Ogólnie rzecz biorąc SecureString klasa definiuje mechanizm magazynu 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. Poza programem .NET Framework sam mechanizm użycia obsługuje jednak SecureString.However, outside of the .NET Framework itself, no usage mechanism supports SecureString. Oznacza to, że bezpieczny ciąg, muszą zostać skonwertowane do użytecznej postaci (zwykle w formie zwykłego tekstu), który może zostać rozpoznany przez jego element docelowy i że odszyfrowywania i konwersji musi wystąpić w przestrzeni.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ólne SecureString jest bezpieczniejszy niż String ponieważ ogranicza narażenie poufnych dane.Overall, SecureString is more secure than String because it limits the exposure of sensitive string data. Jednak te ciągi nadal jest narażona na jakikolwiek proces lub operacja, która ma dostęp do pamięci, takich jak złośliwe proces uruchomiony na komputerze-hoście, zrzut procesu lub plik wymiany widoczne 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żywania SecureString do ochrony haseł, zalecaną alternatywą jest użycie nieprzezroczyste dojście do poświadczeń, które są przechowywane 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() SecureString() SecureString() SecureString()

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

SecureString(Char*, Int32) SecureString(Char*, Int32) SecureString(Char*, Int32) SecureString(Char*, Int32)

Inicjuje nowe wystąpienie klasy SecureString klasy z podtablicę o długości od Char obiektów.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 to SecureString().The CLS-compliant alternative is SecureString().

Właściwości

Length Length Length Length

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

Metody

AppendChar(Char) AppendChar(Char) AppendChar(Char) AppendChar(Char)

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

Clear() Clear() Clear() Clear()

Usuwa wartość bieżącej bezpieczny ciąg.Deletes the value of the current secure string.

Copy() Copy() Copy() Copy()

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

Dispose() Dispose() Dispose() Dispose()

Zwalnia wszelkie zasoby używane przez bieżące SecureString obiektu.Releases all resources used by the current SecureString object.

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

Określa, czy określony obiekt jest równy bieżącemu obiektowi.Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

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

(Inherited from Object)
GetType() GetType() GetType() GetType()

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

(Inherited from Object)
InsertAt(Int32, Char) InsertAt(Int32, Char) InsertAt(Int32, Char) InsertAt(Int32, Char)

Wstawia znak, w tym bezpiecznego ciągu w położeniu określonego indeksu.Inserts a character in this secure string at the specified index position.

IsReadOnly() IsReadOnly() IsReadOnly() IsReadOnly()

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

MakeReadOnly() MakeReadOnly() MakeReadOnly() MakeReadOnly()

Powoduje, że wartość tekstu tego bezpieczny ciąg tylko do odczytu.Makes the text value of this secure string read-only.

MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

Tworzy płytką kopię bieżącego Object.Creates a shallow copy of the current Object.

(Inherited from Object)
RemoveAt(Int32) RemoveAt(Int32) RemoveAt(Int32) RemoveAt(Int32)

Usuwa znak na pozycji indeksu określony z tym bezpieczny ciąg.Removes the character at the specified index position from this secure string.

SetAt(Int32, Char) SetAt(Int32, Char) SetAt(Int32, Char) SetAt(Int32, Char)

Zamienia istniejący znak na pozycji indeksu określonego innemu znakowi.Replaces the existing character at the specified index position with another character.

ToString() ToString() ToString() ToString()

Zwraca ciąg, który reprezentuje bieżący obiekt.Returns a string that represents the current object.

(Inherited from Object)

Dotyczy

Zobacz też