将 Java 个程序之间的通信限制为同一用户

Restrict communication between Java programs to same user

我们想构建一个与文件和 URL 关联的 Java 应用程序,但一次只能 运行 一个实例。如果打开第二个文件,它应该由一个已经 运行ning 的实例处理,如果可用的话。 (将其视为文件查看器:用户在浏览器中单击 link 打开应用程序,单击第二个 link 将相同的应用程序带到最前面,并在中打开第二个 URL新观点。)

为此,我的计划是:

我能想到多种实现通信通道的技术,但它们都在本地机器上打开一个端口。很好,但我想确保只有当前用户可以使用此端口。我可能可以防止第二个用户意外地向第一个用户的应用程序发送命令,但是我如何强制一个端口或用于进程间通信的任何东西只对启动第一个应用程序启动的用户可用?

解决方案应尽可能独立于平台。

你可以使用一个lock/pid文件,程序应该检查锁文件是否存在,以查找是否存在一个存在的进程。锁定文件应包含它正在侦听的端口号、服务器密钥和会话密钥。您需要设置文件权限,以便它只能由当前用户读取。发送到初始进程的所有消息都必须包含一个匹配的会话密钥。会话密钥是发起进程具有读取锁文件权限的证明,所以你的开放端口继承了锁文件的权限。

为了安全起见,您需要注意打开端口和写入锁定文件的顺序。您需要确保 在写入锁定文件 之前打开了端口,否则恶意程序可能会超越服务器并接收到它不应该能够读取的消息.此外,第二个进程应该检查锁定文件的所有者,以确保它是由当前用户创建的。此外,在第二个进程开始发送数据之前,您还应该 检查服务器 return 握手中的服务器密钥 ,以确保当前 运行服务器实际上也有读取锁定文件的权限,因为服务器可能早就死了,取而代之的是恶意程序。最后,请确保程序 仅绑定到本地连接,除非您确实想要允许来自网络的请求。

如果这是一个仅 Linux/Unix/Mac 的程序,那么您还有另一种打开 Unix 域套接字的方法。您应该为域套接字设置文件权限,以便当前用户只有 readable/writable。如果您使用域套接字,则不需要会话密钥或所有这些握手的东西,因为域套接字的权限是由域套接字的文件权限强制执行的。