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

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


person Szere Dyeri    schedule 02.08.2010    source источник


Ответы (2)


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

person CommonsWare    schedule 02.08.2010

Действительно, это не конкретный вопрос 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, ...).

person Martin    schedule 21.02.2012
comment
Мартин, я пытаюсь воспроизвести последний шаг (создание файла .RSA) с помощью .NET. Входные данные для подписи, я должен считать, что это записи файла в файле .SF (т.е. 3 строки)? Должны ли эти данные быть закодированы как UTF8 или Unicode? Я не могу получить такой же вывод (хотя), как инструмент jarsigner для того же сертификата/данных. Любые подсказки помогут! - person eq_; 31.08.2015