.NET-строки не являются безопасными так как являются неизменными после их создания, и после окончания работы с ними вы не можете направить туда сборщик мусора. Это ограничение означает, что строка подвержена риску заражения при сканировании памяти и других атаках, в том числе при чтении текстовым редактором файла подкачки и дампа памяти. Поэтому при хранении паролей и конфиденциальной информации, вам приходится брать на себя ответственность за сохранность и безопасность этих данных, поскольку они хранятся в памяти ещё некоторое время и могут быть обнаружены. Эту проблему можно избежать при помощи объектов «SecureString», которые первоначально присутствуют в «.NET Framework 2.0».
«SecureString» — это текстовый объект, подобный обычной строке, но он хранится в памяти в зашифрованном виде, с помощью Data Protection API (DPAPI). Ключ, который используется для шифрования строки, генерируется случайным образом и хранится в той части памяти, которая никогда не записывается на диск. Кроме того, вы не можете напрямую задать значение «SecureString» в строку, потому что для этого потребуется пароль или другая конфиденциальная информация для существования в памяти. Вместо этого, вы должны устанавливать значения защищенной строки по одному символу за один раз, так как нет других надежных средств, чтобы установить значение.
С помощью метода «MakeReadOnly», можно сделать экземпляр неизменяемым, чтобы предотвратить его дальнейшую модификацию. Класс «SecureString» также имеет возможность освобождения по запросу. При вызове метода «SecureString.Dispose()» данные пароля, находящиеся в памяти, перезаписываются. Это гарантирует, что вся информация о пароле будет стерта из памяти и никто не сможет ею воспользоваться.
Хотя эта особенность делает «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:Windowssystem32notepad.exe)», а так же поля логин, пароль, домен. Нажмите кнопку «Запустить». У вас запустится программа Блокнот, а в «Диспетчере задач Windows», во вкладке «Процессы», вы увидите учетную запись, от которой был произведен запуск.
Ссылка для скачивания примера: Яндекс.Диск
0.00 (0%) 0 votes












