Как файлы .apk подписываются - PullRequest
20 голосов
/ 03 августа 2010

Это не вопрос о том, как подписать файл .apk. Я хочу знать, что на самом деле означает подписание и как оно реализовано.

Внутри файла .apk находится папка META-INF, а внутри - два файла.

Первый из них - CERT.SF содержит хэши SHA1 для различных компонентов и выглядит следующим образом:

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=

Существует также файл с именем CERT.RSA. Я предполагаю, что это открытый ключ для проверки подписи.

Мой вопрос: где хранится подпись для всего файла .apk? А что на самом деле подписано? Это может быть либо

  • .apk файл используется как отдельный двоичный объект и подписан
  • или CERT.SF подписан, который содержит отдельные хеши для различных компонентов

Было бы также намного лучше, если бы вы могли указать мне на документацию подробного процесса подписания и проверки.

Ответы [ 2 ]

24 голосов
/ 22 февраля 2012

Действительно, это не конкретный вопрос для Android, а вопрос в целом по Java, однако я все равно выкладываю ответ ...

Прежде всего: подписан только файл XXX.SF;это означает, что все файлы, упомянутые в файле XXX.SF, подписаны «косвенно», поскольку XXX.SF содержит их хэши.На самом деле все файлы, не находящиеся в «Meta-Inf», должны иметь там хэши!Весь архив .apk не подписан.

Файл XXX.SF является более или менее копией файла MANIFEST.MF.Существует строка "SHA1-Digest-Manifest", которая является хешем SHA-1 самого файла "MANIFEST.MF";строки "SHA1-Digest" содержат не хэши файлов, а хэши дерева, соответствующие строкам в файле Manifest.MF, так:

SHA1 ("Имя: имя файла" + CR + LF +"SHA1-Digest:" + SHA1 (file_content) + CR + LF + CR + LF)

Формат файла XXX.DSA / .RSA такой же, как для подписи электронной почты S / MIME (длясодержание XXX.SF), однако данные не закодированы в base64 и не используются заголовки / строки трейлера."openssl smime -sign -outform DER" создаст этот формат.

Для подписи файла ZIP можно использовать несколько сертификатов.В этом случае будет существовать несколько пар (XXX.SF / .RSA, YYY.SF / .RSA, ...).

4 голосов
/ 03 августа 2010

Это на самом деле не имеет ничего общего с Android. APK-файлы подписаны с использованием jarsigner. Вот ссылка на справочную страницу .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...