当进程内存将被调出时,我试图保护我的内存数据不被交换文件读取。
我知道Windows SDK中的CryptProtectMemory()可用于加密内存缓冲区。
我在Linux上找不到任何此类功能,如果有人知道,请告诉我。
我们可以使用mlock()来使内存不被调出,但这是否意味着我的 secret 是安全的?
最佳答案
在Linux中,最接近CryptProtectMemory()
的等效项是libgcrypt中的 gcry_malloc_secure()
。分配的安全内存将被锁定在内存中; gcry_free()
将对其进行归零和取消分配。其他密码库也有类似的调用,例如Botan中的模板 secure_vector
。
实际上,另一种方法是在整个缓冲区上使用较低级别的POSIX调用mlock()。但是,将缓冲区归零的负担却在您身上。当不再使用缓冲区或程序终止时,必须手动调用memset())。CryptProtectMemory()
似乎与上述两种方法中的任何一种稍有不同:它创建了一个小的随机 session key ,并使用它来加密缓冲区。好处是您只需要锁定并最终仅将 key 所在的非常小的页面(而不是整个缓冲区)清零。如果缓冲区很大,那可能会有所不同。但是,我们将无法操作或处理缓冲区中的数据。可交换 secret 数据的时间窗口也很小。
关于相当于CryptProtectMemory的Linux,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12052942/