Дополнение, теперь генератор паролей опционально может использовать спецсимволы.
parent
1130d49587
commit
7b8445ee47
|
@ -1,8 +1,10 @@
|
|||
### Надежное хранилище паролей для параноиков.
|
||||
|
||||
Это программа с графическим интерфейсом, позволяет надежно сохранять все логины и пароли в одном месте.
|
||||
Имеет кейген стойких, 16 символьных, алфавитно-цифровых паролей. Спецсимволы - опционально.
|
||||
Наиболее часто используемые логины запоминаются и выдаются списком подстановок, при заполнении новых карточек.
|
||||
|
||||
Мастер-пароль **нигде не хранится**, ни в коде, ни в базе данных.
|
||||
**ВНИМАНИЕ!** Мастер-пароль **нигде не хранится**, ни в коде, ни в базе данных.
|
||||
Если вы его забудете, восстановить ваши записи будет **невозможно.**
|
||||
|
||||
База данных SQLite создается при первом запуске и задании мастер-пароля.
|
||||
|
|
53
main.py
53
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,6 +476,7 @@ def main():
|
|||
|
||||
|
||||
# начало исполнения кода.
|
||||
if __name__ == '__main__':
|
||||
if not path.exists('base.sqlite'):
|
||||
login_status, master_key = system_init()
|
||||
if login_status:
|
||||
|
|
Loading…
Reference in New Issue