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

pStrog

One Level
11.04.2022
4
1
BIT
41
Всем привет.

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


Целью было разработать простой и эффективный скрипт на Python для шифрования и расшифровки файлов в определённой директории. При создании инструмента были учтены следующие аспекты:
  1. Надёжное симметричное шифрование: Выбран алгоритм AES (Advanced Encryption Standard) с 256-битным ключом в режиме EAX. Режим EAX обеспечивает одновременно конфиденциальность и целостность данных благодаря встроенной аутентификации.
  2. Безопасное управление ключами: Для шифрования сеансового ключа AES используется асимметричный алгоритм RSA с длиной ключа 4096 бит. Это позволяет безопасно передавать и хранить сеансовые ключи.
  3. Защита приватного ключа: Приватный ключ RSA шифруется с помощью пароля пользователя, используя Argon2 — один из самых надёжных алгоритмов для хеширования паролей, устойчивый к атаке методом перебора.
  4. Безопасное удаление исходных файлов: Для предотвращения восстановления удалённых файлов используется утилита srm, которая перезаписывает данные несколькими проходами.
  5. Удобство использования: Скрипт автоматически создаёт необходимые директории и ключи, предоставляет меню для выбора действий и работает с директориями рекурсивно.

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

  1. secure_delete(file_path):
    • Назначение: Безопасное удаление файла по заданному пути с использованием утилиты srm.
    • Как работает:
      • Проверяет наличие srm в системе.
      • Вызывает команду srm с параметрами -v (verbose), -s (secure mode) для удаления файла.
      • Обрабатывает возможные ошибки и выводит сообщения о результате операции.
  2. encrypt_private_key(private_key, password):
    • Назначение: Шифрование приватного ключа RSA с использованием пароля пользователя.
    • Как работает:
      • Генерирует случайную соль размером 16 байт.
      • Преобразует пароль в байты.
      • Использует Argon2 для получения производного ключа из пароля и соли.
      • Шифрует приватный ключ с помощью AES в режиме EAX.
      • Возвращает объединённые данные: соль, nonce, тег аутентификации и шифртекст.
  3. decrypt_private_key(encrypted_data, password):
    • Назначение: Расшифровка приватного ключа RSA с использованием пароля пользователя.
    • Как работает:
      • Извлекает соль, nonce, тег и шифртекст из зашифрованных данных.
      • Преобразует пароль в байты.
      • Использует Argon2 для восстановления производного ключа.
      • Расшифровывает приватный ключ с помощью AES в режиме EAX.
      • Обрабатывает возможные ошибки, связанные с неверным паролем или повреждёнными данными.
  4. generate_keys():
    • Назначение: Генерация новой пары ключей RSA.
    • Как работает:
      • Использует функцию RSA.generate с длиной ключа 4096 бит для создания приватного ключа.
      • Получает соответствующий публичный ключ с помощью метода publickey().
  5. save_keys(encrypted_private_key, public_key):
    • Назначение: Сохранение зашифрованного приватного ключа и публичного ключа в файлы.
    • Как работает:
      • Определяет пути для сохранения ключей.
      • Записывает зашифрованный приватный ключ в файл private_key.bin.
      • Записывает публичный ключ в файл public_key.pem.
      • Устанавливает права доступа на файлы ключей.
  6. load_public_key():
    • Назначение: Загрузка публичного ключа из файла.
    • Как работает:
      • Читает содержимое файла public_key.pem.
      • Импортирует ключ с помощью RSA.import_key.
  7. encrypt_file(file_path, public_key):
    • Назначение: Шифрование файла с использованием публичного ключа RSA.
    • Как работает:
      • Читает данные из файла.
      • Генерирует случайный сеансовый ключ AES.
      • Шифрует данные файла с помощью AES в режиме EAX.
      • Шифрует сеансовый ключ с помощью публичного ключа RSA.
      • Сохраняет зашифрованные данные и метаданные в новый файл с расширением .enc.
      • Безопасно удаляет исходный файл.
  8. decrypt_file(file_path, private_key):
    • Назначение: Расшифровка зашифрованного файла с использованием приватного ключа RSA.
    • Как работает:
      • Читает зашифрованный сеансовый ключ, nonce, тег и шифртекст из файла.
      • Расшифровывает сеансовый ключ с помощью приватного ключа RSA.
      • Расшифровывает данные файла с помощью AES в режиме EAX.
      • Сохраняет расшифрованные данные в исходный файл (убирая расширение .enc).
      • Безопасно удаляет зашифрованный файл.
  9. decrypt_by_path(path, private_key):
    • Назначение: Расшифровка всех зашифрованных файлов по заданному пути.
    • Как работает:
      • Проверяет, является ли путь файлом или директорией.
      • Если файл имеет расширение .enc, вызывает decrypt_file.
      • Если директория, рекурсивно обходит все файлы и расшифровывает соответствующие.
  10. secure_delete_private_key():
    • Назначение: Безопасное удаление приватного ключа из системы.
    • Как работает:
      • Проверяет наличие файла приватного ключа.
      • Вызывает secure_delete для удаления файла.
      • Выводит сообщение о результате операции.
  11. main():
    • Назначение: Основная функция, управляющая логикой программы.
    • Как работает:
      • Проверяет наличие ключей. Если их нет, предлагает создать мастер-пароль и генерирует ключи.
      • Если ключи существуют, предлагает пользователю выбрать действие: шифрование, расшифровка или удаление приватного ключа.
      • В зависимости от выбора, вызывает соответствующие функции и обрабатывает ввод пользователя.
 

pStrog

One Level
11.04.2022
4
1
BIT
41
Вот некоторые из уязвимости, которые хочется победить(как делать я знаю), может кто поможет)
  • Отсутствие проверки сложности и длины мастер-пароля.
  • Потенциальная утечка мастер-пароля через незащищённые логи.
  • Командная инъекция через subprocess.run при использовании srm.
  • Возможность восстановления файлов при неудачном или неэффективном удалении через srm.
  • Отсутствие валидации загружаемого публичного ключа (можно заменить ключ на поддельный).
  • Ненадёжное шифрование приватного ключа на основе слабого пароля.
  • Потенциальная утечка путей файлов, передаваемых в функцию шифрования или расшифровки.
  • Отсутствие валидации файлов, переданных на расшифровку (можно подменить файлы).
  • Возможность атаки "человек посередине" (MITM) при отсутствии проверки подлинности ключей.
  • Отсутствие аудита или контроля доступа к файлам ключей (их можно скопировать или удалить).
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!