相当于CryptProtectMemory的Linux

时间:2012-08-21 10:26:56

标签: linux encryption

当我的进程内存被分页时,我正在尝试保护我的内存中数据以防止交换文件读取。

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

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

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

2 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:1)

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

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