我有两个Android应用程序,App A和App B.
这两者必须以安全的方式相互沟通。 我在App A中为此定义了自定义权限。应用B使用该自定义权限。如果我将protectionLevel设置为“normal”,那么这样可以正常工作,但这似乎并不安全,因为任何人都可以使用该权限。
这是真正安全的唯一方法是,如果我可以将protectionLevel设置为签名。可悲的是,我有以下限制:
有什么方法可以让它发挥作用吗?如果没有(我猜是这样):
确保只有App B可以与App A通信的好方法是什么?
答案 0 :(得分:5)
案例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 e.g. “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
}
}
我已经测试了基于签名的权限,但效果很好。
希望这会有所帮助。