2010-08-02 10 views
20

Questa non è una domanda su come firmare un file .apk. Voglio sapere cosa significa in realtà la firma e come è implementato.Come viene firmato un file .apk

All'interno del file .apk c'è la cartella META-INF e all'interno ci sono due file.

primo è CERT.SF contiene SHA1 hash per i vari componenti e si presenta così:

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= 

C'è anche un file chiamato CERT.RSA. Presumo che sia la chiave pubblica per verificare la firma.

La mia domanda è, dove è memorizzata la firma per l'intero file .apk? E cosa è effettivamente firmato? Potrebbe essere sia di file

  • .apk utilizzato come singolo oggetto binario e questo è firmata
  • o CERT.SF è firmata contenente hash individuali per diversi componenti

Sarebbe anche molto meglio se puoi indicarmi la documentazione della procedura dettagliata di firma e verifica.

risposta

24

In effetti questo non è una domanda di Android specifica, ma un Java-in-generale, domanda però ho posto una risposta in ogni caso ...

Prima di tutto: è firmato solo il file XXX.SF; questo significa che tutti i file menzionati nel file XXX.SF sono firmati "indirettamente" perché XXX.SF contiene i loro hash. Infatti tutti i file che non si trovano in "Meta-Inf" dovrebbero avere degli hash lì! L'intero archivio .apk non è firmato.

Il file XXX.SF è più o meno una copia del file MANIFEST.MF. Esiste una riga "SHA1-Digest-Manifest" che è l'hash SHA-1 di "MANIFEST.MF" stesso; le righe "SHA1-Digest" non contengono gli hash dei file ma gli hash delle righe corrispondenti nel file Manifest.MF così:

SHA1 ("Nome: nome file" + CR + LF + "SHA1 -Digest: "+ SHA1 (file_content) + CR + LF + CR + LF)

Il formato file di XXX.DSA/.RSA è lo stesso di una firma di posta elettronica S/MIME (per il contenuto di XXX. SF) tuttavia i dati non sono codificati in base64 e non vengono utilizzate linee di intestazione/rimorchio. "openssl smime -sign -outform DER" creerebbe questo formato.

È possibile utilizzare più certificati per firmare un file ZIP. In questo caso esisteranno più coppie di (XXX.SF/.RSA, YYY.SF/.RSA, ...).

+0

Martin, sto cercando di replicare l'ultimo passaggio (generando il file .RSA) utilizzando .NET. L'input per firmare, dovrei prenderlo che sono le voci del file nel file .SF (cioè 3 linee)? Questi dati dovrebbero essere codificati come UTF8 o Unicode? Non sono in grado di produrre lo stesso output (sebbene) simile allo strumento jarsigner per lo stesso certificato/dati. Qualsiasi suggerimento sarebbe d'aiuto! –

Problemi correlati