Подписание приложений

Подписание приложений позволяет разработчикам идентифицировать автора приложения и обновлять свое приложение без создания сложных интерфейсов и разрешений. Каждое приложение, работающее на платформе Android, должно быть подписано разработчиком . Приложения, которые пытаются установить без подписи, будут отклонены Google Play или установщиком пакетов на устройстве Android.

В Google Play подписание приложений объединяет доверие Google к разработчику и доверие разработчика к своему приложению. Разработчики знают, что их приложение поставляется без изменений на Android-устройство; и разработчики могут нести ответственность за поведение своего приложения.

В Android подписание приложения — это первый шаг к размещению приложения в изолированной программной среде приложения. Подписанный сертификат приложения определяет, какой идентификатор пользователя связан с каким приложением; разные приложения работают под разными идентификаторами пользователей. Подписание приложений гарантирует, что одно приложение не сможет получить доступ к любому другому приложению, кроме как через четко определенный IPC.

Когда приложение (файл APK) устанавливается на устройство Android, диспетчер пакетов проверяет правильность подписи APK с помощью сертификата, включенного в этот APK. Если сертификат (или, точнее, открытый ключ в сертификате) совпадает с ключом, используемым для подписи любого другого APK на устройстве, у нового APK есть возможность указать в манифесте, что он будет иметь общий UID с другим аналогичным образом. -подписанные APK.

Приложения могут быть подписаны третьей стороной (OEM, оператор, альтернативный рынок) или подписаны самостоятельно. Android обеспечивает подписывание кода с использованием самозаверяющих сертификатов, которые разработчики могут создавать без посторонней помощи или разрешения. Заявки не обязательно должны быть подписаны центральным органом. Android в настоящее время не выполняет проверку ЦС для сертификатов приложений.

Приложения также могут объявлять разрешения безопасности на уровне защиты подписи, ограничивая доступ только к приложениям, подписанным одним и тем же ключом, сохраняя при этом разные идентификаторы UID и песочницы приложений. Более тесная связь с общей изолированной программной средой приложения допускается с помощью функции общего UID, когда два или более приложений, подписанных одним и тем же ключом разработчика, могут объявить общий UID в своем манифесте.

Схемы подписи APK

Android поддерживает три схемы подписи приложений:

Для максимальной совместимости подписывайте приложения всеми схемами, сначала v1, затем v2, а затем v3. Устройства с Android 7.0+ и более поздних версий устанавливают приложения, подписанные по схемам v2+, быстрее, чем приложения, подписанные только по схеме v1. Старые платформы Android игнорируют сигнатуры v2+, поэтому приложения должны содержать сигнатуры v1.

Подписание JAR (схема v1)

Подписание APK было частью Android с самого начала. Он основан на подписанном JAR . Дополнительные сведения об использовании этой схемы см. в документации по Android Studio, посвященной подписанию вашего приложения .

Подписи v1 не защищают некоторые части APK, например метаданные ZIP. Верификатор APK должен обрабатывать множество ненадежных (еще не проверенных) структур данных, а затем отбрасывать данные, не покрытые подписями. Это обеспечивает значительную поверхность атаки. Более того, верификатор APK должен распаковывать все сжатые записи, что занимает больше времени и памяти. Для решения этих проблем в Android 7.0 представлена ​​схема подписи APK v2.

Схема подписи APK v2 и v3 (схема v2+)

Устройства под управлением Android 7.0 и более поздних версий поддерживают схему подписи APK v2 (схема v2) и более поздних версий. (схема v2 была обновлена ​​до v3 в Android 9, чтобы включить дополнительную информацию в блок подписи, но в остальном работает так же.) Содержимое APK хэшируется и подписывается, затем полученный блок подписи APK вставляется в APK. Подробнее о применении схемы v2+ к приложению см. в разделе Схема подписи APK v2 .

Во время проверки схема v2+ рассматривает файл APK как большой двоичный объект и выполняет проверку подписи по всему файлу. Любое изменение APK, включая изменения метаданных ZIP, делает подпись APK недействительной. Эта форма проверки APK значительно быстрее и позволяет обнаруживать больше классов несанкционированных модификаций.

Новый формат обратно совместим, поэтому APK, подписанные с новым форматом подписи, можно устанавливать на старые устройства Android (которые просто игнорируют дополнительные данные, добавленные в APK), если эти APK также подписаны v1.

Процесс проверки подписи APK

Рисунок 1. Процесс проверки подписи APK

Хэш всего файла APK сверяется с подписью v2+, хранящейся в блоке подписи APK. Хэш охватывает все, кроме блока подписи APK, который содержит подпись v2+. Любая модификация APK за пределами блока подписи APK делает недействительной подпись APK версии 2+. APK с удаленной подписью v2+ также отклоняются, потому что их подпись v1 указывает, что APK был подписан v2, из-за чего Android 7.0 и новее отказываются проверять APK, используя их подписи v1.

Подробнее о процессе проверки подписи APK см. в разделе «Проверка» схемы подписи APK версии 2.