Справочник по C#

    Исходники по языку программирования CSharp

    String to SecureString: Справочник по C#

    /
    /
    /
    45 Views


          .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:Windowssystem32notepad.exe)», а так же поля логин, пароль, домен. Нажмите кнопку «Запустить». У вас запустится программа Блокнот, а в «Диспетчере задач Windows», во вкладке «Процессы», вы увидите учетную запись, от которой был произведен запуск.

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

    String to SecureString: Справочник по C#

    0.00 (0%) 0 votes

    moyadcode13
    • Facebook
    • Twitter
    • Google+
    • Linkedin
    • Pinterest
    moyadcode10
    moyadcode11
    moyadcode9