安卓:验证意图发送者的身份(android: validate the identity of in

2019-08-17 18:26发布

我产生几个应用程序的公司工作,不是所有的这些应用程序具有相同的签名或更喜欢它,我们至少有5-6个应用程式证书暂时。

我们试图创造一个都在同一设备共享相同的是companie的应用程序,例如,如果用户从市场应用程序A和没有应用程序安装的安装,将产生一个新的ID的机制,如果现在他安装应用程序A,应用乙应具有相同的id作为应用A(ID仅仅是一个生成的UUID类型#4)等等

我们使用广播的时刻,只有与我们的权限可以接收广播和发回的ID与另一个广播(明确的这段时间)的应用程序。 广播和响应保护我们与签名级别的权限,这当然没有帮助,因为我们有一个以上的签名。

我试着写意图广播和恢复可以有它保护自己的机制,不会只局限于一个签名,但一些,问题是,之类的东西Binder.getSenderUID()不能用于广播工作,让我的自己的UID。 它看起来像我没有办法让我的snder的身份除非他本身的意图,这是不是我可以信任,因为它可以很容易地伪造写他的身份证。 使用加密要求的应用程序来与他们的关键,这是不固定一次,转向用于验证的服务器需要太多的时间和移动,因为不是100%肯定有网络遍布不能保证成功。

任何人有任何想法怎么能够从一个应用程序得到验证\安全消息到另一个?(我所有的应用程序,但可能有不同的签名)。

Answer 1:

抱歉迟了回应...

绑定需要时间,而且更重要的是,它的异步。 然而,有一种方法,使同步绑定 - 假设你当然试图联系当时已启动该服务。 的Android允许对这种多为BroadcastReceivers(其在性质上是异步,因而不能使用正常bindService)一个BroadcastReceiver具有“peekService”的方法。

如果你想使用没有收听广播,你可以通过做:

final IBinder[] b = new IBinder[1];
new BroadcastReceiver() { 
    public void onReceive(Context context, Intent intent) {
        b[0] = peekService(context, intent);
    }
}.onReceiver(context, intent);

IMyInterface i = IMyInterface.Stub.asInterface(b[0);

注意,你不绑定到服务,所以一定要确保在每个使用偷看。



Answer 2:

一如既往地与一个具有挑战性的问题,在这里,我从来没有得到适当的,如果有的话!” 答案,所以我不得不寻找它自己。

与意图的问题是,它是不可能得到发送者,因为他们是平行的在网络中mulicast那里发件人的地址并不重要。

如果我想获得snder的UID,我需要做的,而不是使用广播IPC我需要使用AIDL与执行的IBinder即使他是本地的“远程”的过程。 一旦我有一个活页夹对象,我可以在我的服务getCallingUid(呼叫)和获得致电者的UID,这将允许我问PackageManager给我它的公证书(不问过程本身,我问OS)和比较它的一组证书的我预先准备在APK。

在另一边调用应用程序(发送我来说的ID其他进程)只拥有使用bindService(服务,康涅狄格州,标志)方法绑定到我。 这种方法的缺点是ofcourse的耗时的过程,绑定需要时间,这是一个异步调用穿过内核是不一样快结合本地服务。 而且,因为我可能有几个应用程序,我需要访问我的内部ID,因此只有第一个绑定调用没有失败将设置和ID为我同步。 我仍然需要检查,如果我可以使用信使的方法防止多线程的问题。

希望这可以帮助其他人。



Answer 3:

如前所述,结合可能是对此最好的解决方案。 但是,你可以考虑切换到一个活动,而不是广播接收器,那么你可以使用getCallingActivity()假设你有推出startActivityForResult()

声明你的活动如下,以使其“沉默”像一个BroadcastReceiver:

<activity
    android:name=".FauxReceiver"
    android:theme="@android:style/Theme.NoDisplay" 
    android:excludeFromRecents="true"
    android:noHistory="true"
>
    <intent-filter>
        ...
    </intent-filter>
</activity>

启示: 如何获得一个Intent的发送者?



Answer 4:

我一直在寻找一种方法来验证发送我的意图滤镜接收到的意图的应用程序的包名。 在我的应用程序处理该意向过滤器的活动要求发送方意图包括在意图额外领域的进程ID。 然后我接收活动可以从ActivityManager获得相关的应用程序包的名称。

下面是一些示例代码,我发现,同时通过移StackOverflow的。

需要这两个应用程序常数

public static final String EXTRA_APP_ID;
public static final String ACTION_VERIFY = "com.example.receivingapp.action.VERIFY";

调用活动

    Intent verifyIntent = new Intent();
    verifyIntent.setAction(Consts.ACTION_VERIFY);
    verifyIntent.putExtra(EXTRA_APP_ID, android.os.Process.myPid());
    // Verify that the intent will resolve to an activity
    if (verifyIntent.resolveActivity(getPackageManager()) != null) {
    startActivityForResult(verifyIntent, Consts.REQUEST_VERIFY);
    } else {
       Log.d(TAG, "Application not found.");
    }

接收应用程序

表现

        <activity
            android:name="com.example.receivingapp.ReceivingActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="com.example.receivingapp.VERIFY" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

ReceivingActivity

if (getIntent().hasExtra(OnyxCoreConsts.EXTRA_APP_ID)) {
    string appName = null;  
    // Resolve intent
    if (getIntent().getAction().equals(ACTION_VERIFY) {    
         int appPid = getIntent().getIntExtra(EXTRA_APP_ID, -1);
         if (-1 != mAppPid) {
             appName = Utils.getAppNameByPID(mContext, mAppPid);
         }
         if (null != appName && !"".equalsIgnoreCase(appName)) {
              // Do something with the application package name
         }
    }
}

utils的类

public static String getAppNameByPID(Context context, int pid){
        ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

        for (RunningAppProcessInfo processInfo : manager.getRunningAppProcesses()) {
            if (processInfo.pid == pid) {
                return processInfo.processName;
            }
        }
        return "";
    }


文章来源: android: validate the identity of intent sender