有没有什么办法,以确保关键材料被安全地从程序退出后内存中删除? 能够手动删除它,并保持程序的运行会更好。 由于Haskell使用自动垃圾收集(可能根本不会发生,如果有空闲内存的负荷?),我认为第二个任务是不可能的。 东西能服务于目的使用FFI实现?
Answer 1:
GHC可以返回内存OS时不再需要它,所以只是消隐在退出时内存不会实现你的目标。 垃圾收集是一个复杂的业务,但一般没办法保证你的安全数据的旧副本不返回到操作系统内存池。
但是操作系统将空白记忆其分配给另一个进程之前。 如果你不信任操作系统,让您的存储安全的,那么你有一个更大的问题。
我不知道你所说的“不可靠”的意思; 哈斯克尔GC是可靠的,但该方案有什么正在发生的事情比较小的知名度。
但是,如果您使用的是加密密钥,而不是一个大的,复杂的数据结构仅仅关注则生活变得更好一点。 您可以使用外国指针指向你的密钥的存储位置,然后进行消隐的内存位到你finaliser的一部分。 你甚至可以编写一些代码,其分配的内存块, 并且mlocks ,然后递给了外国指针上请求内存的钥匙大小的块,与擦拭关键finalisers。 这可能会做你想要什么。
一个ForeignPtr的一点是,它保证不会被移动或由GC重新演绎。
文章来源: Against cold boot attacks: how to restrain sensitive information in Haskell