我正在尝试使用OTP方法编写加密。为了与安全理论保持一致,我需要将纯文本文档存储在内存中,永远不要写入物理驱动器。 tmpnam命令似乎是我需要的,但从我所看到的它将文件保存在磁盘而不是RAM上。
使用C ++是否有任何(独立于平台的)方法允许文件仅存在于RAM中?我想尽可能避免使用RAM磁盘方法。
由于
编辑: 谢谢,它对我来说更像是一个学习的东西,我是加密的新手,只是通过不同的方法,我实际上并没有计划使用它们中的很多(特别是OTP,因为原来的文件大小加倍因为“垫” “)。
如果我完全诚实,我是一个Linux用户,所以放弃Windows也不会太糟糕,我现在正在考虑使用RAM磁盘,因为FUSE似乎对于“学习”的东西有点过分。< / p>
答案 0 :(得分:11)
简单的答案是:不,没有平台独立的方式。即使只将数据保存在内存中,虚拟内存管理器仍然可能会将数据换成磁盘。
在Windows上,您可以使用 VirtualLock()强制内存保留在RAM中。您还可以使用 CryptProtectMemory()来阻止其他进程读取它。
在POSIX系统(例如BSD,Linux)上,您可以使用mlock()
锁定RAM中的内存。
答案 1 :(得分:5)
除非你计算内存流(比如stringstream),否则不是真的。
没有特别针对安全目的:任何数据都可以交换到虚拟内存系统上的磁盘。
通常,如果您担心安全性,则必须使用特定于平台的方法来控制访问:如果每个人都可以读取数据,那么将数据保存在RAM中有什么用呢?
答案 2 :(得分:3)
您可能需要查看TrueCrypt的源代码。在文件系统级别获取代码可能是您最好的选择。
答案 3 :(得分:1)
OTP对于任意文件来说是一种糟糕的加密方法,除非你有大量的熵你可以保证永远不会重复(这就是为什么它被称为“一次性”!)
如果你想创建一个只存在于内存中并且你不关心Windows的文件类对象,我会考虑编写一个自定义的FUSE文件系统(http://fuse.sourceforge.net/);通过这种方式,您可以保证将要写入磁盘的内容,以及所有程序都可以访问您的文件。
答案 4 :(得分:1)
使用std::stringstream
或fmemopen
中的一个将获得类似文件的内存块访问权限。如果(为安全起见)您希望避免将其换出,请使用mlock
,这可能最容易用于fmemopen
的缓冲区,而不是std::stringstream
。 mlock
与std::stringstream
的组合可能需要通过自定义分配器(用作模板参数)来完成。