SecureString Класс
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Представляет текст, который должен храниться в конфиденциальном виде, например при удалении его из памяти компьютера, если он больше не нужен. Этот класс не наследуется.
public ref class SecureString sealed : IDisposable
public sealed class SecureString : IDisposable
type SecureString = class
interface IDisposable
Public NotInheritable Class SecureString
Implements IDisposable
- Наследование
-
SecureString
- Реализации
Примеры
В следующем примере показано, как защитить SecureString пароль пользователя для использования в качестве учетных данных для запуска нового процесса.
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
Комментарии
Important
Рекомендуется не использовать SecureString класс для новой разработки в .NET (Core) или при миграции из .NET Framework. Дополнительную информацию см. в материале SecureString не следует использовать.
Note
В этой статье приводятся дополнительные замечания к справочной документации по этому API.
SecureString — это строковый тип, предоставляющий меру безопасности. Он пытается избежать хранения потенциально конфиденциальных строк в памяти процесса в виде обычного текста. (Однако сведения об ограничениях см. в разделе "Защита SecureString". ) Значение экземпляра SecureString автоматически защищается с помощью механизма, поддерживаемого базовой платформой при инициализации экземпляра или при изменении значения. Ваше приложение может сделать экземпляр неизменяемым и предотвратить дальнейшую модификацию путем вызова метода MakeReadOnly.
Максимальная длина экземпляра SecureString составляет 65 536 символов.
Important
Этот тип реализует IDisposable интерфейс. Завершив использование экземпляра типа, его следует удалить напрямую или косвенно. Чтобы удалить тип напрямую, вызовите его Dispose метод в блоке try/catch . Чтобы удалить его косвенно, используйте конструкцию языка, например using (в C#) или Using (в Visual Basic). Дополнительные сведения см. в разделе "Использование объекта, реализующего IDisposable" в IDisposable разделе интерфейса.
Класс SecureString и его члены не видны COM. Дополнительные сведения см. в разделе ComVisibleAttribute.
Строка против SecureString
Экземпляр System.String класса является неизменяемым и, если он больше не нужен, невозможно программно запланировать сборку мусора. То есть экземпляр доступен только для чтения после его создания, и невозможно предсказать, когда экземпляр будет удален из памяти компьютера. Так как System.String экземпляры неизменяемы, операции, которые, как представляется, изменяют существующий экземпляр, фактически создают копию для управления. Следовательно, если String объект содержит конфиденциальную информацию, например пароль, номер кредитной карты или персональные данные, может возникнуть риск того, что информация может быть обнаружена после его использования, так как приложение не может удалить данные из памяти компьютера.
Объект SecureString похож на String объект, имеющий текстовое значение. Однако значение SecureString объекта:
- Закреплен в памяти.
- Может использовать механизм защиты, например шифрование, предоставляемое базовой операционной системой.
- Можно изменить, пока приложение не помечает его как доступное только для чтения.
- Можно удалить из памяти компьютера либо приложением, вызывающим Dispose метод, либо .NET сборщиком мусора.
Для обсуждения ограничений класса SecureString, см. раздел «Насколько безопасен SecureString?».
Операции SecureString
Класс SecureString включает элементы, которые позволяют выполнять следующие действия:
Инициализируйте объект типа SecureString путем вызова его конструктора без параметров.
Добавление символов в SecureString объект Можно добавить один символ за раз в SecureString объект, вызвав его AppendChar или InsertAt метод.
Important
SecureString Объект никогда не должен создаваться из Stringобъекта, так как конфиденциальные данные уже подвержены последствиям сохраняемости памяти неизменяемого String класса. Лучший способ создания SecureString объекта — из неуправляемого источника символ за раз, например, с помощью Console.ReadKey метода.
Удаление символов из объекта SecureString. Можно заменить отдельный символ, вызвав метод SetAt, удалить отдельный символ, вызвав метод RemoveAt, или удалить все символы из экземпляра SecureString, вызвав метод Clear.
SecureString Сделайте объект доступным только для чтения после определения строки, представляющей SecureString объект, вызовите его MakeReadOnly метод, чтобы сделать строку доступной только для чтения.
Получите информацию об объекте SecureString. Класс SecureString содержит только два члена, которые предоставляют сведения об объекте SecureString: его свойство IsReadOnly, указывающее количество единиц кода в строке, закодированной в UTF16; и метод , указывающий, является ли экземпляр доступным только для чтения.
Отпустите память, выделенную SecureString экземпляру, так как SecureString реализует IDisposable интерфейс, вы освобождаете память, вызывая Dispose метод.
Класс SecureString не имеет элементов, которые проверяют, сравнивают или преобразуют значение SecureStringобъекта. Отсутствие таких элементов помогает защитить значение экземпляра от случайного или вредоносного воздействия. Используйте соответствующие члены System.Runtime.InteropServices.Marshal класса, например SecureStringToBSTR метод, для управления значением SecureString объекта.
Библиотека классов .NET обычно использует SecureString экземпляры следующим образом:
- Чтобы предоставить сведения о пароле процессу, используйте ProcessStartInfo структуру или вызовите перегрузку метода Process.Start, параметром которой является тип SecureString.
- Чтобы предоставить сведения о сетевом пароле, вызвав конструктор класса с параметром NetworkCredential типа SecureString или используя свойство NetworkCredential.SecurePassword.
- Чтобы указать пароль для аутентификации SQL Server, вызовите SqlCredential.SqlCredential конструктор или извлеките значение SqlCredential.Password свойства.
- Передать строку в неуправляемый код. Дополнительные сведения см. в разделе SecureString и интероперабельность.
SecureString и интероперабельность
Так как операционная система не поддерживает SecureStringнапрямую, необходимо преобразовать значение SecureString объекта в обязательный тип строки перед передачей строки в собственный метод. Класс Marshal имеет пять методов, которые выполняют следующие действия:
- Marshal.SecureStringToBSTR, который преобразует строковое SecureString значение в двоичную строку (BSTR), распознаваемую COM.
- Marshal.SecureStringToCoTaskMemAnsi и Marshal.SecureStringToGlobalAllocAnsi, которые копируют значение строки SecureString в строку ANSI в неуправляемой памяти.
- Marshal.SecureStringToCoTaskMemUnicode и Marshal.SecureStringToGlobalAllocUnicode, которые копируют значение строки SecureString в Unicode-строку в неуправляемой памяти.
Каждый из этих методов создает строку с четким текстом в неуправляемой памяти. Ответственность разработчика заключается в том, чтобы обнулить и освободить память, как только она становится ненужной. Каждый из методов преобразования строк и выделения памяти имеет соответствующий метод для обнуления и освобождения выделенной памяти.
Насколько безопасен SecureString?
При правильном создании SecureString экземпляр обеспечивает большую защиту данных, чем String. При создании строки из источника, поэтапно выдающего символы, String создаёт несколько промежуточных экземпляров в памяти, тогда как SecureString создаёт только один экземпляр. Сборка мусора объектов String недетерминированна. Кроме того, поскольку память не закреплена, сборщик мусора создаст дополнительные копии значений String при перемещении и сжатии памяти. В отличие от этого, память, выделенная SecureString объекту, зафиксирована, и её можно освободить с помощью вызова метода Dispose.
Несмотря на то, что данные, хранящиеся в экземпляре SecureString, более безопасны, чем данные, хранящиеся в экземпляре String, имеется значительные ограничения на то, насколько безопасен экземпляр SecureString. К ним относятся:
Platform
В операционной системе Windows содержимое внутреннего массива символов экземпляра SecureString шифруется. Тем не менее, из-за отсутствия API или проблем управления ключами шифрование недоступно на всех платформах. Из-за зависимости от платформы SecureString не шифрует внутреннее хранилище на платформах, отличных от Windows. Другие методы используются на этих платформах для обеспечения дополнительной защиты.
Duration
Даже если SecureString реализация может использовать шифрование, открытый текст, назначенный SecureString экземпляру, может быть доступен в разное время:
- Так как Windows не предлагает безопасную реализацию строки на уровне операционной системы, .NET по-прежнему должен преобразовать безопасное строковое значение в его представление обычного текста, чтобы использовать его.
- Всякий раз, когда значение безопасной строки изменяется такими методами, как AppendChar или RemoveAt, его необходимо расшифровать (то есть преобразовать обратно в обычный текст), изменить и затем зашифровать снова.
- Если в вызове взаимодействия используется безопасная строка, она должна быть преобразована в строку ANSI, строку Юникода или двоичную строку (BSTR). Дополнительные сведения см. в разделе SecureString и интероперабельность.
Интервал времени, в течение которого значение экземпляра SecureString доступно, просто сокращен по сравнению со временем класса String.
Хранилище и использование
Как правило, SecureString класс определяет механизм хранения строковых значений, которые должны быть защищены или сохранены конфиденциальными. Однако механизм использования, находящийся за пределами .NET, не поддерживает SecureString. Это означает, что безопасная строка должна быть преобразована в доступную для использования форму (обычно чистую текстовую форму), которую можно распознать в целевом объекте, и это расшифровка и преобразование должны происходить в пользовательском пространстве.
В целом, безопаснее, SecureString чем String из-за ограничения воздействия конфиденциальных строковых данных. Однако эти строки по-прежнему могут быть подвержены любому процессу или операции, которая имеет доступ к необработанной памяти, например вредоносный процесс, выполняемый на хост-компьютере, дампе процесса или просматриваемом пользователем файле буфера. Вместо использования SecureString для защиты паролей рекомендуется использовать непрозрачный дескриптор учетных данных, хранящихся вне процесса.
Конструкторы
| Имя | Описание |
|---|---|
| SecureString() |
Инициализирует новый экземпляр класса SecureString. |
| SecureString(Char*, Int32) |
Инициализирует новый экземпляр SecureString класса из субаррей Char объектов. Этот конструктор не соответствует CLS. Альтернатива, совместимая с CLS, является SecureString(). |
Свойства
| Имя | Описание |
|---|---|
| Length |
Возвращает количество символов в текущей безопасной строке. |
Методы
| Имя | Описание |
|---|---|
| AppendChar(Char) |
Добавляет символ в конец текущей безопасной строки. |
| Clear() |
Удаляет значение текущей безопасной строки. |
| Copy() |
Создает копию текущей безопасной строки. |
| Dispose() |
Освобождает все ресурсы, используемые текущим SecureString объектом. |
| Equals(Object) |
Определяет, равен ли указанный объект текущему объекту. (Унаследовано от Object) |
| GetHashCode() |
Служит хэш-функцией по умолчанию. (Унаследовано от Object) |
| GetType() |
Возвращает Type текущего экземпляра. (Унаследовано от Object) |
| InsertAt(Int32, Char) |
Вставляет символ в эту безопасную строку по указанной позиции индекса. |
| IsReadOnly() |
Указывает, помечена ли эта безопасная строка только для чтения. |
| MakeReadOnly() |
Делает текстовое значение этой безопасной строки доступной только для чтения. |
| MemberwiseClone() |
Создает неглубокую копию текущей Object. (Унаследовано от Object) |
| RemoveAt(Int32) |
Удаляет символ в указанной позиции индекса из этой безопасной строки. |
| SetAt(Int32, Char) |
Заменяет существующий символ в указанной позиции индекса другим символом. |
| ToString() |
Возвращает строку, представляющую текущий объект. (Унаследовано от Object) |