9

現在、開発者が使用する RPC サービスを開発していますが、別のアプリのデバッグ キーと公開キーを区別できるようにしたいと考えています。別のアプリのキーを確認し、それがデバッグ キーであり、公開されたアプリ キーではないかどうかを確認する方法はありますか?

これの目的は、彼らのアプリが開発中かリリース中かを判断できるようにすることです。開発サーバーにアクセスする必要があるのか​​、本番サーバーにアクセスする必要があるのか​​を判断できるようにする必要があるからです。

4

2 に答える 2

5

デフォルトでは、Eclipseで使用されるandroiddebugkey(たとえば)のnotAfter日付と時刻は最大で1年先ですが、このような短い値はAndroidマーケットでは受け入れられません。これを使用して、開発者が署名したビルドを区別できますか?または..アプリが使用する公開鍵を確認することもできます-アプリのandroid.content.pm.Signatureを使用してRPCリクエストに署名してもらいますか?

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

for(Signature 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 の値 " key " を置き換えると、正常に動作します。

于 2011-10-03T08:44:19.423 に答える