2011-12-30 20 views
7

¿Hay alguna manera de recuperar información sobre la firma apk en tiempo de ejecución?Recuperar la firma apk en tiempo de ejecución para Android

Por ejemplo, tengo la misma aplicación firmada con 2 firmas diferentes: app-1.apk y app-2.apk y me gustaría poder diferenciar ambas apk en tiempo de ejecución. ¿Es eso posible?

Mi objetivo es implementar un sistema de licencias utilizando un servidor externo y basado en el código de la versión de la aplicación y la firma.

Respuesta

8

Puede acceder a apk signature usando PackageManager. Indicador de PackageInfo definido en Package Manager devuelve información sobre las firmas incluidas en el paquete.

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

derecho, excepto que lo que las llamadas a la API 'firma' es en realidad el _certificate_ firma. Llame 'toByteArray()' para obtener el certificado sin formato. Además, 'hashCode()' no le compra mucho, necesita usar 'MessageDigest' para calcular el valor hash del certificado para comparar. –

+0

@NikolayElenkov Esto podría ser una publicación anterior, pero necesitaba este código implementado. ¿Cuál es la diferencia entre firmar cert y raw cert? Cuando uso su método 'toByteArray()' en lugar de 'hashCode()' mi suma de comprobación 'MD5' cambia cada vez que ejecuto' .apk' de nuevo, mientras que usar 'hashCode()' lo mantiene estable a menos que recompile la aplicación. Lo que quiero es identificar el almacén de claves utilizado para firmar el '.apk'. – Synaero

+1

'hashCode()' no devuelve la suma de comprobación MD5, es un valor más o menos aleatorio que identifica el objeto en tiempo de ejecución. use 'MessageDigest.getInstance (" MD5 "). digest (sigs [0] .toByteArray())'. Por cierto, no tiene sentido identificar el 'almacén de claves', necesita identificar la clave/certificado de firma. –

2

Este podría ser un enfoque diferente, pero ¿por qué no simplemente implementa un permiso personalizado, que se basa en la firma? Luego, podría usar el administrador de paquetes (o una transmisión) para averiguar si se otorgó el permiso.

Si lo es, ambas firmas son las mismas, si no son diferentes.

Cuestiones relacionadas