繁体   English   中英

安卓应用之间的安全通信

[英]Secure communication between android apps

我有两个Android应用,分别为App A和AppB。

这两个必须以安全的方式相互通信。 我在App A中定义了自定义权限。AppB使用该自定义权限。 如果我将protectionLevel设置为“ normal”,则可以正常工作,但这似乎并不安全,因为任何人都可以使用该权限。

真正安全的唯一方法是,如果可以将protectionLevel设置为签名。 遗憾的是,我有以下限制:

  • 应用A必须与证书A签署
  • 应用B必须与证书B签署
  • 根据该消息来源 ,App B也可以使用证书A进行签名(分别是A和B),但这似乎无济于事。

有什么办法可以使它正常工作吗? 如果不是(我想是这样):

确保只有App B可以与App A进行通信的一种好方法是什么?

情况1:当App A和App B用不同的密钥签名时,您至少可以通过广播侦听器检查呼叫者程序包名称。

@Override    
Public void onReceive(Context context, Intent intent) {
    Uri packageNameUri = intent.getData();
    String packageName = packageNameUri.getSchemeSpecificPart();
    If(packageName.equals(“<App_A or App_B packageName>”){
        //Access granted, execute what you need!    
    }
    else{
        //deny access
    }
}

不要忘记在Android清单文件中声明您的广播接收器:

<receiver android:name="<your_receiver_class " >
    <intent-filter>
        <action android:name="<give it any name>"/>
        <data android:scheme="package"/> 
    </intent-filter>
</receiver> 

情况2:两个应用使用相同的密钥签名时。

确保两个应用程序都使用相同的密钥签名,并且如果您还希望共享Linux用户ID,请在清单文件中添加以下属性:

android:sharedUserId="<provide dot separated name eg “android.shared.uid”">

强制执行基于签名的权限的一种方法是在清单中创建自定义权限,如下所示:

<permission android:name="org.securecom.permission" android:protectionLevel="signature"></permission>
…
<activity
    android.permission="org.securecom.permission"
        ...
</activity>

这样,您可以静态配置并强制执行对组件的基于签名的权限。

也可以通过广播侦听器动态检查:

@Override
public void onReceive(Context context, Intent intent) {
    Uri packageUri = intent.getData();
    String packageName = packageUri.getEncodedSchemeSpecificPart();
    int flags = PackageManager.GET_PERMISSIONS | PackageManager.GET_SIGNATURES;
    try {
        PackageInfo packageInfo = context.getPackageManager().getPackageInfo(packageName,flags);
        // verify packageInfo
    } catch (NameNotFoundException e) {
        // handle
    }
}

我已经测试了基于签名的权限,并且效果很好。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM