String to SecureString

      .NET-строки не являются безопасными так как являются неизменными после их создания, и после окончания работы с ними вы не можете направить туда сборщик мусора. Это ограничение означает, что строка подвержена риску заражения при сканировании памяти и других атаках, в том числе при чтении текстовым редактором файла подкачки и дампа памяти. Поэтому при хранении паролей и конфиденциальной информации, вам приходится брать на себя ответственность за сохранность и безопасность этих данных, поскольку они хранятся в памяти ещё некоторое время и могут быть обнаружены. Эту проблему можно избежать при помощи объектов «SecureString», которые первоначально присутствуют в «.NET Framework 2.0».
      «SecureString» - это текстовый объект, подобный обычной строке, но он хранится в памяти в зашифрованном виде, с помощью Data Protection API (DPAPI). Ключ, который используется для шифрования строки, генерируется случайным образом и хранится в той части памяти, которая никогда не записывается на диск. Кроме того, вы не можете напрямую задать значение «SecureString» в строку, потому что для этого потребуется пароль или другая конфиденциальная информация для существования в памяти. Вместо этого, вы должны устанавливать значения защищенной строки по одному символу за один раз, так как нет других надежных средств, чтобы установить значение.
      С помощью метода «MakeReadOnly», можно сделать экземпляр неизменяемым, чтобы предотвратить его дальнейшую модификацию. Класс «SecureString» также имеет возможность освобождения по запросу. При вызове метода «SecureString.Dispose()» данные пароля, находящиеся в памяти, перезаписываются. Это гарантирует, что вся информация о пароле будет стерта из памяти и никто не сможет ею воспользоваться.
      Хотя эта особенность делает «SecureString» неудобной для использования, она же делает ваши строки более безопасными.

      Обратите внимание, что у класса «SecureString» нет членов, которые отвечают за проверку, сравнение или преобразование значения «SecureString». Отсутствие таких членов защищает значение экземпляра от его случайного или злонамеренного раскрытия.
      В следующем примере показано два варианта использования строки «SecureString» для защиты пользовательского пароля, который в этом случае можно использовать в качестве учетных данных для запуска нового процесса.
Вариант 1:
      Данный код выполняет посимвольное преобразование строки переданной в метод «ReadPassword» и возвращает об объект типа «SecureString».

public static SecureString ReadPassword(string password)
{
    SecureString secPass = new SecureString();
    for (int i = 0; i < password.Length; i++)
        secPass.AppendChar(password[i]);
    return secPass;
}
Вариант 2: 
      Данный код выполняет посимвольное преобразование строки переданной в метод «ReadPassword» и возвращает об объект типа «SecureString», а так же с помощью метода «MakeReadOnly» делает объект «read-only» и запрещает его дальнейшее редактирование.
SecureString secureStr = new SecureString(); 
for (int i = 0; i < someString.Length; i++) 
    secureStr.AppendChar(someString[i]); 
secureStr.MakeReadOnly();
Для консольного приложения код преобразования «String» в «SecureString» представлен ниже:
SecureString password = new SecureString();
foreach (char c in Console.ReadLine())
    password.AppendChar(c);
      Создайте проект «Windows Form» в «Microsoft Visual Studio» и добавьте на главную форму вашего проекта следующие элементы управления:
  • System.Windows.Forms.Button button1 - кнопка запуска файла указанного в элементе управления textBox4;
  • System.Windows.Forms.TextBox textBox1 – текстовый элемент управления для ввода логина;
  • System.Windows.Forms.TextBox textBox2 – текстовый элемент управления для ввода пароля;
  • System.Windows.Forms.TextBox textBox3 – текстовый элемент управления для ввода домена в котором будет производиться авторизация;
  • System.Windows.Forms.TextBox textBox4 - текстовый элемент управления для ввода пути и имени файла для запуска;
У вас получится приведенный ниже пример.
      С помощью свойства «PasswordChar» установим скрывающий символ в элементе управления «textBox2», в виде символов-кружочков, скрывающих настоящие символы. Для этого сделайте двойной клик левой клавишей мыши по любому свободному месту главной формы, вы перейдете в редактор кода с установкой курсора в автоматически созданном методе «Form1_Load», события «Load», выполняющегося при загрузке формы. Вставьте в тело данного метода приведенную ниже строку кода.
textBox2.PasswordChar = '\u25CF';
      Если вы запустите проект и начнете вводить данные в поле предназначенное для ввода пароля, то вы увидите символы-кружочки, как показано на скриншоте ниже.
      Перейдите в конструктор главной формы и сделайте двойной клик левой клавишей мыши по элементу управления «button1». Вы перейдете в редактор кода с автоматической установкой курсора в созданном методе «button1_Click», события «Click», возникающего при нажатии на кнопку. Добавьте в тело данного метода приведенный ниже листинг, запускает указанного файла путем указания полного пути и имени файла, имени пользователя, пароля и домена.
try
{
    //Инициализируем новый экземпляр класса
    //System.Diagnostics.ProcessStartInfo, не указывая имени
    //файла, вместе с которым должен запускаться процесс.
    System.Diagnostics.ProcessStartInfo startInfo =
        new System.Diagnostics.ProcessStartInfo();
    //Задаем Нормальный, видимый стиль окна. Система отображает
    //окно на экране со стилем Normal в положении по умолчанию. 
    startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
    //Задаем имя пользователя, который следует использовать при
    //запуске процесса.
    startInfo.UserName = textBox1.Text;
    //Задаем параметр безопасности, в котором содержится пароль
    //пользователя, используемый при запуске процесса.
    startInfo.Password = ReadPassword(textBox2.Text);
    //Задаем значение домена используемого при запуске
    //процесса.
    //Свойство актуально преимущественно для пользователей
    //работающих в корпоративной среде и использующих службу Active Directory. 
    startInfo.Domain = textBox3.Text;
    //Задаем значение, позволяющее определить, нужно ли использовать
    //оболочку операционной системы для запуска процесса.
    startInfo.UseShellExecute = false;
    //Выполняем инициализацию нового экземпляра класса System.IO.FileInfo,
    //с указанием имени и полного пути к запускаемому файлу.
    System.IO.FileInfo fi = new System.IO.FileInfo(textBox4.Text);
    //Задаем начальный каталог для запускаемого процесса.
    startInfo.WorkingDirectory = fi.DirectoryName;
    //Задаем имя приложения или документ для запуска.
    startInfo.FileName = fi.Name;
    //Запускаем процесс, определенный объектом 
    //System.Diagnostics.ProcessStartInfo,
    //содержащим стартовую информацию процесса
    System.Diagnostics.Process.Start(startInfo);
}
catch (Exception ex)
{ }
      Так же добавьте в листинг главной формы проекта, приведенный ниже метод преобразования текстового значения введенного в элемент управления «textBox2.Text», в объект «SecureString».
public static System.Security.SecureString ReadPassword(string password)
{
    System.Security.SecureString secPass =
        new System.Security.SecureString();
    for (int i = 0; i < password.Length; i++)
        secPass.AppendChar(password[i]);
    return secPass;
}
      Запустите проект, нажав на клавишу «F5». После успешной компиляции и запуска вашего проекта у вас откроется главная форма. Заполните информацию о запускаемом файле, например «Блокнот (C:\Windows\system32\notepad.exe)», а так же поля логин, пароль, домен. Нажмите кнопку «Запустить». У вас запустится программа Блокнот, а в «Диспетчере задач Windows», во вкладке «Процессы», вы увидите учетную запись, от которой был произведен запуск.

Ссылка для скачивания примера: Яндекс.Диск


Комментариев нет:

Отправить комментарий

Большая просьба, не писать в комментариях всякую ерунду не по теме!