Временный файл, который существует только в оперативной памяти?
Я пытаюсь написать шифрование с использованием метода OTP. В соответствии с теориями безопасности мне нужно, чтобы текстовые документы хранились только в памяти и никогда не записывались на физический диск. Мне кажется, что мне нужна команда tmpnam, но, насколько я вижу, она сохраняет файл на диске, а не в ОЗУ.
Используя C++, существует ли какой-либо (независимый от платформы) метод, позволяющий файлу существовать только в оперативной памяти? Я хотел бы избежать использования метода RAM-диска, если это возможно.
Спасибо
Редактировать: Спасибо, для меня это больше просто учеба, я новичок в шифровании и просто работаю с разными методами, на самом деле я не планирую использовать многие из них (особенно OTP из-за удвоения исходного размера файла из-за "подушка").
Если я полностью честен, я пользователь Linux, так что отказ от Windows не будет слишком плохим, сейчас я изучаю использование RAM-дисков, так как FUSE кажется немного излишним для "обучения".
5 ответов
Ответ прост: нет, нет независимого от платформы способа. Даже если данные хранятся только в памяти, они все равно могут быть выгружены менеджером виртуальной памяти на диск.
В Windows вы можете использовать VirtualLock(), чтобы заставить память оставаться в оперативной памяти. Вы также можете использовать CryptProtectMemory(), чтобы другие процессы не могли его прочитать.
В системах POSIX (например, BSD, Linux) вы можете использовать mlock()
заблокировать память в оперативной памяти.
Не совсем, если не считать потоки в памяти (например, stringstream).
Нет, особенно в целях безопасности: любой фрагмент данных может быть перенесен на диск в системах виртуальной памяти.
Как правило, если вы беспокоитесь о безопасности, вы должны использовать платформо-зависимые методы для контроля доступа: что хорошего в том, чтобы хранить ваши данные в оперативной памяти, если каждый может их прочитать?
Возможно, вы захотите взглянуть на исходный код TrueCrypt. Лучше всего получить код на уровне файловой системы.
Используя один из std::stringstream
или же fmemopen
Вы получите файловый доступ к блокам памяти. Если (для безопасности) вы хотите избежать его замены, используйте mlock
который, вероятно, проще всего использовать с fmemopen
чем буфер std::stringstream
, Объединяя mlock
с std::stringstream
вероятно, потребуется сделать через специальный распределитель (используемый в качестве параметра шаблона).
OTP - ужасный метод шифрования для произвольных файлов, если только вы не обладаете огромным количеством энтропии, которое, как вы можете гарантировать, никогда не повторится (поэтому его называют "одноразовым"!)
Если вы хотите создать файловый объект, который существует только в памяти, и вам нет дела до Windows, я бы посмотрел на написание пользовательской файловой системы FUSE ( http://fuse.sourceforge.net/); таким образом вы гарантируете, что будет и не будет записано на диск, а ваши файлы доступны всем программам.