Android:AIDL 的安全 IPC 替代品?

Android: secure IPC alternative to AIDL?

我正在尝试做的事情: 在设备上安装的两个应用程序之间实施轻量级、安全 IPC 协议。客户端应用程序应该能够在服务应用程序中向 Service 运行 发送命令和查询,并接收返回的计算结果。

应用关系:两个应用的源代码都在我的控制之下,但应用会有不同的签名(不可协商)。

安全要求:服务应用程序应向单个客户端提供服务。客户端的应用程序 ID(程序包名称)是已知的且不变的。

我的尝试: 我尝试用双向 Messenger 通信方案(类似于 this blog post)实现 IPC。这种方法很好,但我遇到了一个主要问题——我找不到一种方法来获取客户端的 UID,因此我无法满足安全要求。

考虑在服务应用程序的 Service 中找到的代码:

// This messenger will be used by the clients of this service in order to send commands
private Messenger inboxMessenger = new Messenger(new Handler() {

    @Override
    public void handleMessage(Message msg)

        // TODO: verify the identity of the client

        switch (msg.what) {
            case MSG_GET_DATA:
                returnDataToClient(msg.replyTo);
                break;
        }
    }
});

这里的想法是,当客户端应用程序向此 Service 发送消息时,它会将其本地 "callback" Messenger 放入发送的 replyTo 成员 MessageMessenger 的文档指出:

Note: the implementation underneath is just a simple wrapper around a Binder that is used to perform the communication.

所以我想我可以通过某种方式将 Messenger#getBinder() 返回的 Binder 映射到客户的 UID,但我现在遇到了麻烦:

  1. Messenger#getBinder() returns IBinder 无法转换为 Binder
  2. 即使我设法获得对客户 Binder 的引用,方法 Binder#getCallingUid()static 并且不接受参数...

因此,为了使这个特定的实现安全地工作,我需要找到一种方法来根据 Message 的内容或基于特定的 Messenger 来获取调用者的 UID ] 由客户创建。由于 Android 的安全架构是围绕 Binders 构建的,因此没有直接的方法将 Binders 映射到 UIDs(或包名称)似乎很奇怪......所以,我该怎么做?

加分问题:除了 AIDL,Android 上还有其他 IPC 技术可以满足上述要求吗?

经过一些研究和实验,我得出结论,Android 在安全、签名保护通信方面无法提供 AIDL 的替代方案。

好消息是 AIDL 并不难实现,关于这个特定主题的官方教程一点也不差。

您可以在服务器端检查客户端的签名,以确保它是合格的。