我在一家生产多个应用程序的公司工作,并非所有这些应用程序都具有相同的签名或更像我们暂时至少有 5-6 个应用程序证书。
我们试图创建一种机制,使同一设备上的所有公司应用程序共享相同的内容,
例如,如果用户从市场安装应用程序A并且没有安装应用程序,则会生成一个新的ID,如果现在他安装应用程序A,应用程序B应该具有与应用程序A相同的id(id只是生成的UUID类型#4) ETC...
目前我们正在使用广播,只有获得我们许可的应用程序才能接收该广播并通过另一个广播发回 id(这次是显式的)。
广播和响应受到我们的签名级别许可的保护,这当然没有帮助,因为我们有多个签名。
我尝试编写一个意图广播和恢复,它可以拥有自己的保护机制,该机制不仅限于一个签名,而是多个签名,问题是像 Binder.getSenderUID() 这样的东西不适用于广播,我得到了我的自己的uid。
看来我无法获得我的发件人的身份,除非他自己在意图中写下他的 id,这不是我可以信任的东西,因为它很容易被伪造。
使用加密要求应用程序带有密钥,这再次不安全,转向服务器进行验证需要太多时间,并且在移动设备上不能保证成功,因为不能 100% 确定周围有网络。
任何人都知道如何从一个应用程序到另一个应用程序获取验证\安全消息?(我所有的应用程序,但可能有不同的签名)。
与往常一样,这里有一个具有挑战性的问题,如果有的话,我永远不会得到正确的答案!答案,所以我被迫自己找到它。
意图的问题在于不可能获取发送者,因为它们与网络中的多播并行,其中发送者的地址并不重要。
如果我希望获得 sender 的 UID,即使他是本地的,我也需要创建一个“远程”进程,而不是使用广播 IPC,我需要使用带有 IBInder 实现的 AIDL。
一旦我有了一个 Binder 对象,我就可以在我的服务中调用 getCallingUid() 并获取调用者的 uid,这将允许我要求 PackageManager 给我它的公共证书(不询问进程本身,我询问操作系统)并进行比较它是我在apk中提前准备的一组证书。
另一端的调用应用程序(向我发送其 ID 的另一个进程)只需使用 bindService(service, conn, flags) 方法来绑定到我。
这种方法的缺点当然是耗时的过程,绑定需要时间,它是通过内核的异步调用,并且不如绑定到本地服务那么快。此外,由于我可能有多个应用程序,我需要同步访问我的内部 ID,因此只有第一个未失败的绑定调用才会为我设置 ID。
我仍然需要检查是否可以使用 Messenger 方法来防止多线程问题。
希望这对其他人有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)