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

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

Solutions Collecting From Web of "Как подписываются файлы .apk"

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

На самом деле это не конкретный вопрос 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, …).