我希望能够将 SecureString(缓存的密码)传递给 C#(.Net 3.5)中的子进程,但我不知道最安全的方法是什么。例如,如果我将 SecureString 转换回常规字符串并将其作为命令行参数传递,那么我认为该值可能容易出现磁盘分页——这会使明文接触文件系统并破坏要点使用 SecureString。
可以改为传递 SecureString 的 IntPtr 吗?我可以在不增加风险的情况下使用命名管道吗?
一般来说,您应该在担心更多外来攻击之前定义您的威胁模型。在这种情况下:您是否担心有人关闭计算机并对硬盘进行取证分析?应用程序内存也可以被换出,因此一个进程在内存中拥有它这一简单事实,使得它有可能在交换文件中结束。冬眠呢?在休眠期间,内存的全部内容被写入硬盘(包括 SecureString - 并且可能是加密密钥!)。如果攻击者可以在系统运行时访问系统并且可以搜索应用程序的内存怎么办?
一般来说,客户端安全性非常棘手,除非您有专用硬件(如 TPM 芯片),否则几乎不可能做到正确。两种解决方案是:
除非您的子进程也了解如何使用 SecureString,否则我认为没有办法直接传递它。例如, Process.Start() 方法有两个采用 SecureString 的重载,因此将实际字符串值被嗅探的风险降到最低(它仍然可能,因为在必须检索/解组实际值的过程中的某个地方)。
我认为很多如何做到这一点将取决于子进程是什么以及它是如何启动的。