如何在 Windows 中的进程之间传输敏感数据?

Posted

技术标签:

【中文标题】如何在 Windows 中的进程之间传输敏感数据?【英文标题】:How to transfer sensitive data between processes in Windows? 【发布时间】:2009-06-11 20:07:20 【问题描述】:

我想将用户名和密码信息从一个进程传输到 Windows 中同一服务器上运行的另一个进程。以安全方式实现此传输的最佳方法是什么?一种简单的方法是将密码复制到文件中,然后让其他进程从文件中读取,然后在读取文件后将其删除。虽然这很简单,但我担心它是否安全,因为即使它只存在很短的时间,某人仍然有可能访问该文件并且如果另一个文件也有可能被遗漏处理错误或崩溃。像套接字和命名管道这样的 IPC 似乎是解决这个问题的过度杀伤力。我更倾向于使用内存映射文件,如下面的链接中所述,该链接讨论了跨进程共享内存。这是正确的方法吗?此外,在释放/擦除之前用虚拟数据填充内存是否是个好主意,以防止 rouge 进程从该内存位置清除数据?

http://msdn.microsoft.com/en-us/library/aa366551(VS.85).aspx

【问题讨论】:

您的首要任务应该是确保您正在加密您的数据。然后研究如何在进程之间传递。假设无论您使用什么方法跨进程传递数据,有人都能找到数据。 如果我选择数据加密,我最终会对密钥管理感到头疼。你不觉得对于这么简单的任务来说这是一个很大的矫枉过正吗? 【参考方案1】:

RPC 是你的朋友(我不会使用命名管道来传输安全数据,因为它们存在一些严重的问题(因为它们在全局命名空间中运行,因此容易受到抢注攻击)。

由于数据不是通过网络传输的,因此加密并不像某些人所描述的那么重要。而是让一个进程实现一个 RPC 服务器并让另一端绑定到该服务器,发出带有凭据的 RPC 调用并销毁绑定句柄 - 这应该会破坏中间数据结构。

不要忘记在使用完内存后将其安全地清零(否则它可能会被持久化到磁盘上)。

如果您确实想使用加密,请使用 CryptProtectMemory,它将以可用于 IPC 的方式加密数据。

【讨论】:

当然。不要使用命名管道或内存映射文件。使用这两种技术中的任何一种,您都可能会引入比您尝试缓解的技术更严重的漏洞。 查询:RPC如何避免命名抢注问题? 如果您绑定到静态端点 (ncalrpc:\\myapp) 您会遇到蹲坐问题,但如果您绑定到动态端点则不会(您需要小心一点,但有可能)。 Windows 的安全组件也使用 LPC(本地进程间通信)blogs.msdn.com/b/ntdebugging/archive/2007/07/26/… CryptProtectMemory 看起来很有趣...在其他平台上是否有类似的功能?【参考方案2】:

使用一些 IPC,(1) 不支持到磁盘,(2) 支持 ACL。

这似乎表示命名管道。

另外,DCOM 和 WCF 都支持内容加密。

【讨论】:

知道命名管道、wcf 和 DCOM 是完成如此简单任务的唯一选项真的很可怕。我仍然支持内存映射。对此有什么想法吗? @msvcyc:首先,安全性从来都不是简单的,其次是基于我所看到的那些标准。还有其他选项(例如 SSL),但这意味着实现您自己的访问控制。

以上是关于如何在 Windows 中的进程之间传输敏感数据?的主要内容,如果未能解决你的问题,请参考以下文章

命名 FIFO 是不是安全以防止普通用户看到敏感数据?

Linux 和 Windows 进程之间的 IPC

Windows进程间通信(下)

fork子进程之间传输信息的方法(包含子进程与子进程之间区分的问题的解决)

Windows Socket编程精华《TCP通信服务器》

通过 Windows 中的常规文件传输 1-2 兆字节的数据 - 是不是比通过 RAM 慢?