From 7b8445ee47fee1c87ba7dd3601cc9a345d3f9006 Mon Sep 17 00:00:00 2001 From: ssleg <1537206@mail.ru> Date: Sat, 4 Sep 2021 11:35:29 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=BF=D0=BE=D0=BB=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5,=20=D1=82=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20?= =?UTF-8?q?=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B0=D1=82=D0=BE=D1=80=20=D0=BF?= =?UTF-8?q?=D0=B0=D1=80=D0=BE=D0=BB=D0=B5=D0=B9=20=D0=BE=D0=BF=D1=86=D0=B8?= =?UTF-8?q?=D0=BE=D0=BD=D0=B0=D0=BB=D1=8C=D0=BD=D0=BE=20=D0=BC=D0=BE=D0=B6?= =?UTF-8?q?=D0=B5=D1=82=20=D0=B8=D1=81=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D1=82=D1=8C=20=D1=81=D0=BF=D0=B5=D1=86=D1=81=D0=B8?= =?UTF-8?q?=D0=BC=D0=B2=D0=BE=D0=BB=D1=8B.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.MD | 4 ++- main.py | 99 +++++++++++++++++++++++++++++++++---------------------- 2 files changed, 63 insertions(+), 40 deletions(-) diff --git a/README.MD b/README.MD index b32db0e..b992eeb 100644 --- a/README.MD +++ b/README.MD @@ -1,8 +1,10 @@ ### Надежное хранилище паролей для параноиков. Это программа с графическим интерфейсом, позволяет надежно сохранять все логины и пароли в одном месте. +Имеет кейген стойких, 16 символьных, алфавитно-цифровых паролей. Спецсимволы - опционально. +Наиболее часто используемые логины запоминаются и выдаются списком подстановок, при заполнении новых карточек. -Мастер-пароль **нигде не хранится**, ни в коде, ни в базе данных. +**ВНИМАНИЕ!** Мастер-пароль **нигде не хранится**, ни в коде, ни в базе данных. Если вы его забудете, восстановить ваши записи будет **невозможно.** База данных SQLite создается при первом запуске и задании мастер-пароля. diff --git a/main.py b/main.py index f92c45b..482e53e 100755 --- a/main.py +++ b/main.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 -# Key Master v1.00 -# 27/08/2021 +# Key Master v1.01 +# 04/09/2021 # https://t.me/ssleg © 2021 import sqlite3 @@ -173,7 +173,7 @@ class AllCards: popular = [] for item in logins_count: - if item[0] > 1: + if item[0] > 2: popular.append(item[1]) return popular @@ -195,6 +195,37 @@ class AllCards: self.__cards.pop(index) +# генератор паролей +def pass_generator(species_flag=False): + species = '!@#$%^&*()-_+=;:,./?\\|`~[]{}^' + "'" + '"<>~.' + new_pass = '' + species_count = 0 + for i in range(0, 16): + cycle_flag = False + if species_flag: + if species_count < 4: + probability = randint(0, 5) + if probability == 4: + index = randint(0, 34) + new_pass += species[index] + species_count += 1 + cycle_flag = True + + if not cycle_flag: + char_index = randint(0, 35) + if char_index > 9: + char_index += 55 + capital = randint(0, 1) + if capital == 0: + new_pass += chr(char_index) + else: + new_pass += chr(char_index + 32) + else: + new_pass += str(char_index) + + return new_pass + + # окно первого входа и задания пароля def system_init(): status = False @@ -316,6 +347,7 @@ def add_or_edit_card(used_list, popular_list, mode, name='', login='', password= [Sg.InputCombo(popular_list, default_value=card_login, size=(41, 1))], [Sg.Text('Пароль:')], [Sg.InputText(card_password, size=(42, 1), border_width=3, key='pass')], + [Sg.Checkbox('Использовать спецсимволы в пароле', key='special')], [Sg.Button('Ok'), Sg.Button('Отменить'), Sg.Button('Сгенерировать пароль')]] if mode == 0: window = Sg.Window("KeyMaster - новая карточка", layout, modal=True) @@ -347,19 +379,7 @@ def add_or_edit_card(used_list, popular_list, mode, name='', login='', password= card_added = True break if event == 'Сгенерировать пароль': - new_pass = '' - for i in range(0, 16): - m = randint(0, 35) - if m > 9: - m += 55 - m2 = randint(0, 1) - if m2 == 0: - new_pass += chr(m) - else: - new_pass += chr(m + 32) - else: - new_pass += str(m) - + new_pass = pass_generator(values['special']) window.Element('pass').Update(new_pass) window.close() @@ -456,29 +476,30 @@ def main(): # начало исполнения кода. -if not path.exists('base.sqlite'): - login_status, master_key = system_init() - if login_status: +if __name__ == '__main__': + if not path.exists('base.sqlite'): + login_status, master_key = system_init() + if login_status: + con = sqlite3.connect('base.sqlite') + cursor = con.cursor() + cursor.executescript(''' + create table logins + ( + row_id integer + constraint logins_pk + primary key autoincrement, + row_name text not null, + login text not null, + password text not null, + hash text not null + ); + ''') + con.commit() + pass_save = LoginCard(master_key, name='master_login', login='0', password='0') + else: con = sqlite3.connect('base.sqlite') cursor = con.cursor() - cursor.executescript(''' - create table logins - ( - row_id integer - constraint logins_pk - primary key autoincrement, - row_name text not null, - login text not null, - password text not null, - hash text not null - ); - ''') - con.commit() - pass_save = LoginCard(master_key, name='master_login', login='0', password='0') -else: - con = sqlite3.connect('base.sqlite') - cursor = con.cursor() - login_status, master_key = system_login() + login_status, master_key = system_login() -if login_status: - main() + if login_status: + main()