我将收到用户名和密码并将其存储在结构中。
我可以做些什么来防止有人查看我的进程的内存并查看用户的用户名/密码?
我的第一个想法是在内存中加密用户名和密码,并在我完成后将其归零。但是我必须在内存中的某个地方存储一个可以检索的密钥。
好吧,这将使恢复凭据变得非常困难,但仍有可能。
还有比这更安全的方法吗?
查看数据保护 API。它被 Windows 组件以及第三方软件用于这种场景,并且基本上为您处理加密和密钥管理。
密钥与当前用户的密码相关联,但您可以提供“可选熵”,这实际上是额外密钥材料的每个操作源,例如,可能从用户输入的密码中派生,以保护服务凭证。
至于“有没有比这更安全的方法”,我认为您需要准确定义您要防范的威胁级别。对于同一台机器上的其他(非管理员)用户,DPAPI以及您已经提到的安全归零明文之类的东西可能非常好。对于在同一登录会话中运行的恶意软件,几乎没有什么帮助。
最简单的解决方案是将密码分散在内存中。不要将其存储为字符串。声明一组字节变量并将密码分散在其中。这不会使密码无法恢复,但会使它变得困难......攻击者需要访问计算机和您的源(或反向工程您的二进制文件)以发现密码位的存储方式和位置。
如果攻击者可以访问您的系统和您的源代码,或者能够反转您的二进制文件,那么您最好将密码通过电子邮件发送给他。
在您的场景中,更有可能的攻击角度是在传递给服务的过程中获取密码,而不是尝试从内存中组装密码。
编辑:如果您想显着增加收集密码的难度,您也可以使用动态内存分配来防止位在内存中具有固定位置。但是,老实说,这有点矫枉过正......当您将密码传递给服务时,攻击者很容易抓住密码。
使用良好的函数(例如 SHA1/2)对密码进行哈希处理并存储摘要。当您想根据存储的密码检查密码时,对输入进行哈希处理并将结果与存储的密码进行比较。
密码散列函数的基本特性是它是一个单向函数:计算逆函数非常困难。这就是在您的情况下使用这些功能的原因。