.NET 3.5,进程间传递字符串的最安全方法是什么?

4
我希望能够在C# (.Net 3.5)中向子进程传递SecureString(缓存的密码),但我不知道最安全的方法是什么。例如,如果我将SecureString转换回普通字符串并将其作为命令行参数传递,那么我认为该值可能容易受到磁盘分页攻击--这会使明文接触文件系统,破坏使用SecureString的目的。
是否可以传递SecureString的IntPtr?我能否使用命名管道而不增加风险?
2个回答

3
一般来说,在关注更多的异类攻击之前,您应该定义您的威胁模型。在这种情况下:您是否担心有人关闭计算机并对硬盘进行取证分析?应用程序内存也可以被交换出去,所以只要一个进程将其存在内存中,就有可能最终出现在交换文件中。休眠呢?在休眠期间,整个内存内容都被写入硬盘(包括SecureString - 及可能的加密密钥!)。如果攻击者在系统运行时可以访问应用程序内存,怎么办?
一般来说,客户端安全性非常棘手,除非您拥有专用硬件(如TPM芯片),否则几乎无法做到完全正确。两种解决方案是:
  • 如果您只需要测试两个字符串之间的相等性(即:这个字符串与我之前那个相同),则仅存储其哈希值(经过盐处理)。
  • 当第二次需要使用信息时,请用户重新输入信息(不太方便,但安全和方便相互矛盾)。

0

除非您的子进程也知道如何使用SecureString,否则我认为没有直接传递它的方法。例如,Process.Start()方法有两个重载,可以使用SecureString,因此最小化了实际字符串值被嗅探的风险(仍然可能发生,因为在某个地方必须检索/取消编组实际值)。

我认为如何做到这一点很大程度上取决于子进程是什么以及如何启动它。


Scott,子进程是我编写的另一个 .Net 3.5 程序,因此该选项可使用几乎任何机制。对于 Process.Start() 的 SecureString 参数似乎是用于在以另一个用户身份启动进程时的密码。它不会被传递或者进程本身无法访问它,它会被操作系统用于登录到备用用户帐户。 - Chris Wenham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接