現在、開発者が使用する RPC サービスを開発していますが、別のアプリのデバッグ キーと公開キーを区別できるようにしたいと考えています。別のアプリのキーを確認し、それがデバッグ キーであり、公開されたアプリ キーではないかどうかを確認する方法はありますか?
これの目的は、彼らのアプリが開発中かリリース中かを判断できるようにすることです。開発サーバーにアクセスする必要があるのか、本番サーバーにアクセスする必要があるのかを判断できるようにする必要があるからです。
現在、開発者が使用する RPC サービスを開発していますが、別のアプリのデバッグ キーと公開キーを区別できるようにしたいと考えています。別のアプリのキーを確認し、それがデバッグ キーであり、公開されたアプリ キーではないかどうかを確認する方法はありますか?
これの目的は、彼らのアプリが開発中かリリース中かを判断できるようにすることです。開発サーバーにアクセスする必要があるのか、本番サーバーにアクセスする必要があるのかを判断できるようにする必要があるからです。
デフォルトでは、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」という名前のプリンシパルを提供します。 }
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 " を置き換えると、正常に動作します。