Против холодных ботинок: как удержать конфиденциальную информацию в Haskell

Есть ли способ обеспечить безопасное удаление ключевого материала из памяти после выхода программы? Возможность стереть его вручную и сохранить работу программы будет еще лучше. Поскольку Haskell использует автоматическую сборку мусора (что может вообще не произойти, если есть множество свободной памяти?), Я предполагаю, что вторая задача невозможна. Может ли что-то, что служит цели, быть реализовано с использованием FFI?

Ответ 1

GHC может вернуть память в ОС, когда она больше не нужна, поэтому просто гашение памяти при выходе не достигнет вашей цели. Сбор мусора - сложный бизнес, но, как правило, нет возможности гарантировать, что старые копии ваших защищенных данных не будут возвращены в пул памяти ОС.

Однако ОС освободит память перед тем, как распределить ее на другой процесс. Если вы не доверяете ОС для обеспечения безопасности своей памяти, у вас возникает гораздо большая проблема.

Я не уверен, что вы подразумеваете под "ненадежностью"; Haskell GC является надежным, но программа имеет сравнительно небольшую видимость того, что происходит.

Однако, если вас интересует только криптографический ключ, а не большая сложная структура данных, тогда жизнь становится немного лучше. Вы можете использовать Foreign Pointer, чтобы указать на ячейку памяти для вашего ключа, а затем сделать гашение этого бита памяти частью вашего финализатора. Вы даже можете записать немного кода, который выделяет блок памяти mlocks, а затем отдает внешние указатели на куски размером с ключом этого памяти по запросу, с финализаторами, которые вытирают ключ. Это, вероятно, сделает то, что вы хотите.

Точка ForeignPtr заключается в том, что она не может быть перемещена или повторно интерпретирована GC.