установите Libsodium, используйте механизмы распределения по #include <sodium.h>
Защищенные выделения кучи
Медленнее, чем malloc () и друзья, им требуется 3 или 4 дополнительных страницы виртуальной памяти.
void *sodium_malloc(size_t size);
Выделите память для хранения конфиденциальных данных, используя sodium_malloc()
и sodium_allocarray()
. Вам нужно будет сначала позвонить sodium_init()
, прежде чем использовать этих охранников кучи.
void *sodium_allocarray(size_t count, size_t size);
Функция sodium_allocarray()
возвращает указатель, из которого можно получить доступ к объектам подсчета, размер которых составляет один байт памяти. Он обеспечивает те же гарантии, что и sodium_malloc()
, но также защищает от арифметических переполнений, когда count * size
превышает SIZE_MAX
.
Эти функции добавляют защитные страницы вокруг защищенных данных, чтобы сделать их менее вероятными в сценарии, напоминающей сердечные приступы.
Кроме того, защита областей памяти, выделенных таким образом, может быть изменена с помощью операций блокировки памяти: sodium_mprotect_noaccess()
, sodium_mprotect_readonly()
и sodium_mprotect_readwrite()
.
После sodium_malloc
вы можете использовать sodium_free()
, чтобы разблокировать и освободить память. На этом этапе вашей реализации рассмотрите возможность обнуления памяти после использования.
обнулить память после использования
void sodium_memzero(void * const pnt, const size_t len);
После использования конфиденциальные данные должны быть перезаписаны, но memset () и рукописный код могут быть незаметно удалены оптимизирующим компилятором или компоновщиком.
Функцияodium_memzero () пытается эффективно обнулить len байтов, начиная с pnt, даже если к коду применяется оптимизация.
блокировка выделения памяти
int sodium_mlock(void * const addr, const size_t len);
Функция sodium_mlock()
блокирует не менее 1 байт памяти, начиная с адреса. Это может помочь избежать передачи конфиденциальных данных на диск.
int sodium_mprotect_noaccess(void *ptr);
Функцияodium_mprotect_noaccess () делает область, выделенную с помощьюodium_malloc () илиodium_allocarray (), недоступной. Его нельзя прочитать или записать, но данные сохраняются. Эта функция может использоваться, чтобы сделать конфиденциальные данные недоступными, за исключением случаев, когда это действительно необходимо для конкретной операции.
int sodium_mprotect_readonly(void *ptr);
Функцияodium_mprotect_readonly () помечает область, выделенную с помощьюodium_malloc () илиodium_allocarray (), только для чтения. Попытка изменить данные приведет к завершению процесса.
int sodium_mprotect_readwrite(void *ptr);
Функция sodium_mprotect_readwrite()
помечает область, выделенную с помощью sodium_malloc()
или sodium_allocarray()
, как читаемую и доступную для записи, после того как она была защищена с помощью sodium_mprotect_readonly()
или sodium_mprotect_noaccess()
.