在程序退出后,有没有办法确保密钥材料从内存中安全擦除?能够手动擦除并保持程序运行会更好。由于Haskell使用自动垃圾收集(如果有大量可用内存可能根本不会发生?),我认为第二项任务是不可能的。能用这个目的的东西能用FFI来实现吗?
答案 0 :(得分:14)
GHC可以在不再需要时将内存返回给操作系统,因此仅在退出时消隐内存将无法实现目标。垃圾收集是一项复杂的业务,但通常无法确保安全数据的旧副本不会返回到操作系统内存池。
但是,在将内存分配给其他进程之前,操作系统会将内存空白。如果你不相信操作系统以保证你的记忆安全,那么你就会遇到更大的问题。
我不确定你的意思是“不可靠”; Haskell GC是可靠的,但该程序对正在发生的事情的了解相对较少。
但是,如果您只关注加密密钥而不是大而复杂的数据结构,那么生活会变得更好。您可以使用Foreign Pointer指向密钥的内存位置,然后将该位内存消隐到终结器的一部分中。您甚至可以编写一些分配内存块的代码mlocks,然后根据请求将外部指针交给该内存的密钥大小的块,并使用擦除密钥的终结器。这可能会做你想要的。
ForeignPtr的要点是保证GC不会移动或重新解释。