Есть ли способ проверить, отлажена ли подпись приложения или опубликована? - PullRequest
9 голосов
/ 09 ноября 2010

В настоящее время я разрабатываю RPC-сервисы для разработчиков, но хотел бы убедиться, что я могу различить ключ отладки другого приложения и его открытый ключ. Есть ли способ проверить ключ другого приложения и сказать, является ли он ключом отладки, а НЕ опубликованным ключом приложения?

Цель этого состоит в том, чтобы иметь возможность определить, когда их приложение находится в состоянии разработки или выпуска, так как мне нужно знать, должны ли они обращаться к моему серверу разработки или к моему производственному серверу.

Ответы [ 2 ]

4 голосов
/ 03 октября 2011

По умолчанию у androiddebugkey, используемого Eclipse (например), есть notAfter дата и время, которое в будущем составляет максимум 1 год - такое короткое значение не принимается Android Market - вы можете использовать это для дифференциации между разработчиками подписанных сборок? Или ... вы можете просто проверить открытый ключ, который использует приложение - попросите их подписать RPC-запросы с помощью android.content.pm.Signature их приложения?

PackageInfo pkgInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_SIGNATURES);

for (Signature appSignature : pkgInfo.signatures) {
    // javax.security - <b>NOT</b> java.security!
    X509Certificate appCertificate = X509Certificate.getInstance(appSignature.toByteArray());
    // appCertificate.getNotAfter() can give you the date & time the cert expires
    // appCertificate.getPublicKey() can give you the public key you sign the RPC requests with.
    // appCertificate.getSubjectDN() will give you a Principal named "CN=Android Debug,O=Android,C=US" for any debug certificate that hasn't been handcrafted by the developer.
}
4 голосов
/ 03 октября 2011
static final String DEBUGKEY = 
      " key ";    


public static boolean signedWithDebugKey(Context context, Class<?> cls) 
{
    boolean result = false;
    try {
        PackageInfo pinfo = context.getPackageManager().getPackageInfo("your package name",PackageManager.GET_SIGNATURES);
        Signature sigs[] = pinfo.signatures;

        Log.d(TAG,sigs[0].toCharsString());

        if (DEBUGKEY.equals(sigs[0].toCharsString())) {
            result = true;
            Log.d(TAG,"package has been signed with the debug key");
        } else {
            Log.d(TAG,"package signed with a key other than the debug key");
        }

    } catch (android.content.pm.PackageManager.NameNotFoundException e) {
        return false;
    }

    return result;

} 

Запустите этот код в первый раз с помощью debugkey, он всегда вернет false, но вы получите закодированный ключ в Logcat.Скопируйте этот закодированный ключ и замените значение «ключ» в DEBUGKEY, и он будет работать нормально.

...