SecureString Класс

Определение

Представляет текст, который должен оставаться конфиденциальным, например, путем его удаления из памяти компьютера, если он больше не нужен.Represents text that should be kept confidential, such as by deleting it from computer memory when no longer needed. Этот класс не наследуется.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
Наследование
SecureString
Реализации

Примеры

В следующем примере показано, SecureString как использовать для защиты пароля пользователя, чтобы использовать его в качестве учетных данных для запуска нового процесса.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

Комментарии

Важно!

Мы не рекомендуем использовать SecureString класс для новой разработки.We don't recommend that you use the SecureString class for new development. Дополнительные сведения см. в разделе SecureString не следует использовать в GitHub.For more information, see SecureString shouldn't be used on GitHub.

SecureString— это строковый тип, предоставляющий меру безопасности.SecureString is a string type that provides a measure of security. Он пытается избежать сохранения потенциально конфиденциальных строк в памяти процесса в виде обычного текста.It tries to avoid storing potentially sensitive strings in process memory as plain text. (Дополнительные сведения об ограничениях см. в разделе насколько безопасным является SecureString? ) Значение экземпляра SecureString автоматически защищается с помощью механизма, поддерживаемого базовой платформой при инициализации экземпляра или при изменении значения.(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. Приложение может преобразовать экземпляр в неизменяемый и предотвратить дальнейшее изменение, вызвав MakeReadOnly метод.Your application can render the instance immutable and prevent further modification by invoking the MakeReadOnly method.

Максимальная длина SecureString экземпляра — 65 536 символов.The maximum length of a SecureString instance is 65,536 characters.

Важно!

Этот тип реализует интерфейс IDisposable.This type implements the IDisposable interface. После завершения использования экземпляра типа его следует удалить прямо или косвенно.When you have finished using an instance of the type, you should dispose of it either directly or indirectly. Чтобы сделать это прямо, вызовите его метод Dispose в блоке try/catch.To dispose of the type directly, call its Dispose method in a try/catch block. Чтобы сделать это косвенно, используйте языковые конструкции, такие как using (в C#) или Using (в Visual Basic).To dispose of it indirectly, use a language construct such as using (in C#) or Using (in Visual Basic). Дополнительные сведения см. в разделе "Использование объекта, реализующего IDisposable" в статье об интерфейсе IDisposable.For more information, see the "Using an Object that Implements IDisposable" section in the IDisposable interface topic.

SecureString Класс и его члены не видимы для com.The SecureString class and its members are not visible to COM. Для получения дополнительной информации см. ComVisibleAttribute.For more information, see ComVisibleAttribute.

СодержаниеIn this section:

Сравнение строк и SecureString String vs. SecureString
Операции SecureString SecureString operations
SecureString и Interop SecureString and interop
Насколько безопасным является SecureString?How secure is SecureString?

Строка и SecureStringString versus SecureString

Экземпляр System.String класса является неизменяемым и, когда он больше не нужен, не может быть запланированным программным путем для сборки мусора, т. е. экземпляр доступен только для чтения после его создания, и невозможно предсказать, когда экземпляр будет удалено из памяти компьютера.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. Поскольку System.String экземпляры являются неизменяемыми, операции, которые могут изменить существующий экземпляр, фактически создают его копию для обработки.Because System.String instances are immutable, operations that appear to modify an existing instance actually create a copy of it to manipulate. Следовательно, если String объект содержит конфиденциальные сведения, такие как пароль, номер кредитной карты или персональные данные, существует риск, что данные можно было бы раскрывать после использования, так как приложение не может удалить данные из памяти компьютера. .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.

SecureString Объект похожString на объект в том, что он имеет текстовое значение.A SecureString object is similar to a String object in that it has a text value. Однако значение SecureString объекта закрепляется в памяти, может использовать механизм защиты, такой как шифрование, предоставляемый базовой операционной системой, может быть изменен до тех пор, пока приложение не пометит его как доступное только для чтения и может быть удалено из памяти компьютера. либо приложением, вызывающим Dispose метод, либо сборщиком мусора .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.

Сведения об ограничениях SecureString класса см. в разделе Безопасная защита с помощью SecureString.For a discussion of the limitations of the SecureString class, see the How secure is SecureString? section.

К началуBack to top

Операции SecureStringSecureString operations

SecureString Класс включает члены, которые позволяют выполнять следующие действия:The SecureString class includes members that allow you to do the following:

Создание экземпляра SecureString объектаInstantiate a SecureString object
Экземпляр SecureString объекта создается путем вызова его конструктора без параметров.You instantiate a SecureString object by calling its parameterless constructor.

Добавление символов в SecureString объектAdd characters to a SecureString object
Можно добавить один символ за раз SecureString в объект, вызвав его AppendChar метод или InsertAt .You can add a single character at a time to a SecureString object by calling its AppendChar or InsertAt method.

Важно!

Объект не должен быть создан Stringиз, так как конфиденциальные данные уже подчиняются последствиям сохраняемости памяти для неизменяемого String класса. SecureStringA 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. Лучший способ создания SecureString объекта — из неуправляемого источника «символ-время», такого 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.

Удаление символов из SecureString объектаRemove characters from a SecureString object
Можно заменить отдельный символ, вызвав SetAt метод, удалив отдельный символ, RemoveAt вызвав метод, или SecureString удалить все символы из экземпляра, вызвав 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.

SecureString Сделать объект доступным только для чтенияMake the SecureString object read-only
Определив строку, SecureString которую представляет объект, вызовите его MakeReadOnly метод, чтобы сделать строку доступной только для чтения.Once you have defined the string that the SecureString object represents, you call its MakeReadOnly method to make the string read-only.

Получение сведений об SecureString объектеGet information about the SecureString object
Класс содержит только два члена, которые предоставляют сведения о строке: его Length свойство, которое указывает число единиц кода в кодировке UTF16, в строке, и IsReadOnlyметод, который указывает, является ли экземпляр SecureString только для чтения.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.

Освобождение памяти, выделенной для SecureString экземпляраRelease the memory allocated to the SecureString instance
Поскольку SecureString Dispose реализует интерфейс, вы освобождаете его память путем вызова метода. IDisposableBecause SecureString implements the IDisposable interface, you release its memory by calling the Dispose method.

Класс не имеет членов, которые проверяют, сравнивают или преобразуют значение SecureString. SecureStringThe SecureString class has no members that inspect, compare, or convert the value of a SecureString. Отсутствие таких членов помогает защитить значение экземпляра от случайной или злонамеренной уязвимости.The absence of such members helps protect the value of the instance from accidental or malicious exposure. Используйте соответствующие члены System.Runtime.InteropServices.Marshal класса, такие SecureStringToBSTR как метод, для SecureString управления значением объекта.Use appropriate members of the System.Runtime.InteropServices.Marshal class, such as the SecureStringToBSTR method, to manipulate the value of a SecureString object.

Библиотека классов .NET Framework обычно использует SecureString экземпляры следующими способами.The .NET Framework Class Library commonly uses SecureString instances in the following ways:

К началуBack to top

SecureString и InteropSecureString and interop

Поскольку операционная система не поддерживает SecureStringнепосредственно, необходимо преобразовать значение SecureString объекта в требуемый строковый тип перед передачей строки в собственный метод.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 Класс имеет пять методов, которые делают это:The Marshal class has five methods that do this:

Каждый из этих методов создает в неуправляемой памяти строку в виде открытого текста.Each of these methods creates a clear-text string in unmanaged memory. Разработчику необходимо обнулить и освободить память, как только она больше не нужна.It is the responsibility of the developer to zero out and free that memory as soon as it is no longer needed. Каждое преобразование строки и методы выделения памяти имеют соответствующий метод для обнуления и освобождения выделенной памяти:Each of the string conversion and memory allocation methods has a corresponding method to zero out and free the allocated memory:

Метод выделения и преобразованияAllocation and conversion method Ноль и бесплатный методZero and free method
Marshal.SecureStringToBSTR Marshal.ZeroFreeBSTR
Marshal.SecureStringToCoTaskMemAnsi Marshal.ZeroFreeCoTaskMemAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeCoTaskMemUnicode
Marshal.SecureStringToGlobalAllocAnsi Marshal.ZeroFreeGlobalAllocAnsi
Marshal.SecureStringToCoTaskMemUnicode Marshal.ZeroFreeGlobalAllocUnicode

К началуBack to top

Насколько безопасным является SecureString?How secure is SecureString?

При правильном создании SecureString экземпляр обеспечивает дополнительную защиту данных, Stringчем.When created properly, a SecureString instance provides more data protection than a String. При создании строки на основе символа источника String времени создает несколько промежуточных данных в памяти, SecureString тогда как создает только один экземпляр.When creating a string from a character-at-a-time source, String creates multiple intermediate in memory, whereas SecureString creates just a single instance. Сборка мусора объектов не является детерминированной. StringGarbage collection of String objects is non-deterministic. Кроме того, поскольку память не закреплена, сборщик мусора будет создавать дополнительные копии String значений при перемещении и сжатии памяти.In addition, because its memory is not pinned, the garbage collector will make additional copies of String values when moving and compacting memory. В отличие от этого, память, выделенная для SecureString объекта, закреплена, и эту память можно освободить путем Dispose вызова метода.In contrast, the memory allocated to a SecureString object is pinned, and that memory can be freed by calling the Dispose method.

Хотя данные, хранящиеся SecureString в экземпляре, более безопасны, чем String данные, хранящиеся в экземпляре, существуют значительные 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. Сюда входит следующее.These include:

PlatformPlatform
В операционной системе Windows содержимое SecureString массива внутренних символов экземпляра шифруется.On the Windows operating system, the contents of a SecureString instance's internal character array are encrypted. Тем не менее, из-за отсутствия API или проблем с управлением ключами шифрование недоступно на всех платформах.However, whether because of missing APIs or key management issues, encryption is not available on all platforms. Из-за этой зависимости SecureString от платформы не шифрует внутреннее хранилище на платформе, отличной от Windows.Because of this platform dependency, SecureString does not encrypt the internal storage on non-Windows platform. Для обеспечения дополнительной защиты на этих платформах используются другие методы.Other techniques are used on those platforms to provide additional protection.

ДлительностьDuration
Даже если SecureString реализация может использовать преимущества шифрования, простой текст, назначенный SecureString экземпляру, может быть представлен в различные моменты времени: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:

  • Поскольку в Windows не предусмотрена Безопасная реализация строк на уровне операционной системы, .NET Framework по-прежнему необходимо преобразовать защищенное строковое значение в его текстовое представление, чтобы использовать его.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.

  • Всякий раз, когда значение защищенной строки изменяется такими методами AppendChar , RemoveAtкак или, оно должно быть расшифровано (то есть преобразовано обратно в обычный текст), изменено, а затем снова зашифровано.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.

  • Если безопасная строка используется в вызове взаимодействия, ее необходимо преобразовать в строку ANSI, строку в Юникоде или двоичную строку (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). Дополнительные сведения см. в разделе SecureString и Interop .For more information, see the SecureString and interop section.

Интервал времени, для которого SecureString предоставляется значение экземпляра, просто сокращается в сравнении String с классом.The time interval for which the SecureString instance's value is exposed is merely shortened in comparison to the String class.

Хранение и использованиеStorage versus usage
В SecureString общем, класс определяет механизм хранения для строковых значений, которые должны быть защищены или сохранены в конфиденциальном виде.More generally, the SecureString class defines a storage mechanism for string values that should be protected or kept confidential. Однако за пределами самого .NET Framework механизм использования не поддерживается SecureString.However, outside of the .NET Framework itself, no usage mechanism supports SecureString. Это означает, что безопасная строка должна быть преобразована в пригодную для использования форму (обычно это форма с открытым текстом), которую можно распознать целевым объектом, а расшифровка и преобразование должны происходить в пространстве пользователя.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.

В целом SecureString , является более безопасным String , чем потому, что он ограничивает раскрытие конфиденциальных строковых данных.Overall, SecureString is more secure than String because it limits the exposure of sensitive string data. Однако эти строки могут по-прежнему предоставляться любому процессу или операции, имеющей доступ к необработанной памяти, например к вредоносному процессу, выполняемому на главном компьютере, дампу процесса или файлу подкачки, видимому пользователю.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. Вместо использования SecureString для защиты паролей рекомендуется использовать непрозрачный маркер для учетных данных, хранящихся за пределами процесса.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.

К началуBack to top

Конструкторы

SecureString()

Инициализирует новый экземпляр класса SecureString.Initializes a new instance of the SecureString class.

SecureString(Char*, Int32)

Инициализирует новый экземпляр класса SecureString из подмассива объектов Char.Initializes a new instance of the SecureString class from a subarray of Char objects.

Этот конструктор несовместим с CLS.This constructor is not CLS-compliant. CLS-совместимая альтернатива — SecureString().The CLS-compliant alternative is SecureString().

Свойства

Length

Возвращает количество символов в текущей защищенной строке.Gets the number of characters in the current secure string.

Методы

AppendChar(Char)

Добавляет знак в конец текущей защищенной строки.Appends a character to the end of the current secure string.

Clear()

Удаляет значение текущей защищенной строки.Deletes the value of the current secure string.

Copy()

Создает копию текущей защищенной строки.Creates a copy of the current secure string.

Dispose()

Освобождает все ресурсы, используемые текущим объектом SecureString.Releases all resources used by the current SecureString object.

Equals(Object)

Определяет, равен ли заданный объект текущему объекту.Determines whether the specified object is equal to the current object.

(Унаследовано от Object)
GetHashCode()

Служит хэш-функцией по умолчанию.Serves as the default hash function.

(Унаследовано от Object)
GetType()

Возвращает объект Type для текущего экземпляра.Gets the Type of the current instance.

(Унаследовано от Object)
InsertAt(Int32, Char)

Вставляет знак в заданную индексом позицию защищенной строки.Inserts a character in this secure string at the specified index position.

IsReadOnly()

Указывает, что защищенная строка доступна только для чтения.Indicates whether this secure string is marked read-only.

MakeReadOnly()

Делает текстовое значение этой защищенной строки доступным только для чтения.Makes the text value of this secure string read-only.

MemberwiseClone()

Создает неполную копию текущего объекта Object.Creates a shallow copy of the current Object.

(Унаследовано от Object)
RemoveAt(Int32)

Удаляет из защищенной строки знак, расположенный по указанному индексу.Removes the character at the specified index position from this secure string.

SetAt(Int32, Char)

Заменяет расположенный по указанному индексу знак другим знаком.Replaces the existing character at the specified index position with another character.

ToString()

Возвращает строку, представляющую текущий объект.Returns a string that represents the current object.

(Унаследовано от Object)

Применяется к

Дополнительно