.NET-строки не являются безопасными так как являются неизменными после их создания, и после окончания работы с ними вы не можете направить туда сборщик мусора. Это ограничение означает, что строка подвержена риску заражения при сканировании памяти и других атаках, в том числе при чтении текстовым редактором файла подкачки и дампа памяти. Поэтому при хранении паролей и конфиденциальной информации, вам приходится брать на себя ответственность за сохранность и безопасность этих данных, поскольку они хранятся в памяти ещё некоторое время и могут быть обнаружены. Эту проблему можно избежать при помощи объектов «SecureString», которые первоначально присутствуют в «.NET Framework 2.0».
«SecureString» - это текстовый объект, подобный обычной строке, но он хранится в памяти в зашифрованном виде, с помощью Data Protection API (DPAPI). Ключ, который используется для шифрования строки, генерируется случайным образом и хранится в той части памяти, которая никогда не записывается на диск. Кроме того, вы не можете напрямую задать значение «SecureString» в строку, потому что для этого потребуется пароль или другая конфиденциальная информация для существования в памяти. Вместо этого, вы должны устанавливать значения защищенной строки по одному символу за один раз, так как нет других надежных средств, чтобы установить значение.
С помощью метода «MakeReadOnly», можно сделать экземпляр неизменяемым, чтобы предотвратить его дальнейшую модификацию. Класс «SecureString» также имеет возможность освобождения по запросу. При вызове метода «SecureString.Dispose()» данные пароля, находящиеся в памяти, перезаписываются. Это гарантирует, что вся информация о пароле будет стерта из памяти и никто не сможет ею воспользоваться.
Хотя эта особенность делает «SecureString» неудобной для использования, она же делает ваши строки более безопасными.
Вариант 1:
Данный код выполняет посимвольное преобразование строки переданной в метод «ReadPassword» и возвращает об объект типа «SecureString».
Данный код выполняет посимвольное преобразование строки переданной в метод «ReadPassword» и возвращает об объект типа «SecureString», а так же с помощью метода «MakeReadOnly» делает объект «read-only» и запрещает его дальнейшее редактирование.
С помощью свойства «PasswordChar» установим скрывающий символ в элементе управления «textBox2», в виде символов-кружочков, скрывающих настоящие символы. Для этого сделайте двойной клик левой клавишей мыши по любому свободному месту главной формы, вы перейдете в редактор кода с установкой курсора в автоматически созданном методе «Form1_Load», события «Load», выполняющегося при загрузке формы. Вставьте в тело данного метода приведенную ниже строку кода.
Перейдите в конструктор главной формы и сделайте двойной клик левой клавишей мыши по элементу управления «button1». Вы перейдете в редактор кода с автоматической установкой курсора в созданном методе «button1_Click», события «Click», возникающего при нажатии на кнопку. Добавьте в тело данного метода приведенный ниже листинг, запускает указанного файла путем указания полного пути и имени файла, имени пользователя, пароля и домена.
«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», во вкладке «Процессы», вы увидите учетную запись, от которой был произведен запуск.
Ссылка для скачивания примера: Яндекс.Диск
Комментариев нет:
Отправить комментарий
Большая просьба, не писать в комментариях всякую ерунду не по теме!