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

Posted

技术标签:

【中文标题】.Net 3.5,在进程之间传递字符串的最安全方式【英文标题】:.Net 3.5, most secure way to pass string between processes 【发布时间】:2008-09-05 19:30:43 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

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

以上是关于.Net 3.5,在进程之间传递字符串的最安全方式的主要内容,如果未能解决你的问题,请参考以下文章

Java 和 .NET 3.5 之间进程间通信的最佳方法是啥?

在 python 进程之间传递二进制数据

c#进程之间对象传递方法

列举ASP.NET 页面之间传递值的几种方式?

将授权用户从Laravel后端传递到React前端的最安全方式

通过多步骤表格传递信用卡号的最安全方法?