所以我的问题很直接:
为了在内存中安全地存储密码哪个更好(即更安全、更难绕过、性能较低、更兼容不同的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也允许将数量非常有限的页面锁定到内存中,但我对此并不确定。