2

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

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

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

我尝试了什么:我尝试使用双向Messenger通信方案实现 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;
        }
    }
});

这里的想法是,当客户端应用程序向 this 发送消息时Service,它会将其本地“回调”Messenger放入replyTosent 的成员中Message。文件Messenger说明:

注意:下面的实现只是用于执行通信的 Binder 的简单包装器。

所以我认为我可以以某种方式将返回的BinderMessenger#getBinder()映射到 client's UID,但我现在遇到了麻烦:

  1. Messenger#getBinder()返回无法转换为的IBinderBinder
  2. 即使我确实设法获得了对 client's 的引用Binder,该方法Binder#getCallingUid()也是static并且不接受参数......

因此,为了使这个特定的实现安全地工作,我需要找到一种方法来根据客户端创建UID的内容Message或特定的内容来获取调用者。由于Android的Messenger安全架构是围绕.BindersBindersUIDs

额外问题:除了 AIDL,Android 上是否还有其他 IPC 技术可以满足上述要求?

4

2 回答 2

2

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

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

于 2016-01-06T20:40:15.807 回答
-1

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

于 2016-01-12T07:36:53.130 回答