Подтвердить что ты не робот

Есть ли какая-либо польза от использования SecureString в ASP.NET?

Если я правильно понимаю, это означает, что текст остается открытым, поэтому приложение защищено от эзотерических атак на память, кучу мусора или память, выгружаемую на диск. SecureString получает неуправляемые байты и потребляет один неуправляемый байт во время - тогда строка удаляется из памяти. (Исправьте меня, если я уйду!)

В ASP.NET секрет собирается в веб-форме, которая отправляется обратно в HTTPS. Но тогда объект Request возвращает все значения запроса из формы в пары значений имени и помещает их в коллекцию, например. Запросить [ "TxtPassword" ] - так что даже до того, как я могу получить строку, она уже была написана небезопасно в памяти. Хуже того, если бы я использовал элемент управления, тогда в незащищенном представлении будет больше управляемых строк в свойстве TextBox.

Чтобы что-либо сделать с помощью этой SecureString, мне нужен API, который принимает неуправляемые строки, поэтому кажется, что я не могу использовать защищенную строку для хранимого параметра proc или многое другое.

Я делаю это неправильно или это безумное поручение, чтобы попытаться использовать SecureString, а не утечка копии незакрепленной строки в управляемую память?

Переключение на OAuth или Windows auth не является вариантом.

4b9b3361

Ответ 1

Как вы правильно вывели, а другие уже упомянули, нет смысла использовать SecureString для хранения чувствительных к безопасности данных, которые поступают из форма ASP.NET, поскольку эти данные уже присутствуют в памяти в виде обычного текста.

Однако существуют другие сценарии, в которых рекомендуется использовать SecureString, потому что конфиденциальные данные создаются самой программой и не должны оставаться в памяти после того, как она будет работать с ней. Например, создание сайта SharePoint программно или передача учетных данных аутентификации из одной системы в другую.

Вернувшись в старые добрые времена, было проще обеспечить, чтобы срок службы конфиденциальных данных был как можно короче. Он может быть выделен в стеке и очищен, как только программа будет выполнена с его помощью:

char secret[512];
generate_secret(secret, sizeof(secret));
do_something_with(secret);
memset(secret, 0, sizeof(secret));
// Secret data is now gone.

Такой подход невозможен с управляемыми строками, но главным образом потому, что:

  • Они не выделены в стеке,
  • Они неизменяемы, поэтому их нельзя очистить,
  • Они не одноразовые, поэтому нет гарантии о времени, когда GC освободит данные. Он может даже никогда не быть освобожден, в зависимости от условий памяти.

SecureString пытается решить эту проблему, будучи изменчивым и одноразовым, что позволяет писать:

using (SecureString secret = new SecureString()) {
    GenerateSecret(secret);
    secret.MakeReadOnly();
    DoSomethingWith(secret);
}
// Secret data is now gone.

Ответ 2

Я думаю, что у вас есть основы этого. SecureString разработан с точки зрения нахождения на стороне клиента. Таким образом, для приложения WPF/Winforms (и, возможно, Silverlight, не помню, если оно там), это стоит тонн, а для приложения на стороне сервера - не столько из-за того, что он не является первым для обработки строки.

Ответ 3

SecureString лучше всего использовать для распределения сетевых учетных данных для прямых вызовов между системами. На веб-арене указано, что если учетные данные вошли в сеть, где-то в открытом виде, но если вам нужно отправить эти учетные данные через стандартный учетный запрос (ftp, службы каталогов и т.д.), То использование SecureString не больно, как метод прохождения. Хотя вы правы, что строка уже находится на вашей серверной системе в виде простого текста, вы, по крайней мере, можете уменьшить расстояние между системами. Если вы используете этот пароль только локально, я бы согласился с тем, что SecureString, вероятно, не очень необходимо.

Хорошие привычки в безопасности, однако, никогда не являются пустым тратой времени.

Ответ 4

Единственный раз, когда я отмечаю отсутствие использования SecureString при проверке защищенных кодов, - это случаи, когда данные могут быть зашифрованы приложением и повторно использованы.

Например, когда бэкэнд веб-сайта должен взаимодействовать с третьим лицом или другим внутренним ресурсом, который требует учетных данных. Поскольку они не могут быть хэшированы, я должен использовать SecureString при необходимости создания запроса (который также должен быть над TLS).

Другим вариантом является использование Windows Data Protection API, если это возможно.

Обратите внимание, что целью SecureString является сохранение содержимого в памяти как можно короче.

Ответ 5

Если я не ошибаюсь, вы можете использовать следующее решение для сохранения ввода из строкового управления CLR: Веб-API: как получить доступ к значениям многострочной формы при использовании MultipartMemoryStreamProvider?

Только прочитайте FormData в методе ExecutePostProcessingAsync (..) как ReadAsByteArrayAsync(), и он никогда не должен становиться строкой на пути.

Вам по-прежнему нужен https, чтобы обеспечить безопасный вход.