2011-04-07 15 views
53

¿Hay alguna manera de recuperar la firma de la clave utilizada para firmar un APK? Firmé mi APK con mi clave de mi almacén de claves. ¿Cómo puedo recuperarlo programáticamente?¿Cómo obtener la firma de firma de APK?

+0

puede usar un script ant para firmarlo. pero requerirá que almacene sus contraseñas en algún lugar que no sea seguro. – clamp

+0

Solo necesito obtener la firma de mi aplicación dentro de ella, p. en mi primera actividad de alguna manera obtengo la firma de mi aplicación. Hasta ahora no sé cómo – Waypoint

+0

ah lo entiendo ahora. No estoy seguro si esto es posible. – clamp

Respuesta

59

Se puede acceder a la firma la firma del APK como esto utilizando la clase PackageManager http://developer.android.com/reference/android/content/pm/PackageManager.html

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

He utilizado este para comparar con el código hash de la llave de depuración, como una manera de identificar si el archivo APK es un APK de depuración o un APK de lanzamiento.

+0

¿cómo se sabe si está firmado con la clave de depuración o liberación? me sale: 08-08 08: 24: 36.668: E/Plataforma (19131): Firma código hash: -1907392821 yo no sé ni cómo verificar si se trata de mi paquete o no ... (I necesita verificar si com.mypackage.myapp me pertenece o no) – Zennichimaro

+0

http://stackoverflow.com/questions/6122401/android-compare-signature-of-current-package-with-debug-keystore?rq=1 me permite diferenciar entre depuración o versión apk, pero ¿hay alguna manera de validar mi firma contra mi clave pública para verificar que la apk en realidad proviene de mí? ¡Gracias! – Zennichimaro

+10

¿hay alguna manera de obtener una firma de una aplicación no instalada? Por ejemplo, si tengo un archivo .apk – Ruzard

24

El administrador de paquetes le dará el certificado de firma de cualquier paquete instalado. Luego puede imprimir los detalles de la clave de firma, p.

final PackageManager packageManager = context.getPackageManager(); 
final List<PackageInfo> packageList = packageManager.getInstalledPackages(PackageManager.GET_SIGNATURES); 

for (PackageInfo p : packageList) { 
    final String strName = p.applicationInfo.loadLabel(packageManager).toString(); 
    final String strVendor = p.packageName; 

    sb.append("<br>" + strName + "/" + strVendor + "<br>"); 

    final Signature[] arrSignatures = p.signatures; 
    for (final Signature sig : arrSignatures) { 
     /* 
     * Get the X.509 certificate. 
     */ 
     final byte[] rawCert = sig.toByteArray(); 
     InputStream certStream = new ByteArrayInputStream(rawCert); 

     try { 
      CertificateFactory certFactory = CertificateFactory.getInstance("X509"); 
      X509Certificate x509Cert = (X509Certificate) certFactory.generateCertificate(certStream); 

      sb.append("Certificate subject: " + x509Cert.getSubjectDN() + "<br>"); 
      sb.append("Certificate issuer: " + x509Cert.getIssuerDN() + "<br>"); 
      sb.append("Certificate serial number: " + x509Cert.getSerialNumber() + "<br>"); 
      sb.append("<br>"); 
     } 
     catch (CertificateException e) { 
      // e.printStackTrace(); 
     } 
    } 
} 
+0

¿Cuál es el comando para validar el archivo con el serialNumber correspondiente?: Descomprimir -p [ruta_a_aplicar] META-INF/CERT.RSA | keytool -printcert – JY2k

0

Mi situación es que tengo una aplicación preinstalada que utiliza un almacén de claves incorrecto. Entonces la instalación directa dará un error debido a la firma inconsistente. Necesito verificar primero la firma para asegurarme de que pueda instalarse sin problemas.

Aquí está mi solución .

Como dice this code, puede obtener la firma de una aplicación instalada.

detalles:

Signature sig = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES).signatures[0]; 

En segundo lugar: obtener la releaseApk hashCode para comparar. En mi caso, descargué este apk de mi servidor y lo puse en la tarjeta sd.

Signature releaseSig = context.getPackageManager().getPackageArchiveInfo("/mnt/sdcard/myReleaseApk.apk", PackageManager.GET_SIGNATURES).signatures[0]; 

Finalmente, compare el hashCode.

return sig.hashCode() == releaseSig.hashCode; 

He intentado con el código anterior, funciona muy bien. Si hashCode es diferente, debe simplemente uninstall la aplicación anterior o si es una aplicación del sistema y el dispositivo está rooteado, puede simplemente usar el tiempo de ejecución como remove it, y luego instalar la nueva firma apk.

+1

getPackageArchiveInfo, no getPackageAchiveInfo – frogoscar