11

有什么方法可以确保在程序退出后从内存中安全地删除密钥材料?能够手动擦除它并保持程序运行会更好。由于 Haskell 使用自动垃圾收集(如果有大量可用内存,这可能根本不会发生?),我认为第二个任务是不可能的。可以使用 FFI 来实现服务于目的的东西吗?

4

1 回答 1

14

GHC 可以在不再需要内存时将内存返回给操作系统,因此仅在退出时清空内存不会达到您的目标。垃圾收集是一项复杂的业务,但通常无法确保您的安全数据的旧副本不会返回到操作系统内存池。

但是,操作系统会在将您的内存分配给另一个进程之前将其清空。如果您不相信操作系统可以保证您的内存安全,那么您将面临更大的问题。

我不确定您所说的“不可靠”是什么意思;Haskell GC 是可靠的,但该程序对正在发生的事情的可见性相对较低。

但是,如果您只关心加密密钥而不是大而复杂的数据结构,那么生活会变得更好一些。您可以使用外部指针指向您的密钥的内存位置,然后将该位内存消隐到终结器的一部分中。您甚至可以编写一些代码来分配一块内存,将其锁定,然后根据请求将外部指针传递给该内存的键大小块,并使用终结器擦除键。那可能会做你想要的。

ForeignPtr 的要点是保证它不会被 GC 移动或重新解释。

于 2012-08-13T11:06:15.680 回答