2009-02-15 27 views
2

我正在嘗試使用OTP方法編寫encrpytion。爲了與安全理論保持一致,我需要將純文本文檔存儲在內存中,永遠不會寫入物理驅動器。 tmpnam命令似乎是我需要的,但從我所能看到的它將文件保存在磁盤上而不是RAM中。僅存在於RAM中的臨時文件?

使用C++是否有任何(獨立於平臺)方法,允許文件只存在於RAM中?如果可能,我想避免使用RAM磁盤方法。

感謝

編輯: 謝謝,它更多的只是一個學習的事情對我來說,我是新來的加密,只是通過不同的方式工作,我真的不打算使用其中許多(esspecially OTP由於「pad」導致原始文件大小加倍)。

如果我完全誠實,我是一個Linux用戶,所以放棄Windows不會太壞,我現在正在研究使用RAM磁盤,因爲FUSE似乎對於「學習」的東西有點矯枉過正。

回答

11

簡單的答案是:不,沒有平臺獨立的方式。即使只將數據保存在內存中,它仍然有被虛擬內存管理器交換到磁盤的風險。

在Windows上,您可以使用VirtualLock()強制內存保留在RAM中。您還可以使用CryptProtectMemory()來防止其他進程讀取它。

在POSIX系統(例如BSD,Linux)上,您可以使用mlock()將內存鎖定在RAM中。

5

除非您計算內存中的流(比如stringstream),否則不是真的。

沒有特別的和特別的安全目的:任何一塊數據都可以在虛擬內存系統上交換到磁盤。

一般來說,如果您擔心安全問題,則必須使用特定於平臺的方法來控制訪問:如果每個人都可以讀取數據,那麼將數據保存在RAM中有什麼好處?

1

OTP是任意文件一個可怕的加密方法,除非你有熵的巨量,你可以保證從不重複自己(這就是爲什麼它被稱爲「一次性」!)

如果你想要創建一個只存在於內存中的文件類對象,並且您不關心Windows,我會考慮編寫一個定製的FUSE文件系統(http://fuse.sourceforge.net/);這樣你可以保證什麼會寫入磁盤,並且所有程序都可以訪問你的文件。

3

你可能想看看TrueCrypt的源代碼。在文件系統級別獲取代碼可能是您最好的選擇。

+0

這是一個非常好的建議:TrueCrypt是一個神話般的工作。 – Fortyrunner 2009-02-15 22:45:54

1

使用std::stringstreamfmemopen之一會讓您像文件一樣訪問內存塊。如果(爲了安全起見)您要避免將其換出,請使用mlock,這可能最容易與fmemopen的緩衝區一起使用,而不是std::stringstream。組合mlockstd::stringstream可能需要通過自定義分配器(用作模板參數)完成。