Генерация случайных паролей в PowerShell

В мае 2009 года я подготовил HTML-приложение (HTA), RandPass.hta, для удобного формирования случайных паролей с помощью программного кода JScript (подробнее об этом рассказано в статье Random Passwords on Demand). В приложении имеется четыре флажка, указывающие, какие классы символов (верхнего и нижнего регистров, числа, символы) могут быть использованы в паролях.

 

Ключевые слова —«могут быть использованы»: в приложении нет принудительного правила для включения выбранных классов символов в случайный пароль. Выбранные флажки просто увеличивают список возможных символов. Например, если установлены флажки верхнего и нижнего регистров, то могут быть получены случайные пароли, содержащие только прописные или только строчные буквы. Такой подход логичен, но несколько противоречит интуитивному восприятию («я выбрал верхний регистр, но в пароле нет ни одной прописной буквы»). Несмотря на этот небольшой изъян, я регулярно применял RandPass.hta и получал много благодарных отзывов от пользователей программы. Тем не менее полезно было бы генерировать случайные строки не просто с использованием RandPass.hta, но из командной строки Windows PowerShell. Кроме того, я хотел усовершенствовать алгоритм RandPass.hta: вместо того, чтобы указывать классы символов, которые могут содержаться в строке пароля, лучше указать классы, которые войдут в строку. Для этого я подготовил сценарий Get-RandomString.psl.

Лучшее — враг хорошего

Синтаксис командной строки для RandomString.psl:

Get-RandomString.ps1 [[-Length] ] [-LowerCase] [-UpperCase] [-Numbers] [-Symbols] [[-Count] ]

Параметр-Length указывает длину; например,-Length 32 означает, что Get-RandomString. psl будет формировать строки длиной 32 символа. Если не указать этот параметр, значение по умолчанию равно 8. Можно пропустить имя параметра (-Length), если аргумент параметра следует непосредственно после имени сценария в командной строке.

Дорогие друзья, с развитием современных технологий могие вещи могут делаться вами без вас. Казалось бы парадокс, но даже зарабатывать деньги можно не прикладывая практически никаких усилий. Возможно вы уже слышали о Forex? Если нет, то узнать можно тут.

-LowerCase,-UpperCase,-Numbers и-Symbols —переключатели. Все они указывают классы символов, входящих в случайные строки. По умолчанию действует-LowerCase, поэтому, если нужно создать случайные строки, не содержащие символов в нижнем регистре, необходимо указать-LowerCase:$False Все эти классы символов основываются на символах ASCII и не зависят от языковых настроек. Параметр-Count указывает число формируемых случайных строк (1 по умолчанию). Например,

-Count 10 выдает 10 случайных строк.

Чтобы получить дополнительные сведения о параметрах сценария и образцы команд, введите команду

Get-Help Get-RandomString-Detailed или Get-Help Get-RandomString-Full

Принцип действия

Выполнение сценария начинается с объявления инструкции param, которая задает параметры сценария. При этом всем параметрам присваиваются значения по умолчанию. Затем сценарий определяет аргумент параметра-Length. Если он меньше 4, выдается сообщение об ошибке. Длина строки должна быть не менее 4 символов, поскольку таково количество допустимых классов символов. В последнюю очередь нужно убедиться, что в строку входит по крайней мере один из классов символов (то есть-LowerCase,-UpperCase,-Numbers или-Symbols). Если не указан ни один из классов символов, выдается сообщение об ошибке. Затем сценарий объявляет набор значений битовой маски, представляющей четыре класса символов. Дополнительные сведения о применении битовых карт и масок приведены во врезке «Битовые карты как массивы». Затем сценарий формирует четыре массива, содержащих значения символов для каждого из четырех классов символов на основе значений ASCII. Например, массив $charsLower содержит символы ASCII нижнего регистра (то есть каждый элемент массива представляет собой символ ASCII нижнего регистра); массив ScharsNumber содержит символы ASCII для цифр. Среди символов, выбранных для массива $charsSymbol, нет ни одного, который мог бы привести к нарушениям работы командной строки (например, одинарных и двойных кавычек, вертикальной черты и символов перенаправления).

После этого сценарий строит массив, сохраняемый в переменной $charList, содержащий все символы классов, указанных в командной строке. Например, если в командной строке присутствуют-LowerCase и-Numbers, то переменная $charList будет содержать символы из массивов $charsLower и ScharsNumber. Сценарий также определяет переменную $charSets, которая представляет собой значение битовой карты, где хранятся выбранные наборы символов. Затем определяется функция test-stringcontents, показанная в листинге 1. В ней используется два параметра: строка и массив символов. Функция возвращает $True, если строка содержит по крайней мере один символ из массива; в противном случае функция возвращает $False. Эта функция используется впоследствии в сценарии, чтобы определить, содержатся ли в случайной строке символы из указанного класса символов.

После того как определена функция test-stringcontents, сценарий входит в цикл, повторяющийся столько раз, сколько запрошено в параметре-Count. Затем инициируется цикл do, формирующий случайную строку и проверяющий, содержатся ли в строке все запрошенные классы символов. В этом цикле создается переменная $flags (второе значение битовой карты) для отслеживания классов символов. Затем с помощью команды Get-Random случайно выбранный символ из массива $charList присоединяется столько раз, сколько нужно в соответствии с параметром-Length, как показано в листинге 2.

После выполнения программного кода в листинге 2 случайная строка содержит символы, произвольно выбранные из массива $charList. Но это не значит, что строка наверняка содержит определенные символы из каждого выбранного класса символов. Чтобы убедиться, что в строке есть хотя бы один символ из каждого класса, используется функция test-stringcontents. Если строка содержит хотя бы один символ класса, то в битовой карте $flags устанавливается соответствующий бит для этого класса. Если битовая карта не совпадает с битовой картой $charSets, значит, в случайно сформированной строке нет символов всех запрошенных классов, и цикл do повторяется. В противном случае сценарий выдает строку.

Удобный способ генерации случайного пароля

В сценарии Get-RandomString.psl для создания случайных строк используется команда Get-Random и функция обработки массивов и строк. С помощью сценария можно создавать случайные пароли, PIN-коды и многие другие объекты.

Популярные шаблоны