ВВЕДЕНИЕ
В условиях стремительной цифровизации современного общества вопросы информационной безопасности выходят на первый план. Среднестатистический пользователь интернета владеет десятками учетных записей: от социальных сетей и мессенджеров до банковских приложений, государственных порталов и корпоративных систем. Каждая из этих учетных записей требует защиты, однако человеческая память имеет свои ограничения. Это порождает серьезную проблему «цифровой гигиены»: пользователи склонны создавать простые, легко подбираемые пароли или, что еще опаснее, использовать одну и ту же комбинацию символов для всех своих ресурсов.
Подобная практика делает персональные данные крайне уязвимыми. Компрометация одного слабо защищенного сервиса (например, форума или интернет-магазина) автоматически открывает злоумышленникам доступ к критически важным аккаунтам пользователя, включая электронную почту и финансовые инструменты. Традиционные методы хранения паролей — бумажные блокноты, текстовые файлы на рабочем столе или таблицы Excel — не выдерживают критики с точки зрения безопасности, так как не обеспечивают шифрования и могут быть легко похищены при заражении компьютера вирусами.
Решением проблемы является использование специализированного программного обеспечения — менеджеров паролей. Они позволяют пользователю запомнить всего один сложный «мастер-пароль», в то время как остальные уникальные криптостойкие ключи генерируются и хранятся программой в зашифрованном виде. Существующие на рынке коммерческие и облачные решения, несмотря на удобство, обладают существенным недостатком: пользователь вынужден доверять свои секреты третьей стороне (провайдеру услуг). История знает немало примеров утечек данных даже у крупных операторов безопасности.
В связи с этим разработка собственного локального менеджера паролей является высокоактуальной задачей. Такой проект позволяет не только создать инструмент, гарантирующий, что зашифрованные данные никогда не покинут устройство пользователя без его ведома, но и глубоко изучить практические аспекты современной криптографии, принципы безопасной разработки (Secure Coding) и архитектуру защищенных приложений.
Объект исследования: методы и алгоритмы обеспечения конфиденциальности, целостности и доступности информации в локальных программных системах.
Предмет исследования: процесс проектирования и программной реализации десктопного приложения «hash.all» на языке Python для безопасного управления учетными данными.
Цель работы: создание полнофункционального защищенного менеджера паролей, реализующего современные стандарты симметричного шифрования и защиты от несанкционированного доступа, а также предоставляющего пользователю инструменты для аудита безопасности своих учетных записей.
Задачи исследования:
Провести теоретический анализ методов криптографической защиты.
Спроектировать архитектуру безопасности приложения.
Реализовать программную логику хранения данных.
Разработать механизмы активной защиты.
Создать инструменты для повышения качества паролей.
Разработать графический интерфейс пользователя (GUI).
Работа над проектом проходила в несколько этапов: от проектирования структуры данных и выбора алгоритмов шифрования до реализации backend-логики, создания графического интерфейса и финального тестирования системы на устойчивость к взлому и корректность обработки исключительных ситуаций.
В работе использовались методы объектно-ориентированного программирования, модульного тестирования и системного анализа. Разработка велась на языке Python третьей версии с применением библиотек cryptography (для шифрования), pydantic (для валидации данных) и requests (для сетевого взаимодействия).
Глава 1. Теоретические аспекты защиты данных
1.1. Анализ существующих угроз и решений
В современном информационном обществе проблема управления доступом к цифровым ресурсам стоит особенно остро. Согласно исследованиям в области кибербезопасности, средний пользователь интернета имеет более 50 активных учетных записей. Человеческая память не способна надежно удерживать такое количество уникальных сложных комбинаций, что приводит к распространению опасных практик «цифровой гигиены».
Наиболее распространенными угрозами безопасности пользовательских данных являются:
Повторное использование паролей. Пользователи устанавливают один и тот же пароль для всех сервисов. В случае взлома одного слабо защищенного сайта (например, форума), злоумышленники получают доступ к критически важным ресурсам жертвы (почта, онлайн-банкинг) методом «Credential Stuffing» (подстановка утекших пар логин-пароль).
Использование слабых паролей. Комбинации вида «123456», «qwerty» или даты рождения подбираются хакерами за доли секунды с помощью атак по словарю.
Небезопасное хранение. Запись паролей в текстовые файлы, заметки смартфона или таблицы Excel делает их легкой добычей для троянов-стилеров, которые сканируют файловую систему на наличие таких документов.
Существующие программные решения для хранения паролей (менеджеры паролей) делятся на три основные категории:
Встроенные в браузер средства. Удобны, но имеют низкий уровень защиты. Если злоумышленник получает физический доступ к разблокированному компьютеру, он может извлечь все пароли из браузера.
Облачныеменеджеры (LastPass, Bitwarden, 1Password). Синхронизируют данные между устройствами через сервер провайдера. Основной риск заключается в доверии третьей стороне: история знает случаи, когда сервера компаний-разработчиков были взломаны, и зашифрованные хранилища пользователей попадали в сеть.
Локальные менеджеры (KeePass, Enpass). Хранят базу данных (файл-сейф) непосредственно на устройстве пользователя. Это исключает риск массовой утечки с сервера провайдера, однако требует от пользователя самостоятельной заботы о резервном копировании.
В рамках данной проектной работы было выбрано направление разработки локального менеджера паролей. Такой подход позволяет реализовать концепцию «Zero Knowledge» (нулевого разглашения), при которой ключи шифрования и данные никогда не передаются по сети, оставаясь под полным контролем владельца.
1.2. Принципы симметричного шифрования и алгоритм AES
Для обеспечения конфиденциальности данных в локальном хранилище необходимо использовать криптографические алгоритмы, преобразующие открытый текст (пароли, логины, заметки) в шифротекст, прочитать который невозможно без специального ключа. В разработанном приложении применяется симметричное шифрование. [3]
Симметричное шифрование подразумевает использование одного и того же секретного ключа как для зашифровывания, так и для расшифровывания информации. Это обеспечивает высокую скорость работы, что критично при обработке больших массивов данных.
В качестве стандарта шифрования в проекте выбран алгоритм AES (Advanced Encryption Standard), принятый в качестве стандарта правительством США в 2001 году. [4] AES является блочным шифром: он разбивает данные на блоки фиксированного размера (128 бит) и применяет к ним серию математических преобразований (подстановки, перестановки, смешивание столбцов) в несколько раундов.
Однако «чистый» блочный шифр (в режиме ECB) имеет уязвимость: одинаковые блоки открытого текста превращаются в одинаковые блоки шифротекста, что позволяет увидеть паттерны в зашифрованных данных. Поэтому в современной криптографии используются защищенные режимы работы.
В данном проекте используется реализация Fernet (часть библиотеки cryptography), которая построена на базе AES-128 в режиме CBC (Cipher Block Chaining). [3] Особенностью Fernet является то, что он обеспечивает не только конфиденциальность, но и целостность данных:
Шифрование (AES-CBC): Каждый блок данных шифруется с использованием результата шифрования предыдущего блока и вектора инициализации (IV). Это гарантирует, что даже при шифровании одинаковых паролей на выходе будут получены абсолютно разные байтовые последовательности.
Аутентификация (HMAC-SHA256): К зашифрованным данным добавляется цифровая подпись (HMAC). Это защищает от атак типа «Chosen Ciphertext»: если злоумышленник попытается изменить хотя бы один бит в зашифрованном файле хранилища, программа обнаружит нарушение целостности и откажется расшифровывать данные, предотвращая возможные ошибки или внедрение вредоносного кода.
Таким образом, использование связки AES-128-CBC и HMAC обеспечивает высокий уровень защиты локальной базы данных от просмотра и модификации.
1.3. Хеширование и многоуровневая защита мастер-пароля
Ключевым аспектом безопасности менеджера паролей является защита «Мастер-пароля» — единственного ключа, который открывает доступ ко всему хранилищу. Хранить мастер-пароль в открытом виде или даже в зашифрованном виде недопустимо, так как ключ для расшифровки пришлось бы хранить рядом.
Для решения этой задачи используется криптографическое хеширование. Хеш-функция преобразует входные данные произвольной длины в строку фиксированной длины (хеш). Это процесс необратим: восстановить исходный пароль из хеша математически невозможно. При входе в систему программа хеширует введенный пользователем пароль и сравнивает результат с сохраненным в базе хешем.
Однако классические алгоритмы хеширования (MD5, SHA-256) уязвимы к атакам перебора с использованием «радужных таблиц» (заранее вычисленных баз хешей). [5] Чтобы противостоять этому, в проекте реализован комплексный подход:
Соль (Salt): К каждому паролю перед хешированием добавляется уникальная случайная строка (соль). Это делает каждый хеш уникальным, даже если у двух пользователей одинаковые пароли.
Алгоритм адаптивного хеширования (Bcrypt): В отличие от быстрых функций (SHA), алгоритм Bcrypt разработан специально для хранения паролей. Он намеренно работает медленно и требует значительных вычислительных ресурсов процессора. Это не мешает легитимному пользователю (задержка в 0.5 секунды незаметна), но делает перебор миллионов паролей в секунду технически невозможным для хакера.
Использование «Перца» (Pepper): В дополнение к соли, в проекте реализована концепция «Перца». Это секретный ключ, который добавляется к паролю перед хешированием, но, в отличие от соли, он хранится не в базе данных, а в отдельном защищенном файле (или в конфигурации системы). Преимущество: Если злоумышленник украдет файл с базой пользователей (users.json), он не сможет подобрать пароли (даже методом перебора), так как ему неизвестен компонент «Перец», хранящийся отдельно.
Также для генерации ключа шифрования (AES) из мастер-пароля используется функция деривации ключа PBKDF2 (Password-Based Key Derivation Function 2) с использованием алгоритма HMAC-SHA256. Она выполняет тысячи итераций хеширования, превращая пользовательский пароль в криптостойкий 32-байтный ключ, пригодный для алгоритма Fernet.
Такая многослойная архитектура (AES + HMAC + Bcrypt + Salt + Pepper) обеспечивает защиту, соответствующую современным промышленным стандартам безопасности. [5]
Вывод к Главе 1
В первой главе был проведен анализ проблем информационной безопасности, связанных с управлением учетными данными. Установлено, что использование слабых или повторяющихся паролей, а также хранение секретов в незащищенном виде, является критической уязвимостью для современных пользователей. Сравнение существующих решений показало, что разработка локального менеджера паролей позволяет исключить риски, характерные для облачных сервисов (утечки на стороне провайдера, зависимость от интернет-соединения).
В ходе теоретического исследования были выбраны и обоснованы криптографические стандарты для реализации проекта:
Алгоритм AES (режим CBC/Fernet) — для симметричного шифрования базы данных, обеспечивающий конфиденциальность и целостность информации.
Алгоритм Bcrypt и функция PBKDF2 — для защиты мастер-пароля от атак перебора и использования радужных таблиц.
Концепция «Salt» и «Pepper» — для многоуровневой защиты хешей.
Выбранный теоретический базис гарантирует, что проектируемая система будет соответствовать современным требованиям к безопасности данных (принцип Zero Knowledge).
Глава 2. Разработка архитектуры и программная реализация системы
2.1. Структура приложения и обоснование выбора инструментария
Для реализации поставленной задачи был выбран язык программирования Python (версии 3.10 и выше). Выбор обусловлен наличием развитой экосистемы криптографических библиотек, поддержкой кроссплатформенности и высокой скоростью разработки. [1, 9]
Архитектура приложения построена по модульному принципу, что обеспечивает разделение ответственности (Separation of Concerns) и упрощает дальнейшую поддержку кода. Файловая структура проекта разделена на логические блоки:
auth — модуль аутентификации и защиты от несанкционированного доступа.
crypto — ядро криптографических операций (шифрование, хеширование, генерация ключей).
keys и vault — модули, отвечающие за непосредственную работу с файловой системой и хранилищем данных.
models — описание структур данных и правил их валидации.
gui — графический интерфейс пользователя.
В качестве основных внешних зависимостей используются следующие библиотеки:
cryptography — предоставляет примитивы для симметричного шифрования (Fernet) и деривации ключей (KDF). [6]
pydantic — используется для валидации входных данных и описания моделей (Data Classes), что позволяет исключить ошибки типизации и внедрение некорректных данных в хранилище. [7]
tkinter — стандартная библиотека Python для создания графического интерфейса (GUI).
requests — для осуществления HTTP-запросов к внешним API при проверке утечек паролей.
2.2. Реализация модуля безопасности и криптографического ядра
Центральным элементом системы является класс CryptoManager, реализованный в файле crypto/crypto.py. Он инкапсулирует в себе всю логику преобразования данных.
Одной из главных проблем локальных менеджеров паролей является хранение ключа шифрования. В разработанном приложении реализован принцип, при котором ключ шифрования AES никогда не хранится на диске. Он генерируется динамически в оперативной памяти каждый раз, когда пользователь вводит мастер-пароль.
Для этого используется алгоритм PBKDF2HMAC (Password-Based Key Derivation Function 2) с хеш-функцией SHA-256. Процесс выглядит следующим образом:
При первом запуске генерируется случайная «соль» (16 байт), которая сохраняется открыто.
Мастер-пароль пользователя смешивается с солью.
Производится 480 000 итераций хеширования (количество итераций задается в конфигурации SecurityConfig).
На выходе получается 32-байтный ключ, пригодный для кодирования в формате Base64, который используется алгоритмом Fernet.
Такой подход делает атаку перебора практически невозможной, так как вычисление одного ключа занимает ощутимое время (около 0.3–0.5 секунды на современном процессоре), что не позволяет злоумышленнику быстро перебирать миллионы комбинаций.
Логика входа пользователя реализована в классе AuthManager (auth/auth.py). Для хранения проверочных данных используется файл users.json, однако пароли в нем не хранятся. Вместо этого сохраняется хеш, полученный с помощью алгоритма bcrypt.
Ключевой особенностью реализации является использование «Перца» (Pepper) — дополнительного секретного ключа, путь к которому указан в конфигурационном файле. В отличие от соли, которая уникальна для каждого пользователя и хранится в базе, перец является общим секретом приложения и хранится отдельно (например, на съемном носителе или в защищенной директории). Перед хешированием перец добавляется к паролю. Это означает, что даже полная кража базы данных users.json не позволит злоумышленнику подобрать пароли, так как ему неизвестен компонент «Перец».
Для предотвращения онлайн-перебора паролей в файле auth/limiter.py реализован класс RateLimiter. Он работает в отдельном потоке и использует примитивы синхронизации (threading.RLock) для потокобезопасности.
Алгоритм работыограничителя:
Система отслеживает количество неудачных попыток входа для каждого логина.
Если количество попыток превышает пороговое значение (константа MAX_LOGIN_ATTEMPTS), пользователь временно блокируется.
Время блокировки определяется параметром LOCKOUT_DURATION.
Это делает прямой перебор паролей через интерфейс программы бессмысленным.
2.3. Огранизация безопасного хранения данных
Хранение пользовательских данных (логинов, паролей, заметок) реализовано в модуле keys/vault.py через класс VaultManager. Данные сериализуются в формат JSON, что обеспечивает гибкость структуры, однако перед записью на диск все чувствительные поля шифруются. [2, 7]
В модуле models/ определены строгие схемы данных с использованием библиотеки Pydantic.
VaultRecord описывает одну запись: сервис, логин, пароль, заметки.
VaultFile описывает структуру всего файла хранилища.
Модели автоматически проверяют корректность форматов (например, временные метки создания записи) и защищают от XSS-инъекций, экранируя опасные символы в строках.
Критически важным аспектом надежности является механизм сохранения данных. В процессе работы программы может произойти сбой питания или аварийное завершение процесса. Если в этот момент программа перезаписывает файл базы данных, он может быть безвозвратно поврежден (обнулен или обрезан).
Для решения этой проблемы в методе save_vault реализована атомарная запись:
Данные сначала записываются во временный файл (с расширением .tmp).
Выполняется принудительный сброс буферов на диск (flush и os.fsync), чтобы гарантировать физическую запись битов.
Только после успешной записи происходит переименование временного файла в основной (os.replace).
Операция переименования является атомарной на уровне операционной системы, что гарантирует целостность базы данных в любой ситуации.
2.4. Генерация и проверка паролей
Современный менеджер паролей должен не только хранить, но и создавать безопасные ключи, а также следить за их актуальностью.
Модуль pass_gen/pass_gen.py реализует генератор паролей. В отличие от стандартных учебных примеров, использующих модуль random, в данном проекте применяется модуль secrets, предназначенный для криптографических задач. Он использует энтропию операционной системы, что делает предсказание следующего символа невозможным.
Алгоритм гарантирует наличие в пароле хотя бы одного символа из каждой выбранной категории (строчные буквы, заглавные буквы, цифры, спецсимволы), что повышает устойчивость пароля к словарным атакам.
В файле web_requests/hibp_api.py реализована интеграция с сервисом Have I Been Pwned. При реализации этой функции особое внимание было уделено конфиденциальности. [8]
Используется метод k-anonymity (k-анонимности):
Пароль хешируется алгоритмом SHA-1.
От хеша берутся только первые 5 символов (префикс).
Этот префикс отправляется на API-сервер.
Сервер возвращает список всех утекших хешей, начинающихся с этого префикса (сотни вариантов).
Программа локально ищет свой полный хеш в полученном списке.
Таким образом, ни сам пароль, ни его полный хеш никогда не покидают компьютер пользователя. Сервер не может узнать, какой именно пароль проверяет пользователь, что обеспечивает полную приватность проверки.
Выводы к Главе 2
Во второй главе была спроектирована и реализована программная архитектура приложения на языке Python. Разработка велась с применением объектно-ориентированного подхода и модульной структуры, разделяющей логику безопасности, работу с данными и интерфейс.
Ключевыми результатами реализации серверной части («бэкенда») стали:
Создание криптографического ядра (CryptoManager), реализующего динамическую генерацию ключей шифрования и безопасную обработку данных в оперативной памяти.
Внедрение механизмов активной защиты: системы ограничения запросов (RateLimiter) для блокировки Brute-force атак и использования секретного ключа-перца для защиты базы пользователей.
Обеспечение надежности хранения: реализация алгоритма атомарной записи файлов, исключающего потерю данных при системных сбоях.
Интеграция внешних сервисов: разработан модуль проверки утечек паролей с использованием метода k-anonymity, обеспечивающего приватность пользователя.
Таким образом, программная логика приложения полностью решает задачи безопасного шифрования, хранения и валидации данных.
Глава 3. Реализация пользовательского интерфейса
3.1. Проектирование и разработка графического интерфейса
Для обеспечения удобного взаимодействия пользователя с разработанными алгоритмами шифрования был создан графический интерфейс. В качестве инструментальной базы выбрана библиотека tkinter — стандартный модуль Python для создания десктопных приложений. Выбор обусловлен её стабильностью, кроссплатформенностью (приложение выглядит нативно как в Windows, так и в Linux/macOS) и отсутствием необходимости устанавливать тяжеловесные сторонние зависимости. [1, 9]
Архитектура интерфейса разделена на два независимых компонента, управляемых из точки входа main.py:
Окно авторизации (LoginWindow, файл gui/login.py).
Основное рабочее пространство (MainApplication, файл gui/interface.py).
Реализация окна входа и регистрации. При запуске приложения инициализируется класс LoginWindow. Интерфейс спроектирован с учетом принципов минимализма: пользователю доступны поля для ввода логина и пароля, а также переключатель режимов «Вход / Регистрация». Важной особенностью реализации является валидация ввода «на лету». Система проверяет соответствие пароля политикам безопасности (наличие заглавных букв, цифр) непосредственно перед отправкой данных на обработку. В случае ошибки пользователь получает визуальное уведомление через диалоговые окна (messagebox).
Для повышения отзывчивости интерфейса (UX) операции хеширования паролей (которые, как описано во второй главе, занимают значительное время из-за алгоритмов PBKDF2 и Bcrypt) выполняются таким образом, чтобы не «замораживать» отрисовку окна.
Основное окно приложения. После успешной аутентификации и расшифровки мастер-ключа окно входа уничтожается, и запускается класс MainApplication. Интерфейс организован с использованием виджета ttk.Notebook, который реализует вкладки:
Vault (Хранилище): Центральный элемент интерфейса. Здесь используется табличное представление (Treeview) для отображения списка сохраненных аккаунтов. В целях безопасности пароли в таблице скрыты символами-заполнителями (******). Для взаимодействия с записями реализовано контекстное меню и кнопки управления (Добавить, Редактировать, Удалить, Копировать в буфер обмена).
Generator (Генератор): Графическая оболочка для модуля pass_gen. Пользователь может настраивать длину пароля и используемые наборы символов (цифры, спецсимволы) с помощью чекбоксов (Checkbutton).
Leak Check (Проверка утечек): Интерфейс для взаимодействия с API Have I Been Pwned. Содержит поле ввода и индикатор статуса проверки.
Выводы к Главе 3
В третьей главе был подробно рассмотрен процесс создания визуальной оболочки приложения. Использование библиотеки tkinter позволило создать легкий и кроссплатформенным графический интерфейс, не требующий установки дополнительных драйверов или библиотек.
Разработанный GUI успешно решает следующие задачи:
Изоляция сложности: Пользователь взаимодействует с простыми формами и кнопками, не вникая в процесс шифрования и хеширования.
Защита от визуального шпионажа: Реализовано скрытие паролей при вводе и просмотре таблицы.
Удобство использования: Внедрены механизмы работы с буфером обмена, контекстные меню и визуальные уведомления о статусе операций.
Таким образом, графический интерфейс связывает все разработанные ранее модули безопасности в единый, готовый к эксплуатации программный продукт.
ЗАКЛЮЧЕНИЕ
В ходе выполнения проектной работы была успешно решена задача разработки защищенного десктопного приложения для управления учетными данными пользователей. Цель проекта — создание локального менеджера паролей на языке Python, обеспечивающего высокий уровень конфиденциальности и сохранности информации, — достигнута в полном объеме.
В процессе исследования и разработки были получены следующие результаты:
Изучены теоретические основы криптографии. Проведен анализ современных алгоритмов шифрования и методов защиты данных. Обоснован выбор симметричного алгоритма AES в режиме CBC для шифрования хранилища и алгоритма Bcrypt для безопасного хеширования мастер-пароля.
Реализована надежная архитектура безопасности. Разработанное приложение «Hash.All» реализует концепцию многоуровневой защиты («Defense in Depth»). Внедрение таких механизмов, как криптографическая «соль», секретный ключ «перец» (Pepper) и защита от перебора (Rate Limiting), позволяет утверждать, что приложение устойчиво к основным векторам атак на локальные базы данных.
Обеспечена целостность данных. Программная реализация механизма атомарной записи файлов гарантирует защиту пользовательской информации от повреждения даже в случаях аппаратных сбоев или аварийного завершения работы.
Создан функциональный пользовательский интерфейс. Графическая оболочка, разработанная на библиотеке tkinter, делает сложные криптографические процессы прозрачными и удобными для конечного пользователя. Внедренные инструменты генерации паролей и проверки их на утечки (через API Have I Been Pwned с соблюдением k-анонимности) значительно повышают практическую ценность продукта.
Практическая значимость работы заключается в том, что созданный программный продукт является полностью автономным и готовым к эксплуатации инструментом. Он позволяет пользователю отказаться от небезопасных методов хранения паролей (текстовые файлы, блокноты) и минимизировать риски взлома аккаунтов, не передавая свои данные облачным провайдерам.
В ходе работы над проектом были углублены знания в области объектно-ориентированного программирования на Python, изучены принципы работы с библиотеками cryptography и pydantic, а также освоены навыки проектирования графических интерфейсов и безопасной работы с файловыми системами.
Проект имеет потенциал для дальнейшей модернизации. Возможными направлениями развития являются: внедрение двухфакторной аутентификации (2FA) для доступа к хранилищу, создание механизма зашифрованной синхронизации базы данных между устройствами через облачные хранилища (Yandex.Disk, Disk-O, Google Drive, Dropbox) и разработка мобильной версии приложения.
БИБЛИОГРАФИЯ
Мэтиз, Э. Изучаем Python. Программирование игр, визуализация данных, веб-приложения. 3-е изд.[1][2] / Э. Мэтиз. — СПб.: Питер, 2023. — 512 с. (Это перевод "Python Crash Course, 3rd Edition").
Рамальо, Л. Python.[2][3][4] К вершинам мастерства. Лаконичное и эффективное программирование. 2-е изд. / Л. Рамальо. — М.: ДМК Пресс, 2022. — 896 с. (Это мощная книга для уровня Middle, ссылка на неё — знак качества).
Истом, Ч. Современная криптография. Прикладная математика для шифрования и информационной безопасности. 2-е изд. / Ч. Истом. — М.: Диалектика, 2023. — 416 с. (Идеально подходит для твоей главы про AES).
NIST Special Publication 800-63B. Digital Identity Guidelines: Authentication and Lifecycle Management (Revision 4, Public Draft). — National Institute of Standards and Technology, 2024. — URL: https://pages.nist.gov/800-63-4/ (датаобращения: 25.11.2024).
OWASP Password Storage Cheat Sheet. — OWASP Foundation, 2024. — URL: https://cheatsheetseries.owasp.org/cheatsheets/Password_Storage_Cheat_Sheet.html (датаобращения: 25.11.2024).
Cryptography 43.0.0 Documentation. — The Python Cryptographic Authority, 2024. — URL: https://cryptography.io/en/latest/ (датаобращения: 25.11.2024).
Pydantic v2 Documentation. — Pydantic Services Inc., 2023. — URL: https://docs.pydantic.dev/latest/ (датаобращения: 25.11.2024).
Have I Been Pwned API v3 Documentation. — Troy Hunt, 2024. — URL: https://haveibeenpwned.com/API/v3 (датаобращения: 25.11.2024).
Бэрри, П. Изучаем программирование на Python. 2-е изд. / П. Бэрри. — М.: Эксмо, 2021. — 624 с.
ПРИЛОЖЕНИЯ
hash.all - Secure password manager
ver 0.1.2a
"""
import sys
import os
from pathlib import Path
def setup_imports():
# Get the full path to the project dir
project_root = Path(__file__).parent.absolute()
# Add this to sys.path if not in it
if str(project_root) not in sys.path:
sys.path.insert(0, str(project_root))
# Check avaliable modules / logs if error
try:
from gui.login import LoginWindow
return True
except ImportError as e:
print(f"Import error: {e}")
print(f"Project root: {project_root}")
print(f"Python path: {sys.path}")
return False
def main():
# Fail message
if not setup_imports():
print(
"Failed to setup imports. Please check\n1. All required files are present\n2. You have necessary permissions"
)
# Trying to initialize window / logs if error
try:
from gui.login import LoginWindow
login_window = LoginWindow()
login_window.run()
except Exception as e:
print(f"Critial error: {e}")
sys.exit(1)
# Start application
if __name__ == "__main__":
main()