PDA

Просмотр полной версии : Защита личных данных с помощью собственного шифратора на Python


pStrog
12.10.2024, 15:54
Всем привет.

Никто не хочет присоединиться к проекту?
На текущий момент все вроде хорошо, но есть еще порядка 20-30 уязвимостей, которые хочется победить.

Целью было разработать простой и эффективный скрипт на Python для шифрования и расшифровки файлов в определённой директории. При создании инструмента были учтены следующие аспекты:

Надёжное симметричное шифрование: Выбран алгоритм AES (Advanced Encryption Standard) с 256-битным ключом в режиме EAX. Режим EAX обеспечивает одновременно конфиденциальность и целостность данных благодаря встроенной аутентификации.

Безопасное управление ключами: Для шифрования сеансового ключа AES используется асимметричный алгоритм RSA с длиной ключа 4096 бит. Это позволяет безопасно передавать и хранить сеансовые ключи.

Защита приватного ключа: Приватный ключ RSA шифруется с помощью пароля пользователя, используя Argon2 — один из самых надёжных алгоритмов для хеширования паролей, устойчивый к атаке методом перебора.

Безопасное удаление исходных файлов: Для предотвращения восстановления удалённых файлов используется утилита srm, которая перезаписывает данные несколькими проходами.

Удобство использования: Скрипт автоматически создаёт необходимые директории и ключи, предоставляет меню для выбора действий и работает с директориями рекурсивно.

Перейдём к подробному описанию функций, используемых в скрипте.


secure_delete(file_path):
Назначение: Безопасное удаление файла по заданному пути с использованием утилиты srm.

Как работает:
Проверяет наличие srm в системе.

Вызывает команду srm с параметрами -v (verbose), -s (secure mode) для удаления файла.

Обрабатывает возможные ошибки и выводит сообщения о результате операции.



encrypt_private_key(private_key, password):
Назначение: Шифрование приватного ключа RSA с использованием пароля пользователя.

Как работает:
Генерирует случайную соль размером 16 байт.

Преобразует пароль в байты.

Использует Argon2 для получения производного ключа из пароля и соли.

Шифрует приватный ключ с помощью AES в режиме EAX.

Возвращает объединённые данные: соль, nonce, тег аутентификации и шифртекст.



decrypt_private_key(encrypted_data, password):
Назначение: Расшифровка приватного ключа RSA с использованием пароля пользователя.

Как работает:
Извлекает соль, nonce, тег и шифртекст из зашифрованных данных.

Преобразует пароль в байты.

Использует Argon2 для восстановления производного ключа.

Расшифровывает приватный ключ с помощью AES в режиме EAX.

Обрабатывает возможные ошибки, связанные с неверным паролем или повреждёнными данными.



generate_keys():
Назначение: Генерация новой пары ключей RSA.

Как работает:
Использует функцию RSA.generate с длиной ключа 4096 бит для создания приватного ключа.

Получает соответствующий публичный ключ с помощью метода publickey().



save_keys(encrypted_private_key, public_key):
Назначение: Сохранение зашифрованного приватного ключа и публичного ключа в файлы.

Как работает:
Определяет пути для сохранения ключей.

Записывает зашифрованный приватный ключ в файл private_key.bin.

Записывает публичный ключ в файл public_key.pem.

Устанавливает права доступа на файлы ключей.



load_public_key():
Назначение: Загрузка публичного ключа из файла.

Как работает:
Читает содержимое файла public_key.pem.

Импортирует ключ с помощью RSA.import_key.



encrypt_file(file_path, public_key):
Назначение: Шифрование файла с использованием публичного ключа RSA.

Как работает:
Читает данные из файла.

Генерирует случайный сеансовый ключ AES.

Шифрует данные файла с помощью AES в режиме EAX.

Шифрует сеансовый ключ с помощью публичного ключа RSA.

Сохраняет зашифрованные данные и метаданные в новый файл с расширением .enc.

Безопасно удаляет исходный файл.



decrypt_file(file_path, private_key):
Назначение: Расшифровка зашифрованного файла с использованием приватного ключа RSA.

Как работает:
Читает зашифрованный сеансовый ключ, nonce, тег и шифртекст из файла.

Расшифровывает сеансовый ключ с помощью приватного ключа RSA.

Расшифровывает данные файла с помощью AES в режиме EAX.

Сохраняет расшифрованные данные в исходный файл (убирая расширение .enc).

Безопасно удаляет зашифрованный файл.



decrypt_by_path(path, private_key):
Назначение: Расшифровка всех зашифрованных файлов по заданному пути.

Как работает:
Проверяет, является ли путь файлом или директорией.

Если файл имеет расширение .enc, вызывает decrypt_file.

Если директория, рекурсивно обходит все файлы и расшифровывает соответствующие.



secure_delete_private_key():
Назначение: Безопасное удаление приватного ключа из системы.

Как работает:
Проверяет наличие файла приватного ключа.

Вызывает secure_delete для удаления файла.

Выводит сообщение о результате операции.



main():
Назначение: Основная функция, управляющая логикой программы.

Как работает:
Проверяет наличие ключей. Если их нет, предлагает создать мастер-пароль и генерирует ключи.

Если ключи существуют, предлагает пользователю выбрать действие: шифрование, расшифровка или удаление приватного ключа.

В зависимости от выбора, вызывает соответствующие функции и обрабатывает ввод пользователя.

Александр Суворов1
12.10.2024, 23:25
Я могу поучаствовать в разработке

Александр Суворов1
12.10.2024, 23:25
Александр Суворов1 сказал(а):

Я могу поучаствовать в разработке


телеграм @while_not_False

pStrog
13.10.2024, 10:35
Александр Суворов1 сказал(а):

телеграм @while_not_False


Написал в личку, тг не находит

pStrog
13.10.2024, 11:57
Вот некоторые из уязвимости, которые хочется победить(как делать я знаю), может кто поможет)

Отсутствие проверки сложности и длины мастер-пароля.

Потенциальная утечка мастер-пароля через незащищённые логи.

Командная инъекция через subprocess.run при использовании srm.

Возможность восстановления файлов при неудачном или неэффективном удалении через srm.

Отсутствие валидации загружаемого публичного ключа (можно заменить ключ на поддельный).

Ненадёжное шифрование приватного ключа на основе слабого пароля.

Потенциальная утечка путей файлов, передаваемых в функцию шифрования или расшифровки.

Отсутствие валидации файлов, переданных на расшифровку (можно подменить файлы).

Возможность атаки "человек посередине" (MITM) при отсутствии проверки подлинности ключей.

Отсутствие аудита или контроля доступа к файлам ключей (их можно скопировать или удалить).

pStrog
13.10.2024, 11:58
Кому интересно вот тут лежит код Administrator / encryptor_python · GitLab