有没有办法检查应用程序签名是否已调试或发布?

时间:2010-11-09 13:35:43

标签: android security certificate license-key

我目前正在开发RPC服务供开发人员使用,但我想确保我可以区分另一个应用程序的调试密钥和他们的公钥。有没有办法检查另一个应用程序的密钥并告诉它是否是调试密钥而不是已发布的应用程序密钥?

这样做的目的是能够判断他们的应用程序何时处于开发或发布状态,因为我需要能够判断他们是应该访问我的开发服务器还是我的生产服务器。

2 个答案:

答案 0 :(得分:4)

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的值“key”,它将正常工作。

答案 1 :(得分:4)

默认情况下,Eclipse使用的androiddebugkey(例如)具有notAfter日期&amp;未来最多1年的时间 - Android市场不接受这么短的价值 - 你可以用它来区分开发者签名的版本吗?或者..你可以检查应用程序使用的公钥 - 让他们用他们应用程序的android.content.pm.Signature签署RPC请求吗?

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

for (Signature appSignature : pkgInfo.signatures) {
    // javax.security - NOT 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.
}