Ответ 1
GHC может вернуть память в ОС, когда она больше не нужна, поэтому просто гашение памяти при выходе не достигнет вашей цели. Сбор мусора - сложный бизнес, но, как правило, нет возможности гарантировать, что старые копии ваших защищенных данных не будут возвращены в пул памяти ОС.
Однако ОС освободит память перед тем, как распределить ее на другой процесс. Если вы не доверяете ОС для обеспечения безопасности своей памяти, у вас возникает гораздо большая проблема.
Я не уверен, что вы подразумеваете под "ненадежностью"; Haskell GC является надежным, но программа имеет сравнительно небольшую видимость того, что происходит.
Однако, если вас интересует только криптографический ключ, а не большая сложная структура данных, тогда жизнь становится немного лучше. Вы можете использовать Foreign Pointer, чтобы указать на ячейку памяти для вашего ключа, а затем сделать гашение этого бита памяти частью вашего финализатора. Вы даже можете записать немного кода, который выделяет блок памяти mlocks, а затем отдает внешние указатели на куски размером с ключом этого памяти по запросу, с финализаторами, которые вытирают ключ. Это, вероятно, сделает то, что вы хотите.
Точка ForeignPtr заключается в том, что она не может быть перемещена или повторно интерпретирована GC.