7

私はいくつかのアプリを作成している会社で働いていますが、それらのアプリのすべてが同じ署名を持っているわけではなく、当分の間、少なくとも 5 ~ 6 個のアプリ証明書を持っているようなものです。

私たちは、同じデバイス上のすべての会社のアプリが同じものを共有するメカニズムを作成しようとしました.アプリ B はアプリ A と同じ ID を持つ必要があります (id は単に生成された UUID タイプ #4 です) など...

現時点ではブロードキャストを使用しており、許可を得たアプリのみがそのブロードキャストを受信し、別のブロードキャスト (今回は明示的) で ID を返すことができます。ブロードキャストと応答は、署名レベルの許可を得て保護されています。これは、複数の署名があるため、もちろん役に立ちません。

私はインテント ブロードキャストとリカバリを作成しようとしました。これは、1 つの署名だけに限定されるのではなく、複数の署名に限定される独自の保護メカニズムを持つことができます。問題は、Binder.getSenderUID() のようなものがブロードキャストで機能せず、自分の uid。彼自身が自分の ID をインテントに書き込まない限り、sder の ID を取得する方法はないようです。これは、簡単に偽造できるため、信頼できるものではありません。暗号化を使用するには、アプリにキーが付属している必要がありますが、これはもう一度セキュリティで保護されていません。検証のためにサーバーにアクセスするには時間がかかりすぎます。また、モバイルではネットワークが存在することを 100% 確信できないため、成功する保証はありません。

あるアプリから別のアプリに検証\セキュアメッセージを取得する方法は誰にもわかりますか?(すべてのアプリですが、署名が異なる場合があります)。

4

4 に答える 4

6

ここでの挑戦的な質問と同様に、私は適切な答えを得ることができません。答えるので、自分で見つけざるを得ません。

Intents の問題は、送信者のアドレスが重要でないネットワークでマルチキャストと並行しているため、送信者を取得できないことです。

送信者の UID を取得したい場合は、ブロードキャスト IPC を使用する代わりに、ローカルであっても「リモート」プロセスを作成する必要があります。IBInder 実装で AIDL を使用する必要があります。Binder オブジェクトを取得したら、サービスで getCallingUid() を呼び出して呼び出し元の uid を取得できます。これにより、PackageManager に公開証明書を提供するように依頼できます (プロセス自体に依頼せずに、OS に依頼します) と比較しますapkで事前に準備した一連の証明書にそれを追加します。

反対側の呼び出しアプリケーション (ID を送信する他のプロセス) は、 bindService(service, conn, flags) メソッドを使用してバインドするだけです。このアプローチの欠点はもちろん、時間のかかるプロセスです。Bind には時間がかかります。これは、カーネルを通過する非同期呼び出しであり、ローカル サービスへのバインドほど高速ではありません。さらに、複数のアプリケーションがある可能性があるため、内部 ID へのアクセスを同期する必要があるため、失敗しなかった最初のバインド呼び出しのみが設定され、ID が設定されます。マルチスレッドの問題を防ぐ Messanger メソッドを使用できるかどうかを確認する必要があります。

これが他の誰かに役立つことを願っています。

于 2013-03-24T13:01:19.197 に答える
0

既に述べたように、バインディングはおそらくこれに対する最良の解決策です。ただし、 BroadcastReceiver ではなく Activity に切り替えることを検討すると、 でgetCallingActivity()起動したと仮定して、 を使用できますstartActivityForResult()

Activity を次のように宣言して、BroadcastReceiver のように「サイレント」にします。

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

インスピレーション:インテントの送信者を取得するには?

于 2014-07-04T10:16:38.097 に答える
-2

インテント フィルターが受信したインテントを送信したアプリケーションのパッケージ名を確認する方法を探していました。アプリでインテント フィルターを処理するアクティビティでは、インテント送信者がインテント エクストラ フィールドにプロセス 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>

受信アクティビティ

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

ユーティリティ クラス

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 "";
    }
于 2014-11-12T00:21:41.937 に答える