プログラムの終了後にキーマテリアルがメモリから安全に消去されるようにする方法はありますか? 手動で消去してプログラムを実行し続けることができれば、さらに良いでしょう. Haskell は自動化されたガベージ コレクションを使用するため (空きメモリが大量にある場合はまったく発生しない可能性があります)、2 番目のタスクは不可能だと思います。FFIを使用して目的に役立つものを実装できますか?
1 に答える
GHC は不要になったときにメモリを OS に戻すことができるため、終了時に単にメモリを空にするだけでは目的を達成できません。ガベージ コレクションは複雑な作業ですが、一般に、安全なデータの古いコピーが OS メモリ プールに返されないようにする方法はありません。
ただし、OS はメモリを別のプロセスに割り当てる前に空白にします。OSがメモリを安全に保つことを信頼していない場合は、はるかに大きな問題があります.
「信頼できない」とはどういう意味かわかりません。Haskell GC は信頼性がありますが、プログラムは何が起こっているかをほとんど把握できません。
ただし、大きくて複雑なデータ構造ではなく、暗号化キーだけに関心がある場合は、生活が少し良くなります。外部ポインタを使用してキーのメモリ位置をポイントし、そのメモリのビットをファイナライザーの一部にブランクにすることができます。メモリのブロックを割り当て、 mlockし、要求に応じてそのメモリのキー サイズのチャンクへの外部ポインタを渡し、キーをワイプするファイナライザを使用するコードを少し書くこともできます。それはおそらくあなたが望むことをするでしょう。
ForeignPtr のポイントは、GC によって移動または再解釈されないことが保証されていることです。