• Курсы Академии Кодебай, стартующие в мае - июне, от команды The Codeby

    1. Цифровая криминалистика и реагирование на инциденты
    2. ОС Linux (DFIR) Старт: 16 мая
    3. Анализ фишинговых атак Старт: 16 мая Устройства для тестирования на проникновение Старт: 16 мая

    Скидки до 10%

    Полный список ближайших курсов ...

Статья Пишем простой генератор сложных паролей

Тема не новая, генераторов существует множество, однако такой простой код и глазу приятен, и место не занимает.

Для начала вставим в шапку кодировку и версию питона. Импортируем модуль random для генерации случайной последовательности. Зададим переменную chars и вобьём буквы в разном регистре, цифры и какие-нибудь спецсимволы для получения максимально взломостойкого пароля.
Python:
# -*- coding:utf -8 -*-
#!/usr/bin/python3

import random

chars = '+-/*!&$#?=@<>abcdefghijklnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
Чтобы программа тупо не генерила один пароль или строго заданное количество, разрешим пользователю самому решать сколько паролей он хочет сгенерировать. Кроме этого дадим возможность определять и длину пароля.
Python:
number = input('количество паролей?'+ "\n")
length = input('длина пароля?'+ "\n")
number = int(number)
length = int(length)
Осталось добавить самое главное - цикл случайной генерации символов, букв и цифр из нашей переменной, согласно параметрам введённым пользователем.
Python:
for n in range(number):
    password =''
    for i in range(length):
        password += random.choice(chars)
    print(password)
Вот собственно и всё - простой генератор сложных паролей готов.
Код полностью:

Python:
# -*- coding:utf -8 -*-
#!/usr/bin/python3

import random

chars = '+-/*!&$#?=@<>abcdefghijklnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
number = input('количество паролей?'+ "\n")
length = input('длина пароля?'+ "\n")
number = int(number)
length = int(length)
for n in range(number):
    password =''
    for i in range(length):
        password += random.choice(chars)
    print(password)
Результат работы:
pas.png


Не нужно искать сложных путей, если есть простые решения :)
 

explorer

Platinum
05.08.2018
1 081
2 474
BIT
14
Хотел спросить.
Почему используется , а не ?
И то и то работает. Любую программу можно написать разными способами. random стандартно применяется для генерации последовательностей. В общем дело привычки.
Специально сейчас потестил на скорость выполнения кода - в обоих случаях оно примерно одинаковое.
 

Tihon49

Green Team
06.01.2018
193
120
BIT
0
Тема не новая, генераторов существует множество, однако такой простой код и глазу приятен, и место не занимает.

Для начала вставим в шапку кодировку и версию питона. Импортируем модуль random для генерации случайной последовательности. Зададим переменную chars и вобьём буквы в разном регистре, цифры и какие-нибудь спецсимволы для получения максимально взломостойкого пароля.
Python:
# -*- coding:utf -8 -*-
#!/usr/bin/python3

import random

chars = '+-/*!&$#?=@<>abcdefghijklnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
Чтобы программа тупо не генерила один пароль или строго заданное количество, разрешим пользователю самому решать сколько паролей он хочет сгенерировать. Кроме этого дадим возможность определять и длину пароля.
Python:
number = input('количество паролей?'+ "\n")
length = input('длина пароля?'+ "\n")
number = int(number)
length = int(length)
Осталось добавить самое главное - цикл случайной генерации символов, букв и цифр из нашей переменной, согласно параметрам введённым пользователем.
Python:
for n in range(number):
    password =''
    for i in range(length):
        password += random.choice(chars)
    print(password)
Вот собственно и всё - простой генератор сложных паролей готов.
Код полностью:

Python:
# -*- coding:utf -8 -*-
#!/usr/bin/python3

import random

chars = '+-/*!&$#?=@<>abcdefghijklnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
number = input('количество паролей?'+ "\n")
length = input('длина пароля?'+ "\n")
number = int(number)
length = int(length)
for n in range(number):
    password =''
    for i in range(length):
        password += random.choice(chars)
    print(password)
Результат работы:
Посмотреть вложение 21790

Не нужно искать сложных путей, если есть простые решения :)
У меня это работает так:

количество паролей?
2
длина пароля?
5
*
*D
*DG
*DGv
*DGvf
w
we
we1
we1N
we1NZ
[Program finished]

Как убрать те, что короче пяти символов?
 

explorer

Platinum
05.08.2018
1 081
2 474
BIT
14
Как убрать те, что короче пяти символов?

Всё работает корректно, похоже вы напутали с отступами. В Python отступы имеют огромное значение, и должны быть кратны 4 пробелам, 2 отступа 8 пробелов.

2.png
 

konstan

One Level
13.02.2019
9
1
BIT
0
Мне понравился генератор, для меня, человека который только начал изучать питон, довольно понятный код.
 

111

One Level
05.09.2016
8
5
BIT
0
Ты просто красавчик.....), сам сижу изучаю..... Спасибо
 
A

Akorid

Тема не новая, генераторов существует множество, однако такой простой код и глазу приятен, и место не занимает.

Для начала вставим в шапку кодировку и версию питона. Импортируем модуль random для генерации случайной последовательности. Зададим переменную chars и вобьём буквы в разном регистре, цифры и какие-нибудь спецсимволы для получения максимально взломостойкого пароля.
Python:
# -*- coding:utf -8 -*-
#!/usr/bin/python3

import random

chars = '+-/*!&$#?=@<>abcdefghijklnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
Чтобы программа тупо не генерила один пароль или строго заданное количество, разрешим пользователю самому решать сколько паролей он хочет сгенерировать. Кроме этого дадим возможность определять и длину пароля.
Python:
number = input('количество паролей?'+ "\n")
length = input('длина пароля?'+ "\n")
number = int(number)
length = int(length)
Осталось добавить самое главное - цикл случайной генерации символов, букв и цифр из нашей переменной, согласно параметрам введённым пользователем.
Python:
for n in range(number):
    password =''
    for i in range(length):
        password += random.choice(chars)
    print(password)
Вот собственно и всё - простой генератор сложных паролей готов.
Код полностью:

Python:
# -*- coding:utf -8 -*-
#!/usr/bin/python3

import random

chars = '+-/*!&$#?=@<>abcdefghijklnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'
number = input('количество паролей?'+ "\n")
length = input('длина пароля?'+ "\n")
number = int(number)
length = int(length)
for n in range(number):
    password =''
    for i in range(length):
        password += random.choice(chars)
    print(password)
Результат работы:

Не нужно искать сложных путей, если есть простые решения
в прочем написано хорошо но такая фигня паролей может быть миллиард и они от 6 до 15 цифр и при этом не удобно каждый раз вводить заново кол во паролей вот бы сделать так что бы можно было вводить промежуток
 

explorer

Platinum
05.08.2018
1 081
2 474
BIT
14
в прочем написано хорошо но такая фигня паролей может быть миллиард и они от 6 до 15 цифр и при этом не удобно каждый раз вводить заново кол во паролей вот бы сделать так что бы можно было вводить промежуток
Не вижу практической пользы от миллиарда паролей. Хотя...это может быть полезно для составления словарей под брут. Там не сложно доделать - нужно написать 2 инпута для ввода диапазона, и прогнать всё через цикл.
 

id2746

Green Team
12.11.2016
435
644
BIT
15
а как на примере генератора:

Python:
import random

chars = '123qwe'

number = int (input('количество паролей?'+ "\n"))
length = 5

for n in range(number):
    password =''
    for i in range(length):
        password += random.choice(chars)
    print(password)

получить все возможные комбинации без повторов?
 

explorer

Platinum
05.08.2018
1 081
2 474
BIT
14
а как на примере генератора:

Python:
import random

chars = '123qwe'

number = int (input('количество паролей?'+ "\n"))
length = 5

for n in range(number):
    password =''
    for i in range(length):
        password += random.choice(chars)
    print(password)

получить все возможные комбинации без повторов?

Вот накидал самый правильный вариант:

Python:
import itertools
 
for i in itertools.product('123qwe', repeat=5):
    print(''.join(i))

Все комбинации без повторов выведутся только тогда, когда не задаётся жёстко количество. В данном коде repeat отвечает за количество символов в выводе.
 
  • Нравится
Реакции: id2746

explorer

Platinum
05.08.2018
1 081
2 474
BIT
14
id2746 Ещё добавил счётчик, теперь наглядно видно сколько комбинаций получается )

Python:
import itertools

a = 0
for i in itertools.product('123qwe', repeat=5):
    a += 1
    print(''.join(i))
print('Количество комбинаций:' + str(a))
1.png
 
  • Нравится
Реакции: Gawana и id2746

id2746

Green Team
12.11.2016
435
644
BIT
15
@explorer , я по первому пирмеру (через itertools) написал себе под "местные" цели для создания словаря для брута, но если в пароле много символов, у меня бук греется будто на нем майнят ))
А под небольшую длину - очень хорошо )
Кстати, если уж развивать тему, то было бы неплохо генерить пароли не последовательно по символам, а рандомно )
 

explorer

Platinum
05.08.2018
1 081
2 474
BIT
14
Кстати, если уж развивать тему, то было бы неплохо генерить пароли не последовательно по символам, а рандомно )
Неплохо бы уже самому немного потренироваться кодингу ) Ну если нужен рандомный вариант, значит нужно использовать модуль random, логично?
Держи рандомный вариант:

Python:
import itertools
import random

mix = list('123qwe')
random.shuffle(mix)
a = 0
for i in itertools.product(mix, repeat=5):
    a += 1
    print(''.join(i))
print('Количество комбинаций:' + str(a))

При каждом запуске всегда будет разная последовательность из паролей.
 
  • Нравится
Реакции: Gawana и id2746

f22

Codeby Academy
Gold Team
05.05.2019
1 835
225
BIT
974
Можно сделать ещё изящнее )

Python:
import random
import string

strings = string.ascii_letters + string.digits + string.punctuation
chars = list( ch for ch in strings )

number = int(input('количество паролей?'+ "\n"))
length = int(input('длина пароля?'+ "\n"))

for n in range(number):
    random.shuffle(chars)
    print("".join(chars)[0:length])

Главное отличие - использование среза вместо вложенного цикла, думаю, это немного нагляднее.

То есть в главном цикле n раз перемешиваем массив символов,
объединяем все элементы в строку
и берём первые символы по количеству длины пароля.

А в модуле string очень удобные наборы символов
chrome_2019-10-31_09-06-08.png
 
  • Нравится
Реакции: Gawana, id2746 и explorer

id2746

Green Team
12.11.2016
435
644
BIT
15
Ну если нужен рандомный вариант, значит нужно использовать модуль random, логично?

При каждом запуске всегда будет разная последовательность из паролей.
я немного не то имел ввиду... Перемешать нужно уже сгенерированый список.
методом проб и ошибок наговнокодил вот такую дзичь:
Python:
import itertools
import random

simbols = input("Введи предпогалаемые символы:\n")
dlina = int(input("Кол-во символов:\n"))

words = itertools.product(simbols, repeat = dlina)
brut_file = [] #создаем пустой словарь(список)
for i in words: # цикл генерации
    words = (''.join(i))
    brut_file.append(words) #и записи полученных слов в brut_file

print(brut_file)
random.shuffle(brut_file) # перемешиваем ранее полученный brut_file
print ('\nПосле перемешивания получаем\n', brut_file)


#запись в файл
brut_file = str(brut_file)
file = open ("E:\python\password.txt", 'a') #открываем куда писать полученные данные
file.write(brut_file) # записываем файл
file.close() # закрываем файл

теперь я не знаю как ['13', '22', '32', '21', '23', '33', '11', '12', '31']
привести к виду:
13
22
32
21
и т.д. ))))))
Мозг лопается, но я учусь )
 
Последнее редактирование:

mrOkey

Grey Team
14.11.2017
967
976
BIT
0
я немного не то имел ввиду... Перемешать нужно уже сгенерированый список.
методом проб и ошибок наговнокодил вот такую дзичь:
Python:
import itertools
import random

simbols = input("Введи предпогалаемые символы:\n")
dlina = int(input("Кол-во символов:\n"))

words = itertools.product(simbols, repeat = dlina)
brut_file = [] #создаем пустой словарь(список)
for i in words: # цикл генерации
    words = (''.join(i))
    brut_file.append(words) #и записи полученных слов в brut_file

print(brut_file)
random.shuffle(brut_file) # перемешиваем ранее полученный brut_file
print ('\nПосле перемешивания получаем\n', brut_file)


#запись в файл
brut_file = str(brut_file)
file = open ("E:\python\password.txt", 'a') #открываем куда писать полученные данные
file.write(brut_file) # записываем файл
file.close() # закрываем файл

теперь я не знаю как ['13', '22', '32', '21', '23', '33', '11', '12', '31']
привести к виду:
13
22
32
21
и т.д. ))))))
Мозг лопается, но я учусь )
во время генерации последним символом ‘\n’ к слову добавь
 
  • Нравится
Реакции: id2746

f22

Codeby Academy
Gold Team
05.05.2019
1 835
225
BIT
974
я немного не то имел ввиду... Перемешать нужно уже сгенерированый список.
методом проб и ошибок наговнокодил вот такую дзичь:
Python:
import itertools
import random

simbols = input("Введи предпогалаемые символы:\n")
dlina = int(input("Кол-во символов:\n"))

words = itertools.product(simbols, repeat = dlina)
brut_file = [] #создаем пустой словарь(список)
for i in words: # цикл генерации
    words = (''.join(i))
    brut_file.append(words) #и записи полученных слов в brut_file

print(brut_file)
random.shuffle(brut_file) # перемешиваем ранее полученный brut_file
print ('\nПосле перемешивания получаем\n', brut_file)


#запись в файл
brut_file = str(brut_file)
file = open ("E:\python\password.txt", 'a') #открываем куда писать полученные данные
file.write(brut_file) # записываем файл
file.close() # закрываем файл

теперь я не знаю как ['13', '22', '32', '21', '23', '33', '11', '12', '31']
привести к виду:
13
22
32
21
и т.д. ))))))
Мозг лопается, но я учусь )

Это простой вариант:
Замени строку
brut_file = str(brut_file)
на
brut_file = "\n".join(brut_file)

Метод join объединит все элементы списка, а разделителем сделает символ переноса строки.

Есть другой вариант, более экономный и, наверное, более правильный:
Замени весь блок записи на эти 2 строчки
Python:
#запись в файл
with open("E:\python\password.txt", 'a') as writer:
    writer.write("\n".join(brut_file))

Конструкция with при записи или чтении данных сама закроет поток после окончания операции.

=================================================
И несколько замечаний по поводу кода:
Придерживайся одного стиля написания имён переменных:
если уж все пишешь на английском, заморочься, открой Google переводчик,
который подскажет тебе, что длина по английски - length

Нужные тебе переменные, если это возможно, создавай в самом начале кода,
чтобы потом не искать их далее.

Ну и последнее: выделяй блоки кода в отдельные функции.
Есть у тебя в коде запись данных в файл, так создай для этого случая
отдельную функцию, которая будет принимать, к примеру, список и сама его записывать.

Python:
def write_data_to_disk(target_data: list):
    """Функция записывает массив target_data в файл"""
    file = open ("E:\python\password.txt", 'a') #открываем куда писать полученные данные
    file.write("\n".join(target_data)) # записываем файл
    file.close() # закрываем файл

write_data_to_disk(brut_file)
 
Последнее редактирование:
  • Нравится
Реакции: Gawana и id2746

id2746

Green Team
12.11.2016
435
644
BIT
15
@f22 , спасибо за помощь и наставления! Я пока в самом начале пути, поэтому со временем буду совершенствовать код новыми функциями и стилем

Ламерский вопрос:
Зачем писать код (сохранения в файл) в отдельную функцию, если ее нужно вызвать только один раз?
 
Последнее редактирование:

f22

Codeby Academy
Gold Team
05.05.2019
1 835
225
BIT
974
@f22 , спасибо за помощь и наставления! Я пока в самом начале пути, поэтому со временем буду совершенствовать код новыми функциями и стилем

Ламерский вопрос:
Зачем писать код (сохранения в файл) в отдельную функцию, если ее нужно вызвать только один раз?
Во-первых:
Обрати внимание, сколько раз ты уже переписал эту программу,
сколько добавил новых строк и сколько раз что-то удалил.

И просто представь, что у тебя в программе не 20 строк, а 120 и
тебе каждый раз нужно отслеживать отступы, смотреть, как бы не
влезть в область видимости этого сегмента.

Всё это я к тому, что вероятность ошибиться в 4 строках когда
и в 10 принципиально разная, поэтому лучше написать функцию
где-то сверху и забыть о ней, до её вызова.

Во-вторых:
Ты можешь написать эту функцию один единственный раз,
а потом банально импортировать её во всех файлах, в которых
тебе нужно записывать массив, очень часто это помогает многократно
использовать один и тот же код.

И, наконец, в третьих:
Причина банальная - простота работы с кодом.
Представь, что ты видишь какую-то объёмную конструкцию вида
Python:
    file = open ("E:\python\password.txt", 'a') #открываем куда писать полученные данные
    file.write("\n".join(target_data)) # записываем файл
    file.close() # закрываем файл
На каждой строчке комментарий, там нужно разобраться с переменными,
здесь нужно вникнуть в этот код, подумать, как он используется,
прикинуть, как его разместить, ниже или выше.

А вот здесь ты видишь вызов функции в названии которой четко написано,
что конкретно она делает
write_data_to_disk(brut_file)

Согласись, что второй пример, не заставит тебя долго размышлять над тем,
что происходит на этой строке.

А уж если ты приучишь себя после написания имени функции и её параметров
писать строку описание - это первая строка в коде функции, которая
заключена в тройные кавычки, то при вызове этой функции в коде,
сама IDE тебе подскажет, что конкретно делает этот код.
Выглядит это примерно так
Code_0tROJJFgaG.png
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!