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

时间:2020-03-05 18:48:29  来源:igfitidea点击:

我希望能够将SecureString(缓存的密码短语)传递给C(.Net 3.5)中的子进程,但是我不知道最安全的方法是这样做。例如,如果我将SecureString转换回常规字符串并将其作为命令行参数传递,那么我认为该值可能易于进行磁盘分页-这将使纯文本接触文件系统并破坏这一点。使用SecureString的过程。

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

解决方案

回答

除非子进程也了解如何使用SecureString,否则我认为没有办法直接传递它。例如,Process.Start()方法有两个采用SecureString的重载,因此将嗅探实际字符串值的风险降到了最低(由于在沿途必须检索/取消整理实际值的某个位置,所以仍然有可能)。

我认为很多方法将取决于子进程是什么以及如何启动子进程。

回答

通常,在担心更多外来攻击之前,应先定义威胁模型。在这种情况下:我们是否担心有人关闭计算机并对硬盘进行了取证分析?应用程序内存也可以换出,因此一个进程将其存入内存这一简单事实使得它有可能在交换文件中结束。冬眠呢?休眠期间,内存的全部内容都将写入硬盘(包括SecureString以及大概的加密密钥!)。如果攻击者在系统运行时可以访问系统并且可以在应用程序的内存中进行搜索,该怎么办?

通常,客户端的安全性非常棘手,除非我们拥有专用的硬件(例如TPM芯片),否则几乎不可能做到正确。两种解决方案是:

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