Иногда в целях безопасности нам нужно обнулить память, чтобы предотвратить непреднамеренный доступ к конфиденциальным данным, например, чтобы безопасно удалить ключ после шифрования некоторых данных. Большинство людей предлагают сделать это, чтобы записать случайные данные в массив, содержащий конфиденциальную информацию, потому что это не может быть оптимизировано компилятором. Понятно, что наивное использование таких функций, как memset
, может быть оптимизировано оптимизирующим компилятором благодаря правилу «как будто», если это последняя операция, выполняемая с данными до того, как они выйдут из области видимости. Однако получение и запись случайных данных идет медленно, и я, возможно, нашел решение. Я хочу получить экспертное заключение, прежде чем развертывать его в рабочем коде.
Хропирование чего-либо с самим собой, по самой природе оператора, всегда приводит к нулевому значению, и это очень быстро. Обход блока памяти и его ксерокопирование сами по себе, кажется, очень эффективным решением проблемы обнуления, но я боюсь, что его можно оптимизировать с помощью достаточно хорошего оптимизирующего компилятора. Он кроссплатформенный и переносимый, и не требует использования стандартной библиотеки, за исключением использования типа данных size_t
. Я включил справочную реализацию того, что я имею в виду ниже. В нем есть функция с именем nuke
, которая принимает указатель data_to_zero
и итеративно size
байтов xor с самим собой.
void nuke (void *data_to_zero, size_t size)
{
size_t i;
for (i = 0; i < size; i++) {
((unsigned char*)data_to_zero)[i] ^= ((unsigned char*)data_to_zero)[i];
}
}
Эта реализация довольно медленная, но значительно быстрее, чем получение достаточно случайных данных и запись их в data
. После оптимизации он работает быстрее, чем memset
реализации, к которым у меня есть доступ в любом случае, что удивительно.
Я еще не изучил ассемблер, но вывод сборки после оптимизации с использованием GCC и Clang на уровне O2 и O3 на 64-битном процессоре x86 содержит инструкцию xorl
где-то в коде, иногда дважды. Это указывает мне на то, что ксерокопирование памяти действительно происходит, но я хотел бы, чтобы кто-то, кто знает, о чем они говорят, подтвердил.
Это жизнеспособное решение?