2010-08-02 15 views
20

No se trata de cómo firmar un archivo .apk. Quiero saber qué significa realmente la firma y cómo se implementa.Cómo se firman los archivos .apk

Dentro del archivo .apk hay una carpeta META-INF y dentro hay dos archivos.

El primero es CERT.SF contiene hashes 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 se almacena la firma de todo el archivo .apk? Y lo que en realidad está firmado? Podría ser cualquiera de los archivos

  • .apk utilizado como un único objeto binario y esto está firmado
  • o CERT.SF está firmado que contiene claves individuales para los diferentes componentes

Sería también mucho mejor si puede dirigirme hacia la documentación del proceso detallado de firma y verificación.

Respuesta

24

De hecho esto no es una pregunta sino un androide específica de Java-en-general cuestión, sin embargo puedo enviar una respuesta de todos modos ...

En primer lugar: Sólo se firmó 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 valores hash. De hecho, todos los archivos que no se encuentran en "Meta-Inf" deben 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" en sí mismo; las líneas "SHA1-Digest" no contienen los valores hash de los archivos, sino los valores hash de las líneas correspondientes al árbol en el archivo Manifest.MF como este:

SHA1 ("Nombre: nombre de archivo" + CR + LF + "SHA1 -Digest: "+ SHA1 (file_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 cabecera/remolque. "openssl smime -sign -outform DER" crearía este formato.

Se pueden usar certificados múltiples para firmar un archivo ZIP. En este caso, existirán múltiples pares de (XXX.SF/.RSA, YYY.SF/.RSA, ...).

+0

Martin, estoy tratando de replicar el último paso (generar el archivo .RSA) usando .NET. La entrada para firmar, ¿debo considerar que son las entradas de archivo en el archivo .SF (es decir, 3 líneas)? ¿Deberían estos datos estar codificados como UTF8 o Unicode? No puedo producir la misma salida (aunque) similar a la herramienta jarsigner para el mismo certificado/datos. ¡Cualquier pista ayudaría! –

Cuestiones relacionadas