¿Cómo obtener la firma firmada de APK?

¿Hay una manera de recuperar la firma de la llave usada para firmar un APK? Firmé mi APK con mi llave de mi keystore. ¿Cómo puedo recuperarla mediante programación?

Puede acceder a la firma de firma del APK como esta usando 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 esto para comparar con el hashcode para mi clave de depuración, como una manera de identificar si el APK es un APK de depuración o un APK de lanzamiento.

El administrador de paquetes le proporcionará el certificado de firma para cualquier paquete instalado. A continuación, puede imprimir los detalles de la clave de firma, por ejemplo

 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(); } } } 

Mi situación es que tengo un apk preinstalado que utiliza un almacén de llaves incorrecto. Así que instalar directamente dará un error debido a la firma inconsistente. Necesito comprobar la firma primero para asegurarse de que se puede instalar sin problemas.

Aquí está mi solución .

Como dice este código , puede obtener la firma de un apk instalado.

Detalles

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

En segundo lugar: obtener el hashCode releaseApk para comparar. En mi caso, he descargado este apk de mi servidor, y lo he puesto en el sd_card.

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

Finalmente, compare el hashCode.

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

He intentado el código de arriba, funciona muy bien. Si el hashCode es diferente, sólo debes desinstalar el apk antiguo o si es una aplicación del sistema y el dispositivo está enraizado, puedes usar runtime para eliminarlo y luego instalar la nueva firma apk.

  • Comprobación de que dos archivos apk están firmados con la misma firma
  • Android compara la firma del paquete actual con debug.keystore
  • Verificación de la firma de compra en la aplicación con PHP openssl
  • Android actualiza la aplicación de mercado con una clave de firma diferente
  • ¿Cómo ver la identidad de la persona que firmó el apk en el dispositivo Android?
  • Captura de firmas para android usando phonegap
  • Verificar la firma SHA1withRSA generada en Java (Android) con phpseclib
  • ¿El mismo almacén de claves, pero diferentes claves para diferentes aplicaciones?
  • Cómo firmar un archivo androide de apk
  • Preguntas sobre la preparación de un apk para la Amazon App Store de Android
  • Android en la compra de aplicaciones: la verificación de la firma ha fallado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.