アプリの署名がデバッグまたは公開されているかどうかを確認する方法はありますか?
-
30-09-2019 - |
質問
現在、開発者が使用できるRPCサービスを開発していますが、別のアプリのデバッグキーと公開キーを区別できるようにしたいと考えています。別のアプリのキーをチェックし、公開されたアプリキーではなくデバッグキーであるかどうかを伝える方法はありますか?
これの目的は、DEVサーバーまたは私の生産サーバーにアクセスする必要があるかどうかを判断する必要があるため、アプリがいつ開発されているか、リリースステータスがあるかを知ることができることです。
解決
デフォルトでは、Eclipse(たとえば)が使用するAndroiddebugkeyには notAfter
将来最大1年である日付と時刻 - このような短い価値はAndroid市場に受け入れられません - それを使用して、開発者の署名済みビルドを区別できますか?または..アプリが使用するpublicKeyを確認することができます - アプリの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() 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. }
他のヒント
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を返しますが、ログキャットでエンコードされたキーが取得されます。エンコードされたキーをコピーし、デバッグキーの値「キー」を置き換えると、正常に動作します。
所属していません StackOverflow