.Net 3.5,在进程之间传递字符串的最安全方式

时间:2008-09-05 19:30:43

标签: .net security .net-3.5 ipc

我希望能够将SecureString(缓存的密码)传递给C#(.Net 3.5)中的子进程,但我不知道最安全的方法是什么。例如,如果我将SecureString转换回常规字符串并将其作为命令行参数传递,那么我认为该值可能倾向于磁盘分页 - 这将使明文成为明文触摸文件系统,破坏了使用SecureString的目的。

是否可以传递SecureString的IntPtr?我可以在不增加风险的情况下使用命名管道吗?

2 个答案:

答案 0 :(得分:3)

一般来说,您应该在担心更多异国情调的攻击之前定义您的威胁模型。在这种情况下:您是否担心有人关闭计算机并对硬盘进行取证分析?应用程序内存也可以换出,因此一个进程在内存中具有它的简单事实使得它有可能以交换文件结束。冬眠怎么样?在休眠期间,内存的整个内容都会写入硬盘(包括SecureString - 可能是加密密钥!)。如果攻击者在运行时可以访问系统并可以搜索应用程序内存,该怎么办?

一般来说,客户端安全性非常棘手,除非你有专用硬件(比如TPM芯片),否则几乎不可能做到正确。两种解决方案是:

  • 如果你只需要测试两个字符串之间的相等性(即:这个字符串与我之前的字符串相同),只存储它的(盐渍)哈希值。
  • 让用户在第二次需要时重新输入信息(不太方便,但安全性和便利性相互对立)

答案 1 :(得分:0)

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

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