2012-08-13 34 views
11

在程序退出後,有什麼方法可以確保密鑰材料從內存中安全地擦除?能夠手動清除並保持程序運行會更好。正如Haskell使用自動化垃圾收集(如果存在大量可用內存,這可能根本不會發生?),我認爲第二項任務是不可能的。能用FFI實現這個目的嗎?針對冷啓動攻擊:如何限制Haskell中的敏感信息

+1

是的,冷啓動攻擊是如此普遍,你必須擔心它們。您可以使用ST,將數據保存在STRef中並在使用後進行加擾。不知道,如果你可以在STRefs背後記憶。 – 2012-08-13 10:18:25

回答

14

當不再需要GHC時,GHC可以將內存返回給操作系統,因此僅在退出時清空內存無法實現您的目標。垃圾收集是一項複雜的業務,但通常無法確保您的安全數據的舊副本不會返回到操作系統內存池。

但是,操作系統會在將內存分配給其他進程之前將內存留空。如果你不相信操作系統來保證你的內存安全,那麼你就有更大的問題。

我不確定「不可靠」是什麼意思; Haskell GC是可靠的,但該程序對正在發生的事情幾乎沒有察覺。

但是,如果您僅僅關心加密密鑰而不是大的複雜數據結構,那麼生活會變得更好一些。您可以使用Foreign Pointer指向您的密鑰的內存位置,然後將該位內存空置爲您的終結器的一部分。你甚至可以編寫一些代碼來分配一塊內存,然後根據請求將外部指針移交給該內存的密鑰大小的塊,並用終結符擦除密鑰。這可能會做你想做的。

ForeignPtr的一點是它保證不會被GC移動或重新解釋。

+0

感謝您的回答。由於我對所有這些「外來」的東西都不太熟悉,因此我會拭目以待,看看現有代碼的答案是否會出現,如果沒有答案,請接受您的答案。操作系統在將內存交給其他進程之前清除內存在這裏沒有幫助,因爲一次感冒只需拔出插頭並將內存模塊放到另一臺機器上。如果聽起來想要過於安全,請考慮(筆記本電腦)磁盤加密 - 在暫停未使用加密的密鑰材料之前刷新內存是一個不錯的主意。我也澄清了我不願意在原文中依賴自動GC。 – Andres 2012-08-13 11:53:11

+0

ForeignPtr沒有什麼可怕的困難。請參閱http://en.wikibooks.org/wiki/Haskell/FFI獲取教程。 – 2012-08-13 11:56:24

+0

@Andreas不會拉動插頭清空其數據的RAM? – amindfv 2012-08-14 12:38:52