9

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

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

4

2 回答 2

5

默认情况下,Eclipse(例如)使用的 androiddebugkey 的notAfter日期和时间最多为未来 1 年 - Android Market 不接受这么短的值 - 您可以使用它来区分开发人员签名的构建吗?或者..您可以只检查应用程序使用的公钥 - 让他们使用应用程序的 android.content.pm.Signature 对 RPC 请求进行签名?

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

对于(签名appSignature:pkgInfo.signatures){
    // javax.security -不是java.security!
    X509Certificate appCertificate = X509Certificate.getInstance(appSignature.toByteArray());
    // appCertificate.getNotAfter() 可以为您提供证书过期的日期和时间
    // appCertificate.getPublicKey() 可以为您提供用于签署 RPC 请求的公钥。
    // appCertificate.getSubjectDN() 将为您提供一个名为“CN=Android Debug,O=Android,C=US”的主体,用于任何未经开发人员手工制作的调试证书。
}
于 2011-10-03T09:04:47.827 回答
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 的值“键”,它会正常工作。

于 2011-10-03T08:44:19.423 回答