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

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

Для начала вставим в шапку кодировку и версию питона. Импортируем модуль 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


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

Азиз

Green Team
30.05.2018
224
74
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

Не нужно искать сложных путей, если есть простые решения :)
С меня плюсик. И еще, во избежания лишних строк кода - советую:
Python:
number = input('количество паролей?'+ "\n")

length = input('длина пароля?'+ "\n")

number = int(number)

length = int(length)

Заменить на:

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

length = int(input('длина пароля?'+ "\n"))

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

NeskO

Green Team
10.01.2018
115
52
BIT
4
Можно еще написать пребор по таким паролям...те сначала набираеться словарь до указаного пользователем количества паролей и сразу же брут им через гидру...
 

explorer

Platinum
05.08.2018
1 080
2 475
BIT
0
Заменить на:

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

length = int(input('длина пароля?'+ "\n"))

Согласен,
Можно еще написать пребор по таким паролям...те сначала набираеться словарь до указаного пользователем количества паролей и сразу же брут им через гидру...

Конечно. Пилить любой скрипт можно бесконечно. И чтобы сделать мега-программу многофункциональную, нужно сначала наклепать небольщих скриптиков, наподобие этого. Ну и потом скрестить, разумеется они должны быть одной направленности, чтобы дополнять друг друга. Иначе получится смесь бульдога с носорогом )
 
  • Нравится
Реакции: Sxfis

explorer

Platinum
05.08.2018
1 080
2 475
BIT
0
Чего-то сегодня под вечер на меня нашло, и я решил переписать эту утилиту с оконным интерфейсом. Так гораздо удобнее, можно сразу в одном окне набить паролей разной длины.

В общем пошаманил, и получил следующий код на выходе:

Python:
# -*- coding:utf -8 -*-
#!/usr/bin/python3
from tkinter import *
import random
import string

root = Tk()
root.resizable(width=False, height=False)
root.title("Генератор паролей")
root.geometry("420x338+300+300")
calculated_text = Text(root,height=15, width=50)

def erase():   
    calculated_text.delete('1.0', END)

chars = '+-/*!&$#?=@<>abcdefghijklnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'

def password():
    for n in range(int(number_entry.get())):
        password =''
        for i in range(int(length_entry.get())):
            password += random.choice(chars)
        calculated_text.insert(END, password + "\n")
    
display_button = Button(text="Сгенерить", command=password)
erase_button = Button(text="Очистить", command=erase)

number_entry = Entry(width=10, justify=CENTER)
length_entry = Entry(width=10, justify=CENTER)
number_entry.insert(0, "8")
length_entry.insert(0, "25")
    
number_label = Label(text="      Количество паролей")
length_label = Label(text="      Длина пароля")
number_label.grid(row=0, column=0, sticky="w")
length_label.grid(row=1, column=0, sticky="w")
number_entry.grid(row=0,column=1, padx=1, pady=5)
length_entry.grid(row=1,column=1, padx=1, pady=5)

display_button.grid(row=2, column=0, padx=5, pady=5, sticky="e")
erase_button.grid(row=2, column=2, padx=15, pady=5, sticky="w")
calculated_text.grid(row=4, column=0, sticky='nsew', columnspan=3)

scrollb = Scrollbar(root, command=calculated_text.yview)
scrollb.grid(row=4, column=4, sticky='nsew')
calculated_text.configure(yscrollcommand=scrollb.set)

root.mainloop()
Выглядит так:

gen.png


В копилку GUI :)
 
V

Valkiria

Количество паролей - 5
Количество символов - 18.
А получилась какая-то каша.

Это тест на внимательность ?
 

explorer

Platinum
05.08.2018
1 080
2 475
BIT
0
Количество паролей - 5
Количество символов - 18.
А получилась какая-то каша.

Это тест на внимательность ?
Ну если тест на внимательность - то внимательнее читать нужно ))) ВЫше написано - можно сразу в одном окне набить паролей разной длины. Что на скрине и видно, сначала 25 знаков, потом 18. Чтобы каши не было, есть кнопка "очистить".
 
  • Нравится
Реакции: Tihon49

Азиз

Green Team
30.05.2018
224
74
BIT
0
Советую добавить немного отступов, и ещё добавить типо:

Пароль 1 - 7377283891
Пароль 2 - hsjsjaklaji28

Так все будет намного понятней
 

explorer

Platinum
05.08.2018
1 080
2 475
BIT
0
Советую добавить немного отступов, и ещё добавить типо:

Пароль 1 - 7377283891
Пароль 2 - hsjsjaklaji28

Так все будет намного понятней

Любые разделители можно по желанию поставить отредактировав строку 23. Пронумеровать тоже можно, но тогда нумерация будет повторяться с каждым новым циклом.
 
  • Нравится
Реакции: Азиз

fuzscore

Well-known member
21.09.2016
77
183
BIT
0
а почему не добавить при каждой новой генерации очистку предыдущей?
 
  • Нравится
Реакции: Азиз

explorer

Platinum
05.08.2018
1 080
2 475
BIT
0
а почему не добавить при каждой новой генерации очистку предыдущей?
Я так задумал просто, чтобы именно разной длины набить сразу в окно можно было. А если это не понадобится, то сделал кнопку "очистить".
Все мы по разному воспринимаем и мыслим :)
А так кучу всего другого можно туда добавить - например отправку в текстовый файл, чтобы ручками не копипастить и т.д.
 

Tayrus

Red Team
13.04.2017
365
787
BIT
6
Решил написать свой вариант:
Код:
import datetime
import base64
import random

def Revers(string):
    string = string[::-1]
    return string

def CorrectPass(password):
    for x in password:
        password = password.replace(x,"")
        if len(password) == passwordlen:
            break
    return password

#Get data
timer = datetime.datetime.now()
#Morph str
timer = str(timer)
timer = timer.replace('-','')
timer = timer.replace(' ','')
timer = timer.replace(':','')
timer = timer.replace('.','')
#Revers or not
realrandom = random.choice([1,2])
if realrandom == 1:
    timer = Revers(timer)
#Encode str
timer = base64.b64encode(bytes(timer, "utf-8"))
#Morph
timer = str(timer)
timer = timer.replace("b'","")
timer = timer.replace("='","")
#Len
passwordlen = 15 #Change this
if passwordlen != len(timer):
    timer = CorrectPass(timer)
#Check
while True: #Если в выводе ничего не получили, то запустите скрипт еще раз, до тех пор пока не получите.
    if timer == '':
        timer = CorrectPass(timer)
    break
print (timer)
 

explorer

Platinum
05.08.2018
1 080
2 475
BIT
0
Решил написать свой вариант
Я уж было обрадовался, что кто-то ещё свои творения выкладывает, но к сожалению консольный скрипт получился длиннющий, не всегда срабатывает, и длина пароля жёстко задана, и выдаёт в 1 экземпляре....
 

z3RoTooL

Grey Team
28.02.2016
803
697
BIT
10
сделал своё творение немного приятней глазу

Bash:
┌─╼[~]
└────╼ cat /bin/passgen                  
#!/bin/bash

# Скрипт генератор паролей pwgen + параметры запуска

echo
echo     Генератор паролей pwgen с параметрами запуска
echo
echo ∗    Генерировать полностью случайные пароли
echo ∗    Включить хотя бы один номер в пароле
echo ∗    Включить хотя бы одну заглавную букву в пароле
echo ∗    Не включать двусмысленные символы в пароле
echo
read -p "⏵ Введите кол-во символов для пароля: " number
echo ──────────────────────╼
pwgen -1sncB "$number" 10
echo ──────────────────────╼

emD7qdS.png
 

Tayrus

Red Team
13.04.2017
365
787
BIT
6
Я уж было обрадовался, что кто-то ещё свои творения выкладывает, но к сожалению консольный скрипт получился длиннющий, не всегда срабатывает, и длина пароля жёстко задана, и выдаёт в 1 экземпляре....
Длину пароля можно поменять(там комментарий измени меня), а размер скрипта имеет значение(это глупо сравнить качество по количеству строк в коде)? Мне лень было фиксить эту проблему(не всегда срабатывает).
 

explorer

Platinum
05.08.2018
1 080
2 475
BIT
0
Ну раз я сам заикнулся о варианте с сохранением в файл, то решил добавить эту функцию в программу. Теперь можно сгенерированные списки паролей сохранять.
Python:
# -*- coding:utf -8 -*-
#!/usr/bin/python3
__version__ = 'Version: 1.1'
from tkinter import *
import random
import string
from tkinter import filedialog as fd

root = Tk()
root.resizable(width=False, height=False)
root.title("Генератор паролей  " +str(__version__))
root.geometry("450x324+300+300")
calculated_text = Text(root,height=14, width=50)

def erase():   
    calculated_text.delete('1.0', END)

chars = '+-/*!&$#?=@<>abcdefghijklnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'

def password():
    for n in range(int(number_entry.get())):       
        password =''
        for i in range(int(length_entry.get())):
            password += random.choice(chars)
        calculated_text.insert(END, password + "\n")

def savepass():
    file_name = fd.asksaveasfilename(filetypes=(("TXT files", "*.txt"),                                       
                                                ("All files", "*.*")),defaultextension='')
    f = open(file_name, 'w')
    s = calculated_text.get(1.0, END)
    f.write(s)
    f.close()
        
display_button = Button(text="Сгенерить", command=password)
erase_button = Button(text="Очистить", command=erase)
save = Button(text="Сохранить", command=savepass)

number_entry = Entry(width=10, justify=CENTER)
length_entry = Entry(width=10, justify=CENTER)
number_entry.insert(0, "8")
length_entry.insert(0, "25")
    
number_label = Label(text="      Количество паролей")
length_label = Label(text="      Длина пароля")
number_label.grid(row=0, column=0, sticky="w")
length_label.grid(row=1, column=0, sticky="w")
number_entry.grid(row=0,column=1, padx=1, pady=5)
length_entry.grid(row=1,column=1, padx=1, pady=5)

save.grid(row=3, column=2, padx=50, pady=5, sticky="w")
display_button.grid(row=3, column=0, padx=30, pady=5, sticky="e")
erase_button.grid(row=3, column=1, padx=30, pady=5, sticky="e")

scrollb = Scrollbar(root, command=calculated_text.yview)
scrollb.grid(row=4, column=3, sticky='nsew')
calculated_text.grid(row=4, column=0, sticky='nsew', columnspan=3)
calculated_text.configure(yscrollcommand=scrollb.set)

root.mainloop()
gena.png
 

z3RoTooL

Grey Team
28.02.2016
803
697
BIT
10
Ну раз я сам заикнулся о варианте с сохранением в файл, то решил добавить эту функцию в программу. Теперь можно сгенерированные списки паролей сохранять.
Python:
# -*- coding:utf -8 -*-
#!/usr/bin/python3
__version__ = 'Version: 1.1'
from tkinter import *
import random
import string
from tkinter import filedialog as fd

root = Tk()
root.resizable(width=False, height=False)
root.title("Генератор паролей  " +str(__version__))
root.geometry("450x324+300+300")
calculated_text = Text(root,height=14, width=50)

def erase():  
    calculated_text.delete('1.0', END)

chars = '+-/*!&$#?=@<>abcdefghijklnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'

def password():
    for n in range(int(number_entry.get())):      
        password =''
        for i in range(int(length_entry.get())):
            password += random.choice(chars)
        calculated_text.insert(END, password + "\n")

def savepass():
    file_name = fd.asksaveasfilename(filetypes=(("TXT files", "*.txt"),                                      
                                                ("All files", "*.*")),defaultextension='')
    f = open(file_name, 'w')
    s = calculated_text.get(1.0, END)
    f.write(s)
    f.close()
       
display_button = Button(text="Сгенерить", command=password)
erase_button = Button(text="Очистить", command=erase)
save = Button(text="Сохранить", command=savepass)

number_entry = Entry(width=10, justify=CENTER)
length_entry = Entry(width=10, justify=CENTER)
number_entry.insert(0, "8")
length_entry.insert(0, "25")
   
number_label = Label(text="      Количество паролей")
length_label = Label(text="      Длина пароля")
number_label.grid(row=0, column=0, sticky="w")
length_label.grid(row=1, column=0, sticky="w")
number_entry.grid(row=0,column=1, padx=1, pady=5)
length_entry.grid(row=1,column=1, padx=1, pady=5)

save.grid(row=3, column=2, padx=50, pady=5, sticky="w")
display_button.grid(row=3, column=0, padx=30, pady=5, sticky="e")
erase_button.grid(row=3, column=1, padx=30, pady=5, sticky="e")

scrollb = Scrollbar(root, command=calculated_text.yview)
scrollb.grid(row=4, column=3, sticky='nsew')
calculated_text.grid(row=4, column=0, sticky='nsew', columnspan=3)
calculated_text.configure(yscrollcommand=scrollb.set)

root.mainloop()
Посмотреть вложение 22189
тебя уже не остановить ))))
 

explorer

Platinum
05.08.2018
1 080
2 475
BIT
0
тебя уже не остановить ))))
Ну так ))) Сегодня вернулся из дальней поездки и сразу за дело.
Советую добавить немного отступов, и ещё добавить типо:

Пароль 1 - 7377283891
Пароль 2 - hsjsjaklaji28

Так все будет намного понятней
Добавил сиё предложение, сделал отступы, и кроме того цикл не сбрасывает счётчик при многократной генерации паролей. Набил пароли разной длины - всё чётко и красиво :)

genpass.png


Python:
# -*- coding:utf -8 -*-
#!/usr/bin/python3
__version__ = 'Version: 2'
from tkinter import *
import random
import string
from tkinter import filedialog as fd

root = Tk()
root.resizable(width=False, height=False)
root.title("Генератор паролей  " +str(__version__))
root.geometry("450x324+300+300")
calculated_text = Text(root,height=14, width=50)

def erase():   
    calculated_text.delete('1.0', END)

chars = '+-/*!&$#?=@<>abcdefghijklnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'

x = 0
def password():
    for n in range(int(number_entry.get())):       
        password =''
        global x
        x += 1
        for i in range(int(length_entry.get())):
            password += random.choice(chars)
        if x<=9:
            calculated_text.insert(END,"Пароль" + '  ' + str(x) + ': ' + password + "\n")
        else:
            calculated_text.insert(END,"Пароль" + ' ' + str(x) + ': ' + password + "\n")

def savepass():
    file_name = fd.asksaveasfilename(filetypes=(("TXT files", "*.txt"),                                       
                                                ("All files", "*.*")),defaultextension='')
    f = open(file_name, 'w')
    s = calculated_text.get(1.0, END)
    f.write(s)
    f.close()
        
display_button = Button(text="Сгенерить", command=password)
erase_button = Button(text="Очистить", command=erase)
save = Button(text="Сохранить", command=savepass)

number_entry = Entry(width=10, justify=CENTER)
length_entry = Entry(width=10, justify=CENTER)
number_entry.insert(0, "8")
length_entry.insert(0, "25")
    
number_label = Label(text="      Количество паролей")
length_label = Label(text="      Длина пароля")
number_label.grid(row=0, column=0, sticky="w")
length_label.grid(row=1, column=0, sticky="w")
number_entry.grid(row=0,column=1, padx=1, pady=5)
length_entry.grid(row=1,column=1, padx=1, pady=5)

save.grid(row=3, column=2, padx=50, pady=5, sticky="w")
display_button.grid(row=3, column=0, padx=30, pady=5, sticky="e")
erase_button.grid(row=3, column=1, padx=30, pady=5, sticky="e")

scrollb = Scrollbar(root, command=calculated_text.yview)
scrollb.grid(row=4, column=3, sticky='nsew')
calculated_text.grid(row=4, column=0, sticky='nsew', columnspan=3)
calculated_text.configure(yscrollcommand=scrollb.set)

root.mainloop()
 

Citizen0

Green Team
07.02.2017
203
228
BIT
0
Хотел спросить.
Почему используется , а не ?
 
Мы в соцсетях:

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