android - una - ¿Cómo se firma un archivo.apk?
generar apk sin firmar android studio (2)
Esta no es una pregunta sobre 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.
El primero es CERT.SF contiene hash SHA1 para varios componentes y tiene este aspecto:
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 de todo el archivo .apk? ¿Y qué se firma realmente? Podría ser cualquiera
- Archivo .apk utilizado como un único objeto binario y esto está firmado
- o se firma CERT.SF que contiene hashes individuales para diferentes componentes
También sería mucho mejor si pudiera indicarme la documentación del proceso detallado de firma y verificación.
De hecho, esta no es una pregunta específica de Android, sino una pregunta de Java en general. Sin embargo, publico una respuesta de todos modos ...
En primer lugar: solo 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 que no se encuentren en "Meta-Inf" deberían tener hashes allí. Todo el archivo .apk 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"; las líneas "SHA1-Digest" no contienen los hashes de los archivos, sino los hashes de las líneas correspondientes del árbol en el archivo Manifest.MF, así:
SHA1 ("Nombre: nombre de archivo" + CR + LF + "SHA1-Digest:" + SHA1 (content_content) + 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 / final. "openssl smime -sign -outform DER" crearía este formato.
Se pueden usar múltiples certificados para firmar un archivo ZIP. En este caso, existirán múltiples pares de (XXX.SF / .RSA, YYY.SF / .RSA, ...).
Esto en realidad no tiene nada que ver con Android. Los archivos APK están firmados usando jarsigner
. Aquí hay un enlace a la página del manual .