针对冷启动攻击:如何在Haskell中抑制敏感信息

And*_*res 11 security haskell

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

Pau*_*son 14

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

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

我不确定你的意思是"不可靠"; Haskell GC是可靠的,但该程序对正在发生的事情的了解相对较少.

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

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