Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Это важно
Рекомендуется не использовать SecureString
класс для новой разработки в .NET (Core) или при переносе существующего кода в .NET (Core). Дополнительную информацию см. в материале SecureString не следует использовать.
В этой статье приводятся дополнительные замечания к справочной документации по этому API.
SecureString — это строковый тип, предоставляющий меру безопасности. Он пытается избежать хранения потенциально конфиденциальных строк в памяти процесса в виде обычного текста. (Однако сведения об ограничениях см. в разделе "Защита SecureString". ) Значение экземпляра SecureString автоматически защищается с помощью механизма, поддерживаемого базовой платформой при инициализации экземпляра или при изменении значения. Ваше приложение может сделать экземпляр неизменяемым и предотвратить дальнейшую модификацию путем вызова метода MakeReadOnly.
Максимальная длина экземпляра SecureString составляет 65 536 символов.
Это важно
Этот тип реализует 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 метод.
Это важно
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. К ним относятся:
Платформа
В операционной системе Windows содержимое внутреннего массива символов экземпляра SecureString шифруется. Тем не менее, из-за отсутствия API или проблем управления ключами шифрование недоступно на всех платформах. Из-за зависимости от платформы SecureString не шифрует внутреннее хранилище на платформах, отличных от Windows. Другие методы используются на этих платформах для обеспечения дополнительной защиты.
Продолжительность
Даже если SecureString реализация может использовать шифрование, открытый текст, назначенный SecureString экземпляру, может быть доступен в разное время:
Так как Windows не предлагает безопасную реализацию строки на уровне операционной системы, .NET по-прежнему должен преобразовать безопасное строковое значение в его представление обычного текста, чтобы использовать его.
Всякий раз, когда значение безопасной строки изменяется такими методами, как AppendChar или RemoveAt, его необходимо расшифровать (то есть преобразовать обратно в обычный текст), изменить и затем зашифровать снова.
Если в вызове взаимодействия используется безопасная строка, она должна быть преобразована в строку ANSI, строку Юникода или двоичную строку (BSTR). Дополнительные сведения см. в разделе SecureString и интероперабельность.
Интервал времени, в течение которого значение экземпляра SecureString доступно, просто сокращен по сравнению со временем класса String.
Хранилище и использование, как правило, SecureString класс определяет механизм хранения строковых значений, которые должны быть защищены или сохранены конфиденциальными. Однако механизм использования, находящийся за пределами .NET, не поддерживает SecureString. Это означает, что безопасная строка должна быть преобразована в доступную для использования форму (обычно чистую текстовую форму), которую можно распознать в целевом объекте, и это расшифровка и преобразование должны происходить в пользовательском пространстве.
В целом, безопаснее, SecureString чем String из-за ограничения воздействия конфиденциальных строковых данных. Однако эти строки по-прежнему могут быть подвержены любому процессу или операции, которая имеет доступ к необработанной памяти, например вредоносный процесс, выполняемый на хост-компьютере, дампе процесса или просматриваемом пользователем файле буфера. Вместо использования SecureString для защиты паролей рекомендуется использовать непрозрачный дескриптор учетных данных, хранящихся вне процесса.