我在同一台机器上有一些应用程序组件,但需要通信的语言不同。我正在使用 localhost 上的套接字通信来做到这一点。传输的数据是机密的。
这种通信是否应该加密?
我的意思是攻击者必须能够在机器上运行代码才能拦截它,在这种情况下用户无论如何都会丢失,对吧?
我在同一台机器上有一些应用程序组件,但需要通信的语言不同。我正在使用 localhost 上的套接字通信来做到这一点。传输的数据是机密的。
这种通信是否应该加密?
我的意思是攻击者必须能够在机器上运行代码才能拦截它,在这种情况下用户无论如何都会丢失,对吧?
您需要加密来阻止被动攻击者(监视线路并试图计算出数据内容的邪恶人员),并需要完整性(及其同级身份验证)来阻止在传输过程中更改数据的主动攻击者。SSL 两者都提供。但是,这仅在攻击者可以实际监视或更改传输中的数据的情况下才有意义。对于同一台机器上的两个进程,通过“localhost”网络进行通信,可以做到这一点的攻击者通常“已经获胜”。
细节可能因操作系统而异。但是,您的安全性通常取决于操作系统,而不是加密。例如,考虑一个有多个用户的 Unix 系统。如果您的两个进程相互通信,则其他用户的进程无法窥探数据交换(除非攻击者是root
,然后他可以做任何事情);但是,他们可能会尝试模拟:在某些时候,您的一个组件必须连接到另一个组件,而 TCP 套接字的集合点是一个端口号。可以在机器上运行自己的代码(作为普通用户)的攻击者可能会维护一个假服务器,该服务器将接收连接请求以代替预期的组件。为了防止这种情况,客户端必须确保它与预期的服务器对话(反之亦然):可以使用 SSL 完成,但存在更好的解决方案(在这种情况下,使用具有受系统访问权限和/或保护的路径的 Unix 域套接字getpeereid()
)。
如果在您的情况下,本地机器被认为是“干净的”(机器上没有以任何身份运行恶意代码),那么与 localhost 的连接是安全的,不需要任何额外的保护。如果可能在机器上运行潜在的敌对但非特权代码(这是“共享多用户机器”模型,这是 1980 年代后期 Unix 系统的典型),那么您应该使用操作系统功能来确保确实传达了连接到正确的进程(即到以预期身份运行的进程)。SSL 将是矫枉过正。
那么,如果这两个程序都在本地主机上运行,为什么要使用网络通信呢?您可以使用任何 IPC(进程间通信),例如命名管道 您可以在调用 CreateNamedPipe 函数时为命名管道指定安全描述符。安全描述符控制对命名管道的客户端和服务器端的访问。
阅读访问控制模型以了解如何保护命名管道。 http://msdn.microsoft.com/en-us/library/windows/desktop/aa374876(v=vs.85).aspx 或者您可以简单地使用两个进程都知道秘密的对称加密算法,您可能会将秘密硬编码到代码中。
如果我理解正确,潜在威胁来自恶意进程(在本地运行)进入本地运行的同一应用程序的两个组件中间并通过 IPC 相互交互。事实上,这是一个被忽视的威胁模型,即使在密码管理器等安全关键软件中,像机器人 (MitMa)这样的欺骗本地攻击者也是一个真正的威胁。密码管理器将桌面应用程序作为一个组件,将浏览器扩展作为另一个组件,作为本地服务器和客户端运行。我认为 OP 的架构反映了类似的东西。
OP没有提到底层操作系统。IPC 的选择取决于底层操作系统、其对安全功能的支持或特定的 IPC 方法。因此,除了网络套接字(用于本地通信)之外,没有一个 IPC 适合所有概念。
在我看来,IPC 应该与网络通信一样谨慎对待。因此,如果要使用网络套接字,则很容易使用基于 TLS/SSL 的方法,就像它们在实际网络通信中所做的那样,以保护 IPC 通信可能很诱人。但是,请记住以下几点:
正如@Tom Leek 指出的那样,使用基于 TLS/SSL 的方法是不值得的。尽管它们为您的 IPC 组件提供了安全性,但必要的基础设施(包括证书颁发机构)可能是矫枉过正。这里的目标只是IP通道的两端(同一软件的两个进程或组件)的授权,而不是将它们绑定到强身份。
对于其他 OS 和 IPC 方法,需要考虑以下几点:
FILE_CREATE_PIPE_INSTANCE
和FILE_FLAG_FIRST_PIPE_INSTANCE
标志。前者确保如果已存在同名命名管道的实例,则只有FILE_CREATE_PIPE_INSTANCE
有权访问管道对象的进程才能创建新实例。另一方面,后者确保它正在创建第一个实例。