Windows内存保护:VirtualProtect与CryptProtectMemory



所以我的问题很直接:

为了在内存中安全地存储密码哪个更好(即更安全、更难绕过、性能较低、更兼容不同的Windows版本等(:VirtualProtect(带PAGE_NOACCESS(或CryptProtectMemory(带CRYPTPROTECTMEMORY_SAME_PROCESS(或两者的组合?

在实现方面,VirtualProtect只能保护内存中的整个页面(4096字节的倍数(,而CryptProtectMemory可以保护CRYPTPROTECTMEMORY_BLOCK_SIZE的倍数(16字节(。因此CryptProtectMemory的开销较小。

是否有我不知道的安全考虑因素需要考虑?我知道PAGE_NOACCESS限制可能会被另一个使用VirtualProtectEx的恶意进程解除。那么CryptProtectMemory呢?

(我已经实现了两者,所以如果有帮助的话,我可以添加代码(

CryptProtectMemory比VirtualProtect做得更多。例如,想想已经被分页到磁盘上的内存。如果您只使用VirtualProtect,那么(假设页面未锁定(内存中的任何内容都将被写入磁盘。CryptProtectMemory实际上对内存进行加密,而不仅仅是更改修改CPU允许发生的事情的位。从这个意义上说,我希望VirtualProtect花费更少的时间,但实际上,密码使用频率太低,效率肯定会低于安全问题。

现在,操作系统通常不允许直接读取页面文件,但有一些方法可以解决这个问题。但老实说,如果你必须担心到那种程度的安全性(防止内存被调出,然后切断机器电源,磁盘被插入其他系统(,那么你真的无能为力。就安全性而言,对系统的物理控制几乎就是游戏-毕竟,即使CryptProtectMemory的注释说,如果你真的要使用密码,密码必须在某个时候解密。

最好的办法是将明文密码保存尽可能短的时间,只将解密后的密码存储在锁定的页面中,即不受分页限制的页面。我认为即使没有SE_LOCK_memory_NAME权限,Windows也允许将数量非常有限的页面锁定到内存中,但我对此并不确定。

相关内容

  • 没有找到相关文章