7

当我的进程内存将被调出时,我正在尝试保护我的内存数据免受交换文件读取的影响。

我知道 Windows SDK 中的 CryptProtectMemory() 可用于加密内存缓冲区。

我在Linux上找不到任何这样的功能,如果有人知道,请告诉我。

我们可以使用 mlock() 使内存不会被分页,但这是否意味着我的秘密是安全的?

4

2 回答 2

8

Linux中最接近的等价物CryptProtectMemory()libgcrypt。分配的安全内存将被锁定在内存中;将归零并释放它。其他加密库也有类似的调用,例如Botan 中的模板。gcry_malloc_secure()gcry_free()secure_vector

另一种方法确实是在整个缓冲区上使用较低级别的 POSIX 调用mlock() 。不过,将缓冲区归零的负担由您承担。当不再使用缓冲区或程序终止时,您必须手动调用memset() )。

CryptProtectMemory()似乎做的事情与上述两种方法中的任何一种略有不同:它创建一个小的随机会话密钥并使用它来加密缓冲区。好处是您只需要锁定并最终清零密钥所在的非常小的页面,而不是整个缓冲区。如果缓冲区非常大,这可能会有所不同。但是,我们将无法操作或处理缓冲区中的数据。当秘密数据可交换时,还有一个小的时间窗口。

于 2012-08-21T11:31:53.033 回答
1

我想知道加密进程的(部分)内存是否会导致鸡蛋问题。我的意思是,加密/解密感兴趣的内存块的密码应该在内存中的某个地方,在你的进程的地址空间内。如果某些恶意代码可以在运行时访问/检查您的进程地址空间,那么您将无法解决问题(但是您会使观察者的生活更加困难;))

如果您在用户空间中工作,您可以构建一些包装器来使用任何可用的加密库(即 OpenSSL libcrypto)来加密/解密您的变量/内存,我猜。您可以创建某种“安全变量”对象,但请注意某些加密算法需要填充(基类型的大小可能需要相应修改)在内核空间中,您可以使用 LKCF(Linux Kernel Crypto API)

于 2012-08-21T11:01:29.817 回答