Cómo se firman los archivos .apk
Esto no es una pregunta acerca de cómo firmar un archivo .apk. Quiero saber qué significa realmente la firma y cómo se implementa.
Dentro del archivo .apk hay una carpeta META-INF y dentro hay dos archivos.
- Archivo de configuración de inicio de sesión de Google para varios desarrolladores
- Gradle firma sabores con diferentes claves en Android
- Firmar APK sin poner información de almacén de claves en build.gradle
- ¿Cómo puedo firmar automáticamente las solicitudes de facturación?
- Cambio de contraseña de contraseña de firma de android
El primero es CERT.SF contiene hasas SHA1 para varios componentes y se ve así:
Name: res/layout/main.xml SHA1-Digest: Cox/T8fN1X9Hv4VqjH9YKqc/MsM= Name: AndroidManifest.xml SHA1-Digest: wZ418H9Aix1LNch3ci7c+cHyuZc= Name: resources.arsc SHA1-Digest: P+uoRrpFyVW6P3Wf+4vuR2ZSuXY= Name: classes.dex SHA1-Digest: cN3zXtGii9zuTOkBqDTLymeMZQI=
También hay un archivo llamado CERT.RSA. Supongo que es la clave pública para verificar la firma.
Mi pregunta es, ¿dónde está almacenada la firma para el archivo .apk completo? ¿Y qué es lo que realmente se firma? Podría ser
- .apk se utiliza como un único objeto binario y esto se firma
- O se firma CERT.SF que contiene hashes individuales para diferentes componentes
Sería también mucho mejor si me puede señalar a la documentación del proceso de firma y verificación detallada.
- ¿Qué precauciones y advertencias debemos conocer al usar el nuevo "APK Signature Scheme v2"?
- Fallo
- Descripción del almacén de claves, certificados y alias
- Aplicación Android de Eclipse: Ejecutar firmada con certificado real
- ¿Genera un almacén de claves para una aplicación de Android en el asistente Exportar aplicación de Android?
- Perdió la clave privada para firmar android apk. ¿Se puede publicar la aplicación en Android Market?
- Error de "archivo de paquete no firmado correctamente": detecte si ocurre o no con la aplicación de Google Play.
Esto en realidad no tiene nada que ver con Android. Los archivos APK se firman con jarsigner
. Aquí hay un enlace a la página de manual .
De hecho, esta no es una pregunta específica de Android, pero una pregunta de Java en general, sin embargo, publicar una respuesta de todos modos …
En primer lugar: Sólo se firma el archivo XXX.SF; Esto significa que todos los archivos mencionados en el archivo XXX.SF están firmados "indirectamente" porque XXX.SF contiene sus hashes. De hecho, todos los archivos no ubicados en "Meta-Inf" debe tener hashes allí! El archivo .apk entero no está firmado.
El archivo XXX.SF es más o menos una copia del archivo MANIFEST.MF. Hay una línea "SHA1-Digest-Manifest" que es el hash SHA-1 de "MANIFEST.MF" sí mismo; Las líneas "SHA1-Digest" no contienen los hashes de los archivos, sino los hashes de las líneas correspondientes al árbol en el archivo Manifest.MF como este:
SHA1 ("Nombre: nombre de archivo" + CR + LF + "SHA1-Digest:" + SHA1 (archivo_contenido) + CR + LF + CR + LF)
El formato de archivo de XXX.DSA / .RSA es el mismo que para una firma de correo electrónico S / MIME (para el contenido de XXX.SF) sin embargo los datos no están codificados en base64 y no se utilizan líneas de encabezado / remolque. "Openssl smime -sign -outform DER" crearía este formato.
Se pueden usar varios certificados para firmar un archivo ZIP. En este caso existirán múltiples pares de (XXX.SF / .RSA, YYY.SF / .RSA, …).