Переработан процесс обработки данных при шифровании и расшифровке, чтобы значительно снизить потребление оперативной памяти и повысить общую безопасность приложения.
Как было
При шифровании больших объектов (например, папки размером 100 МБ), процесс создавал в памяти несколько полных копий данных, которые существовали одновременно.
Архивация в RAM (Копия 1):
Программа считывала папку и создавала в памяти ZIP-архив размером ~100 МБ.
Сжатие (Копия 2):
Создавалась сжатая версия архива, например, ~70 МБ.
При этом исходный архив (Копия 1) оставался в памяти.
100 МБ (Копия 1) + 70 МБ (Копия 2) = ~170 МБ
Шифрование (Копия 3):
Сжатые данные шифровались, создавая еще одну копию в ~70 МБ.
Копии 1 и 2 все еще находились в RAM.
100 МБ + 70 МБ + 70 МБ = ~240 МБ
Формирование итогового пакета (Копия 4):
Зашифрованные данные со служебной информацией упаковывались в финальный пакет.
Пиковое потребление RAM: > 300 МБ
Нагрузка на оперативную память могла в 3-4 раза превышать размер исходного файла.
Кроме того, незашифрованные данные оставались в памяти дольше, чем это было необходимо.
Стало
Как только очередной этап обработки завершен, ненужная копия данных немедленно и безопасно очищается из памяти с помощью функции secure_zero_container, которая перезаписывает данные нулями перед освобождением.
Архивация в RAM (Копия 1):
Создается ZIP-архив на ~100 МБ.
Сжатие (Копия 2):
Программа вызывает функцию сжатия, которая принимает Копию 1 (~100 МБ) и создает Копию 2 (~70 МБ).
В этот переходный момент в памяти находятся обе копии.
Сразу после успешного создания Копии 2, Копия 1 безопасно очищается.
Итоговое потребление после этого шага: ~70 МБ.
Шифрование (Копия 3):
Функция шифрования берет Копию 2 (~70 МБ) и создает зашифрованную Копию 3 (также ~70 МБ).
В этот переходный момент в памяти находятся обе копии.
Пиковое потребление RAM: ~70 МБ (Копия 2) + ~70 МБ (Копия 3) = ~140 МБ.
Сразу после успешного создания Копии 3, Копия 2 безопасно очищается.
Итоговое потребление после этого шага: ~70 МБ.
Формирование итогового пакета (Копия 4):
Программа создает финальный пакет (Копия 4) и копирует в него зашифрованные данные из Копии 3 (~70 МБ) вместе со служебной информацией.
Пик в этот момент: ~70 МБ (Копия 3) + ~70 МБ (Копия 4) = ~140 МБ.
Сразу после этого Копия 3 очищается.
Несмотря на значительную оптимизацию, это не является потоковой обработкой данных.
Программе по-прежнему необходимо полностью загрузить исходный файл или папку (в виде архива) в оперативную память.
Если объем свободной оперативной памяти недостаточен, операция будет прервана с ошибкой нехватки памяти (bad_alloc).
Скачать можно в облаке
disk.yandex.ru/d/pSxwq7mMhKsOwg