Подтвердить что ты не робот

Как подписываются файлы .apk

Это не вопрос о том, как подписать файл .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, который содержит отдельные хэши для разных компонентов

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

4b9b3361

Ответ 1

Это фактически не имеет ничего общего с Android. Файлы APK подписываются с помощью jarsigner. Вот ссылка на manpage.

Ответ 2

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

Прежде всего: подписан только файл XXX.SF; это означает, что все файлы, упомянутые в файле XXX.SF, подписываются "косвенно", потому что XXX.SF содержит свои хэши. На самом деле все файлы, не расположенные в "Мета-инф", должны иметь хэши! Архив .apk не подписан.

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

SHA1 ( "Name: filename" + 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,...).