2011-12-30 26 views
7

実行時にapkの署名に関する情報を取得する方法はありますか?実行時にapkの署名を取得する

例えば、私はapp-1.apkとapp-2.apkの2つの異なる署名で署名された同じアプリケーションを持っています。私は実行時に両方のapkを区別できるようにしたいと思います。それは可能ですか?

私の目標は、外部サーバーを使用して、アプリケーションのバージョンコードと署名に基づいてライセンスシステムを実装することです。

答えて

8

PackageManagerを使用してapk署名にアクセスできます。 Package Managerで定義されたPackageInfoフラグは、パッケージに含まれるシグネチャに関する情報を返します。ことを除いて、どのようなAPI呼び出し '署名' は、実際に署名_certificate_ある

Signature[] sigs = context.getPackageManager().getPackageInfo(context.getPackageName(),PackageManager.GET_SIGNATURES).signatures;  
for (Signature sig : sigs) 
{ 
    Log.i("App", "Signature : " + sig.hashCode()); 
} 

http://developer.android.com/reference/android/content/pm/PackageManager.html

+3

右、。生の証明書を取得するには、 'toByteArray()'を呼び出します。さらに、 'hashCode()'はあまり買わないので、 'MessageDigest'を使って比較のための証明書ハッシュ値を計算する必要があります。 –

+0

@NikolayElenkovこれは古い投稿かもしれないが、私はこのコードを実装する必要があった。証明書と生の証明書の署名の違いは何ですか? 'hashCode()'の代わりに 'toByteArray()'メソッドを使用すると、私の 'MD5'チェックサムは' .apk'を再度実行するたびに変わりますが、 'hashCode()'を使うだけでアプリケーションを再コンパイルしない限り、私が望むのは、 '.apk'に署名するために使用されたキーストアを特定することです。 – Synaero

+1

'hashCode()'はMD5チェックサムを返しませんが、実行時にオブジェクトを識別する多かれ少なかれランダムな値です。 MessageDigest.getInstance( "MD5")。digest(sigs [0] .toByteArray()) 'を使用します。ところで、「キーストア」を特定することに意味がないので、署名キー/証明書を特定する必要があります。 –

2

これは別のアプローチかもしれませんが、署名ベースのカスタムアクセス許可を実装してみませんか?次に、パッケージマネージャー(またはブロードキャスト)を使用して、許可が与えられているかどうかを調べることができます。

もしそうであれば、両方の署名が同じであるかどうかは異なります。

関連する問題