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