Ответ 1
Это фактически не имеет ничего общего с Android. Файлы APK подписываются с помощью jarsigner
. Вот ссылка на manpage.
Это не вопрос о том, как подписать файл .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? И что на самом деле подписано? Это может быть либо
Было бы намного лучше, если бы вы могли указать мне на документацию о подробном процессе подписания и проверки.
Это фактически не имеет ничего общего с Android. Файлы APK подписываются с помощью jarsigner
. Вот ссылка на manpage.
В действительности, это не конкретный вопрос 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,...).