【问题标题】:Secure communication between android apps安卓应用程序之间的安全通信
【发布时间】:2013-06-24 15:21:10
【问题描述】:

我有两个 Android 应用,应用 A 和应用 B。

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

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

  • 应用 A 必须使用 Cert A 签名
  • 应用 B 必须使用 Cert B 签名
  • App B 也可以使用 Cert A(表示 A 和 B)进行签名,但确实如此 根据this source,似乎没有让我到任何地方

有没有办法让它工作?如果不是(我猜是这样):

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

【问题讨论】:

    标签: android security


    【解决方案1】:

    案例1:当App A和App B使用不同的key签名时,你至少可以通过你的广播监听器查看调用者包名。

    @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="&lt;provide dot separated name e.g. “android.shared.uid”"&gt;

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

    <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
        }
    }
    

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

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-22
      • 2018-10-03
      • 1970-01-01
      • 2012-05-20
      • 1970-01-01
      • 2010-12-06
      相关资源
      最近更新 更多