5

我正在尝试使用 OTP 方法编写加密。为了与安全理论保持一致,我需要将纯文本文档仅存储在内存中,并且永远不会写入物理驱动器。tmpnam 命令似乎是我所需要的,但据我所知,它将文件保存在磁盘上而不是 RAM 上。

使用 C++ 是否有任何(平台无关)方法允许文件仅存在于 RAM 中?如果可能,我想避免使用 RAM 磁盘方法。

谢谢

编辑:谢谢,这对我来说只是一个学习的东西,我是加密新手,只是通过不同的方法工作,我实际上并不打算使用其中的许多方法(尤其是 OTP,因为原始文件大小增加了一倍,因为“软垫”)。

如果我完全诚实,我是一个 Linux 用户,所以放弃 Windows 并不会太糟糕,我现在正在考虑使用 RAM 磁盘,因为 FUSE 对于“学习”的东西来说似乎有点矫枉过正。

4

5 回答 5

12

简单的答案是:不,没有平台独立的方式。即使只将数据保存在内存中,它仍然存在被虚拟内存管理器交换到磁盘的风险。

在 Windows 上,您可以使用VirtualLock()强制内存留在 RAM 中。您还可以使用CryptProtectMemory()来防止其他进程读取它。

在 POSIX 系统(例如 BSD、Linux)上,您可以使用mlock()将内存锁定在 RAM 中。

于 2009-02-15T21:21:29.860 回答
5

除非您计算内存中的流(如字符串流),否则不是真的。

没有特别是出于安全目的:任何数据都可以交换到虚拟内存系统上的磁盘。

通常,如果您担心安全性,则必须使用特定于平台的方法来控制访问:如果每个人都可以读取数据,那么将数据保存在 RAM 中有什么好处?

于 2009-02-15T21:16:26.643 回答
3

您可能想查看TrueCrypt的源代码。在文件系统级别获取代码可能是您最好的选择。

于 2009-02-15T21:26:21.270 回答
1

OTP 对任意文件来说是一种糟糕的加密方法,除非您拥有大量可以保证永远不会重复的熵(这就是它被称为“一次性”的原因!)

如果你想创建一个只存在于内存中的类文件对象并且你不关心 Windows,我会考虑编写一个自定义 FUSE 文件系统(http://fuse.sourceforge.net/);通过这种方式,您可以保证哪些内容会写入磁盘,哪些不会写入磁盘,并且所有程序都可以访问您的文件。

于 2009-02-15T21:16:52.947 回答
1

使用其中一个std::stringstreamorfmemopen将使您能够像文件一样访问内存块。如果(为了安全)你想避免它被换出,使用mlock可能最容易与fmemopen' 缓冲区一起使用而不是std::stringstream. 结合可能需要mlock通过std::stringstream自定义分配器(用作模板参数)来完成。

于 2009-02-16T00:10:26.383 回答