cod*_*ber 7 android broadcastreceiver android-intent secure-coding
我在一家生产多个应用程序的公司工作,并非所有这些应用程序都具有相同的签名,或者更像是我们暂时拥有至少5-6个应用程序证书.
我们尝试创建一种机制,其中同一设备上的所有公司应用程序共享相同的内容,例如,如果用户从市场App A安装并且未安装应用程序,则会生成新ID,如果现在他安装App A,应用B应该与App A具有相同的ID(id只是生成的UUID类型#4)等...
我们目前正在使用广播,只有获得我们许可的应用才能接收该广播,并通过另一次广播发送回来(这次是明确的).广播和响应受到我们的签名级别的保护,这当然没有帮助,因为我们有多个签名.
我试图编写一个意图广播和恢复,它可以拥有自己的保护机制,不仅限于一个签名,而是几个,问题是像Binder.getSenderUID()这样的东西不能用于广播,我得到了我的自己的uid.看起来我无法获得我的snder的身份,除非他自己在意图中写了他的id,这不是我可以信任的东西,因为它可以很容易伪造.使用加密需要应用程序附带一个密钥,这不再是安全的,转向服务器进行验证需要花费太多时间,并且在移动设备上不能保证成功,因为不是100%确定有网络.
任何人都知道如何从一个应用程序到另一个应用程序获得验证\安全消息?(我的所有应用程序,但可能有不同的签名).
像往常一样,在这里遇到一个具有挑战性的问 回答,所以我不得不自己找到它.
Intents的问题在于,不可能获取发送方,因为它们与发送方地址不重要的网络中的mulicast并行.
如果我希望获得snder的UID,我需要进行"远程"处理,即使他是本地的,而不是使用广播IPC,我需要使用AIDL和IBInder实现.一旦我有一个Binder对象,我可以在我的服务中调用getCallingUid()并获取调用者的uid,这将允许我让PackageManager给我它的公共证书(不询问过程本身,我问操作系统)并比较它是我在apk中提前准备的一组证书.
另一方面的调用应用程序(发送给我ID的另一个进程)只需要使用bindService(service,conn,flags)方法绑定到我.这种方法的缺点是当然是耗时的过程,Bind需要时间,它是通过内核的异步调用,并不像绑定到本地服务那么快.此外,因为我可能有几个应用程序,我需要同步访问我的内部ID,所以只有第一个没有失败的绑定调用将为我设置和ID.我仍然需要检查是否可以使用Messanger方法来防止多线程问题.
希望这有助于其他人.
抱歉迟了回应...
Bind需要时间,更重要的是它是异步的。但是,有一种方法可以进行同步绑定 - 当然假设您尝试联系的服务当时已经启动。Android 对于 BroadcastReceiver(本质上是异步的,因此不能使用普通的 bindService)允许更多这一点,BroadcastReceiver 有一个“peekService”方法。
如果您想在不收听广播的情况下使用它,您可以执行以下操作:
final IBinder[] b = new IBinder[1];
new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
b[0] = peekService(context, intent);
}
}.onReceiver(context, intent);
IMyInterface i = IMyInterface.Stub.asInterface(b[0);
Run Code Online (Sandbox Code Playgroud)
请注意,您不绑定到该服务,因此请确保每次使用时都查看一下。
| 归档时间: |
|
| 查看次数: |
4932 次 |
| 最近记录: |