Дополнение, теперь генератор паролей опционально может использовать спецсимволы.
parent
1130d49587
commit
7b8445ee47
|
@ -1,8 +1,10 @@
|
||||||
### Надежное хранилище паролей для параноиков.
|
### Надежное хранилище паролей для параноиков.
|
||||||
|
|
||||||
Это программа с графическим интерфейсом, позволяет надежно сохранять все логины и пароли в одном месте.
|
Это программа с графическим интерфейсом, позволяет надежно сохранять все логины и пароли в одном месте.
|
||||||
|
Имеет кейген стойких, 16 символьных, алфавитно-цифровых паролей. Спецсимволы - опционально.
|
||||||
|
Наиболее часто используемые логины запоминаются и выдаются списком подстановок, при заполнении новых карточек.
|
||||||
|
|
||||||
Мастер-пароль **нигде не хранится**, ни в коде, ни в базе данных.
|
**ВНИМАНИЕ!** Мастер-пароль **нигде не хранится**, ни в коде, ни в базе данных.
|
||||||
Если вы его забудете, восстановить ваши записи будет **невозможно.**
|
Если вы его забудете, восстановить ваши записи будет **невозможно.**
|
||||||
|
|
||||||
База данных SQLite создается при первом запуске и задании мастер-пароля.
|
База данных SQLite создается при первом запуске и задании мастер-пароля.
|
||||||
|
|
59
main.py
59
main.py
|
@ -1,7 +1,7 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
# Key Master v1.00
|
# Key Master v1.01
|
||||||
# 27/08/2021
|
# 04/09/2021
|
||||||
# https://t.me/ssleg © 2021
|
# https://t.me/ssleg © 2021
|
||||||
|
|
||||||
import sqlite3
|
import sqlite3
|
||||||
|
@ -173,7 +173,7 @@ class AllCards:
|
||||||
|
|
||||||
popular = []
|
popular = []
|
||||||
for item in logins_count:
|
for item in logins_count:
|
||||||
if item[0] > 1:
|
if item[0] > 2:
|
||||||
popular.append(item[1])
|
popular.append(item[1])
|
||||||
|
|
||||||
return popular
|
return popular
|
||||||
|
@ -195,6 +195,37 @@ class AllCards:
|
||||||
self.__cards.pop(index)
|
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():
|
def system_init():
|
||||||
status = False
|
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.InputCombo(popular_list, default_value=card_login, size=(41, 1))],
|
||||||
[Sg.Text('Пароль:')],
|
[Sg.Text('Пароль:')],
|
||||||
[Sg.InputText(card_password, size=(42, 1), border_width=3, key='pass')],
|
[Sg.InputText(card_password, size=(42, 1), border_width=3, key='pass')],
|
||||||
|
[Sg.Checkbox('Использовать спецсимволы в пароле', key='special')],
|
||||||
[Sg.Button('Ok'), Sg.Button('Отменить'), Sg.Button('Сгенерировать пароль')]]
|
[Sg.Button('Ok'), Sg.Button('Отменить'), Sg.Button('Сгенерировать пароль')]]
|
||||||
if mode == 0:
|
if mode == 0:
|
||||||
window = Sg.Window("KeyMaster - новая карточка", layout, modal=True)
|
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
|
card_added = True
|
||||||
break
|
break
|
||||||
if event == 'Сгенерировать пароль':
|
if event == 'Сгенерировать пароль':
|
||||||
new_pass = ''
|
new_pass = pass_generator(values['special'])
|
||||||
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)
|
|
||||||
|
|
||||||
window.Element('pass').Update(new_pass)
|
window.Element('pass').Update(new_pass)
|
||||||
|
|
||||||
window.close()
|
window.close()
|
||||||
|
@ -456,7 +476,8 @@ def main():
|
||||||
|
|
||||||
|
|
||||||
# начало исполнения кода.
|
# начало исполнения кода.
|
||||||
if not path.exists('base.sqlite'):
|
if __name__ == '__main__':
|
||||||
|
if not path.exists('base.sqlite'):
|
||||||
login_status, master_key = system_init()
|
login_status, master_key = system_init()
|
||||||
if login_status:
|
if login_status:
|
||||||
con = sqlite3.connect('base.sqlite')
|
con = sqlite3.connect('base.sqlite')
|
||||||
|
@ -475,10 +496,10 @@ if not path.exists('base.sqlite'):
|
||||||
''')
|
''')
|
||||||
con.commit()
|
con.commit()
|
||||||
pass_save = LoginCard(master_key, name='master_login', login='0', password='0')
|
pass_save = LoginCard(master_key, name='master_login', login='0', password='0')
|
||||||
else:
|
else:
|
||||||
con = sqlite3.connect('base.sqlite')
|
con = sqlite3.connect('base.sqlite')
|
||||||
cursor = con.cursor()
|
cursor = con.cursor()
|
||||||
login_status, master_key = system_login()
|
login_status, master_key = system_login()
|
||||||
|
|
||||||
if login_status:
|
if login_status:
|
||||||
main()
|
main()
|
||||||
|
|
Loading…
Reference in New Issue