我希望能够将 SecureString (缓存的密码)传递给 C# (.Net 3.5) 中的子进程,但我不知道最安全的方法是什么。例如,如果我要将 SecureString 转换回常规字符串并将其作为命令行参数传递,那么我 思考 该值可能容易发生磁盘分页——这将使明文接触文件系统并破坏使用 SecureString 的意义。

可以改为传递 SecureString 的 IntPtr 吗?我可以使用命名管道而不增加风险吗?

有帮助吗?

解决方案

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

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

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

其他提示

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top