2010-08-02 13 views
20

To nie jest pytanie o sposób podpisania pliku .apk. Chcę wiedzieć, co oznacza podpisanie i jak jest ono zaimplementowane.W jaki sposób pliki .apk są podpisywane?

Wewnątrz pliku .apk znajduje się folder META-INF, a wewnątrz znajdują się dwa pliki.

Pierwszy z nich jest CERT.SF zawiera SHA1 skróty do różnych elementów i wygląda następująco:

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= 

Istnieje również plik o nazwie CERT.RSA. Zakładam, że jest to klucz publiczny do weryfikacji podpisu.

Moje pytanie brzmi: gdzie jest podpis dla całego pliku .apk? A co właściwie jest podpisane? Może to być zarówno plik

  • apk stosowany jako pojedynczy obiekt binarny i to jest podpisany
  • lub CERT.SF jest podpisany, która zawiera poszczególne hashe dla różnych komponentów

Byłoby również znacznie lepiej, jeśli możesz wskazać mi dokumentację szczegółowego procesu podpisywania i weryfikacji.

Odpowiedz

24

Rzeczywiście nie jest to konkretne pytanie, ale Android Java-in-ogólne pytanie jednak zamieścić odpowiedź tak ...

przede wszystkim: jest podpisany plik XXX.SF tylko; oznacza to, że wszystkie pliki wymienione w pliku XXX.SF są podpisane "pośrednio", ponieważ XXX.SF zawiera ich skróty. W rzeczywistości wszystkie pliki nie znajdujące się w "Meta-Inf" powinny zawierać hasze! Całe archiwum .apk nie jest podpisane.

Plik XXX.SF jest mniej więcej kopią pliku MANIFEST.MF. Istnieje linia "SHA1-Digest-Manifest", która jest hashem SHA-1 samego "MANIFEST.MF"; linie "SHA1-Digest" nie zawierają skrótów plików, ale skrótów drzewa odpowiadających linii w pliku Manifest.MF, tak jak poniżej:

SHA1 ("Nazwa: nazwa pliku" + CR + LF + "SHA1 -Digest: "+ SHA1 (file_content) + CR + LF + CR + LF)

Format pliku XXX.DSA/.RSA jest taki sam jak dla podpisu wiadomości S/MIME (dla zawartości XXX. SF) jednak dane nie są kodowane base64 i nie są używane linie nagłówka/naczepy. "openssl smime -sign -outform DER" utworzyłby ten format.

Do podpisania pliku ZIP można użyć wielu certyfikatów. W tym przypadku będzie istniało wiele par (XXX.SF/.RSA, YYY.SF/.RSA, ...).

+0

Martin, próbuję replikować ostatni krok (generowanie pliku .RSA) przy użyciu .NET. Dane wejściowe do podpisania, czy powinienem przyjąć, że są to wpisy plików w pliku SFS (tzn. 3 linie)? Czy dane te powinny być zakodowane jako UTF8 lub Unicode? Nie jestem w stanie wytworzyć tego samego wyniku (chociaż) podobnego do narzędzia jarsigner dla tego samego certyfikatu/danych. Wszelkie wskazówki mogą pomóc! –

Powiązane problemy