Из этой статьи вы узнаете, как создать генератор паролей на Python и генерировать надежные пароли с помощью модулей secrets и random.
Еще по теме: Шифрование с помощью Cryptography Python
Создание генератора паролей на Python
Не нужно устанавливать ничего дополнительно, так как все библиотеки, которые нам понадобятся, уже встроены в Python.
Мы используем модуль argparse для анализа аргументов командной строки, модуль string для получения типов символов, таких как заглавные буквы, строчные буквы, цифры и специальные символы, а также модули random и secrets для генерации случайных данных.
Давайте начнем:
1 |
import argparse, secrets, random, string |
Парсинг аргументов
Давайте начнем с инициализации аргументного парсера:
1 2 3 4 5 |
# Настройка аргументного парсера parser = argparse.ArgumentParser( prog='Генератор Паролей.', description='Создайте любое количество паролей с помощью этого инструмента.' ) |
Затем добавляем аргументы в парсер. Первые четыре аргумента определяют количество символов каждого типа: цифры, строчные буквы, заглавные буквы и специальные символы. Также устанавливаем тип этих аргументов как целое число:
1 2 3 4 5 |
# Добавление аргументов в парсер parser.add_argument("-n", "--numbers", default=0, help="Количество цифр в пароле", type=int) parser.add_argument("-l", "--lowercase", default=0, help="Количество строчных букв в пароле", type=int) parser.add_argument("-u", "--uppercase", default=0, help="Количество заглавных букв в пароле", type=int) parser.add_argument("-s", "--special-chars", default=0, help="Количество специальных символов в пароле", type=int) |
Если пользователь хочет передать общее количество символов в пароле, и не хочет указывать точное количество каждого типа символов, тогда аргумент -t или --total-length обрабатывает это:
1 2 |
# добавляем аргумент общей длины пароля parser.add_argument("-t", "--total-length", type=int, help="Общая длина пароля. Если передано, будут проигнорированы -n, -l, -u и -s, и будут созданы полностью случайные пароли с указанной длиной") |
Следующие два аргумента — это файл вывода, в котором мы будем сохранять пароли, и количество паролей для генерации. Количество будет целым числом, а файл вывода — строкой (по умолчанию):
1 2 3 |
# Количество - это число, поэтому мы проверяем, что оно имеет тип int. parser.add_argument("-a", "--amount", default=1, type=int) parser.add_argument("-o", "--output-file") |
Последнее, но не менее важное — анализируем командную строку на наличие этих аргументов с помощью метода parse_args() класса ArgumentParser. Если мы не вызовем этот метод, парсер не будет ничего проверять и не будет вызывать исключения:
1 2 |
# Анализ аргументов командной строки. args = parser.parse_args() |
Генерация пароля
Далее переходим к основной части — цикл создания паролей. Здесь генерируем количество паролей, указанное пользователем.
Сначала нужно определить список паролей, который будет содержать все сгенерированные пароли:
1 2 3 4 |
# список паролей passwords = [] # Цикл по количеству паролей. for _ in range(args.amount): |
В цикле for проверяем, передан ли аргумент total_length. Если да, то непосредственно создаем случайный пароль с указанной длиной:
1 2 3 |
if args.total_length: # создаем случайный пароль с длиной total_length на основе всех доступных символов passwords.append("".join([secrets.choice(string.digits + string.ascii_letters + string.punctuation) for _ in range(args.total_length)])) |
Используем модуль secrets вместо random для генерации криптографически надежных случайных паролей.
В противном случае создаем список пароля, который будет сначала содержать все возможные буквы, а затем строку пароля:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
else: password = [] # добавляем необходимое количество цифр в пароль for _ in range(args.numbers): password.append(secrets.choice(string.digits)) # добавляем необходимое количество заглавных букв в пароль for _ in range(args.uppercase): password.append(secrets.choice(string.ascii_uppercase)) # добавляем необходимое количество строчных бук в в пароль for _ in range(args.lowercase): password.append(secrets.choice(string.ascii_lowercase)) # добавляем необходимое количество специальных символов в пароль for _ in range(args.special_chars): password.append(secrets.choice(string.punctuation)) |
Затем используем функцию random.shuffle() для перемешивания списка:
1 2 |
# Перемешиваем список со всеми возможными буквами, цифрами и символами. random.shuffle(password) |
После этого объединяем получившиеся символы с пустой строкой «», чтобы получить строковую версию пароля:
1 2 |
# Получаем символы строки до аргумента длины, а затем объединяем их. password = ''.join(password) |
И, наконец, добавляем этот пароль в список passwords:
1 2 |
# добавляем этот пароль в общий список паролей passwords.append(password) |
Сохранение паролей
После завершения цикла создания паролей проверяем, указан ли файл для сохранения. Если это так, просто открываем файл (который будет создан, если он не существует) и сохрняем список паролей:
1 2 3 4 |
# Сохраняем пароли в файл .txt. if args.output_file: with open(args.output_file, 'w') as f: f.write('\n'.join(passwords)) |
Во всех случаях выводим пароли:
1 |
print('\n'.join(passwords)) |
Запуск генератора паролей Python
Теперь давайте воспользуемся скриптом для создания разных комбинаций паролей. Сначала давайте выведем справку:
1 |
$ python password_generator.py --help |
Создайте любое количество паролей с помощью этого инструмента.
1 2 3 4 5 6 7 |
-n NUMBERS - количество цифр в пароле -l LOWERCASE - количество строчных букв в пароле -u UPPERCASE - количество заглавных букв в пароле -s SPECIAL_CHARS - количество специальных символов в пароле -t TOTAL_LENGTH - общая длина пароля. Если передано, будут проигнорированы -n, -l, -u и -s, и будут созданы полностью случайные пароли с указанной длиной -a AMOUNT, --amount AMOUNT -o OUTPUT_FILE, --output-file OUTPUT_FILE |
Можем начать с параметра --total-length или -t:
1 2 |
$ python password_generator.py --total-length 12 uQPxL’bkBV># |
Это создаст пароль длиной 12 символов, содержащий все возможные символы.
Хорошо, давайте сгенерируем 4 разных паролей такого вида:
1 2 3 4 5 |
$ python password_generator.py --total-length 12 --amount 4 &8I-%5r>2&W& =/se-I?M&,Q! YZF:Ltv*?m#. VTJO%dKrb9w6 |
Давайте создадим пароль, включающий пять строчных букв, две заглавные, три цифры и один специальный символ, всего 11 символов:
1 2 |
$ python password_generator.py -l 5 -u 2 -n 3 -s 1 iAn3GqxoiS3 |
Сгенерируем пять разных паролей на основе этого правила:
1 2 3 4 5 6 |
$ python password_generator.py -l 5 -u 2 -n 3 -s 1 -a 5 Xs7iM%x2ia2 ap6xTC0n3.c |Rx2dDf78xx c11=jozGsO5 UxiAfG914gi |
Мы также можем создать случайные пин-коды из 6 цифр:
1 2 3 4 5 6 |
$ python password_generator.py -n 6 -a 5 743582 810063 627433 801039 118201 |
Добавим к этому четыре заглавные буквы и сохраним их в файл keys.txt:
1 2 3 4 5 6 |
$ python password_generator.py -n 6 -u 4 -a 5 --output-file keys.txt 75A7K66G2H H33DPK1658 7443ROVD92 8U2HS2R922 T0Q2ET2842 |
В текущем рабочем каталоге появится новый файл keys.txt, содержащий эти пароли.
Вы можете генерировать столько паролей, сколько вам понадобится, например, 5000:
1 |
$ python password_generator.py -n 6 -u 4 -a 5000 --output-file keys.txt |
Заключение
Вы создали генератор паролей на Python. Если у вас есть большие списки паролей, то, возможно, вы не захотите видеть вывод результатов в консоли. В таком случае, вы можете удалить последнюю строку кода, которая отображает сгенерированные пароли в консоли.
ПОЛЕЗНЫЕ ССЫЛКИ:
- Брут FTP с помощью ftplib на Python
- Поиск открытых FTP с помощью ftplib на Python
- Создание скрипта Python Nmap для сканирования портов
Для чайников. В итоговом варианте как это будет выглядеть от и до?