Android IPC和ContentProvider的差异

Android IPC和ContentProvider的差异,android,ipc,android-contentprovider,Android,Ipc,Android Contentprovider,我正在尝试决定将手机上存储的加密内容公开给第三方应用程序的最佳方法。内容是敏感的,需要加以保护,因此只有某些应用程序才能访问此内容。我正在研究的方法是IPC和内容提供商。以下是我认为在我的情况下,赞成和反对的观点 IPC-Pro的 灵活的客户端响应类型。可以返回不同的错误代码和受限访问级别 IPC-Con的 实现起来比内容提供者更复杂 必须编写自己的方式来确保对内容的访问 内容提供商-专业版 易于实现 通过设置提供程序定义权限:protectionLevel=signature,轻松保

我正在尝试决定将手机上存储的加密内容公开给第三方应用程序的最佳方法。内容是敏感的,需要加以保护,因此只有某些应用程序才能访问此内容。我正在研究的方法是IPC和内容提供商。以下是我认为在我的情况下,赞成和反对的观点

IPC-Pro的

  • 灵活的客户端响应类型。可以返回不同的错误代码和受限访问级别
IPC-Con的

  • 实现起来比内容提供者更复杂

  • 必须编写自己的方式来确保对内容的访问

内容提供商-专业版

  • 易于实现

  • 通过设置提供程序定义权限:protectionLevel=signature,轻松保护访问安全

内容提供商-Con的

  • 为了确保访问安全,内容提供商的密钥签名必须与第三方应用程序共享,这并不理想

  • 返回的结果类型灵活性有限。内容提供程序仅为查询的列返回游标对象


在性能和电池方面是否存在重大差异?
是否可以异步执行?
对列表还有其他意见/建议吗?

通过设置提供程序定义权限:protectionLevel=signature,轻松保护访问安全

只有当您是唯一一家使用内容提供商的公司时,这才有效

为了确保访问安全,内容提供商的密钥签名必须与第三方应用程序共享,这并不理想

我更愿意将其描述为“可能符合‘精神错乱’的医学定义”。您的第三方将能够修改您的“安全”数据,伪造您发布的应用程序,将您的签名密钥泄露给恶意软件作者,等等

内容提供程序仅为查询的列返回游标对象

除了基于
光标的内容提供程序API之外,您还可以使用基于文件的内容提供程序API,也可以使用基于
光标的内容提供程序API。请参阅
ContentResolver
上的方法,如
openInputStream()

在性能和电池方面是否存在重大差异

不特别是

是否可以异步执行

两者都可以,不过我个人觉得使用服务更容易一些

对清单还有其他意见/建议吗


权限同样适用于服务和内容提供商,但我想再次强调,您不应该与第三方共享您的签名密钥,除非是在枪口下。

我无法回答您的全部问题,但我可以解决密钥共享部分。 您的APK使用公钥/私钥对的公钥部分进行签名。可能会将您的公钥附加到另一个应用程序以假装是您的应用程序,但需要有人拥有您的私钥才能使用您的公钥以您的名义上载应用程序

公钥证书,也称为数字证书或 身份证书,包含公钥/私钥的公钥 以及其他一些标识密钥所有者的元数据 (例如,名称和位置)。证书的所有者持有 相应的私钥

对APK进行签名时,签名工具会将公钥证书附加到APK。公钥证书用作 将APK与您和您的客户唯一关联的“指纹” 相应的私钥。这有助于Android确保任何未来 您的APK更新是真实的,并且来自原始作者。”

(来自)

另外,我的理解是,其他应用程序与您的应用程序共享密钥,而不是相反。如果可以使用其他设置之一,则也不需要签名级别保护。根据需要,您可以选择将应用程序设置为4种不同的保护级别之一。大多数应用程序不包含足够敏感的数据,因此不需要“危险”设置,所以正常可能适用于大多数应用程序


此外,应用程序的签名(公钥)已通过PackageManager类中可用的方法公开。我仔细查看了Android开发者页面,并通读了另一篇文章的一个非常有用的答案来找到这个。似乎任何应用程序都可以通过Commonware在此描述的方法获取应用程序的公钥。

感谢您对Commonware的评论!也许我应该问另一个问题,但是,是否还有另外一个选择我应该暴露我的内容?我可以使用一种简单的基于意图的沟通方式吗?如果是的话,我会怎么做?这种技术有什么优点/缺点吗?@Dom:是的,您可以让服务通过
onStartCommand()
接收命令,并通过
Messenger
或作为命令上的
Intent
额外内容发送结果。它不会改变安全特性。