Подписание приложений Android: как это работает и почему это важно

A brass key on a smartphone showing a verified checkmark, illustrating Android app signing

Каждый раз, когда вы устанавливаете приложение на свой телефон Android, в фоновом режиме происходит тихая, но важная проверка безопасности. Ваш телефон проверяет цифровая подпись пакета APK. Это криптографическое рукопожатие не позволяет злоумышленникам «отравить» ваши приложения вредоносным ПО, а разработчики могут выпускать обновления, не теряя своей личности.

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

Что вы узнаете из этой статьи
  • Почему каждое Android-приложение должно быть подписано и какая криптография при этом используется (RSA/EC).
  • Разница между схемами подписи v1 (JAR), v2, v3 и v4 и какую из них ваше приложение должно использовать сегодня.
  • Как Android решает, разрешить ли обновление на основе непрерывности подписи.
  • Как ротация ключей позволяет разработчику изменить свой ключ подписи, не нарушая существующие установки.
  • Как проверить подпись любого APK самостоятельно, в командной строке или с помощью нашего браузерный верификатор.

Что такое подписание приложений?

По своей сути подписание приложения — это процесс, в котором разработчик использует Закрытый ключ для создания блока подписи для файлов своего приложения. Соответствующий Открытый ключ затем встраивается в APK в папку META-INF. Когда ваш телефон пытается установить приложение, он использует открытый ключ, чтобы проверить, соответствует ли подпись содержимому файла.

Это обеспечивает два основных свойства:

  1. Неизменяемость: Если хотя бы один байт кода приложения будет изменен (например, трояном), подпись перестанет соответствовать файлу и Android откажется его устанавливать.
  2. Подтверждение личности: Если приложение пытается обновить существующее, их подписи должны совпадать. Вот почему вы не можете установить поддельное приложение Facebook поверх официального.

Эволюция схем подписи

Google постоянно совершенствует механизм подписи, чтобы повысить скорость и безопасность:

Почему сертификаты важны для загрузки неопубликованных приложений

Когда вы загружаете APK из неофициального источника, хеширование сертификатов — ваш лучший друг. Отпечаток сертификата (например, хеш SHA-256) однозначно идентифицирует ключ подписи разработчика. Каждое приложение сохраняет один и тот же ключ подписи во всех своих обновлениях, поэтому вы можете сравнить отпечаток APK с опубликованным значением разработчика, чтобы подтвердить его подлинность.

Если вы подозреваете, что APK является поддельным, вам следует запустить его через Онлайн-проверка APK. Наш инструмент покажет вам:

Как Android проверяет подпись во время установки

Шаг «проверка сертификата» так часто замалчивается, что стоит подробно рассказать о том, что на самом деле делает ОС, когда вы нажимаете на APK, и Android решает, устанавливать ли его:

  1. Откройте APK в формате ZIP и найдите блок подписи. Для подписей v2/v3 это структурированный блок непосредственно перед центральным каталогом; для устаревшей схемы v1 это содержимое META-INF/*.RSA, *.DSA или *.EC.
  2. Вычислите дайджесты SHA-256 каждого второго байта APK. Подписывающий блок исключен из собственного дайджеста; все остальное хэшируется в определенных фрагментах.
  3. Сверьте дайджест каждого фрагмента с дайджестами, записанными в подписывающем блоке. Если с момента подписания файла разработчиком был изменен хотя бы один байт, дайджесты не будут совпадать, и установка будет отклонена с общей ошибкой «Приложение не установлено».
  4. Убедитесь, что сам блок подписи создан с использованием закрытого ключа сертификата. Открытый ключ сертификата используется для проверки криптографической подписи в блоке. Успешная проверка означает, что тот, кто подписал файл, обладал закрытым ключом, связанным с этим сертификатом.
  5. Сравните отпечаток сертификата с любой существующей установкой пакета с тем же именем. Если пакет уже установлен и новый APK подписан другим сертификатом, установка отклоняется с помощью INSTALL_FAILED_UPDATE_INCOMPATIBLE. Это основная защита ОС от выдачи себя за другое лицо: злоумышленник не может заменить ваше банковское приложение своей собственной копией, если он также не украл ключ подписи банка.

Ничто из этого не доказывает, что разработчик заслуживает доверия, а только то, что файл, который вы собираетесь установить, побайтно идентичен тому, что он подписал, и что никакая другая сторона не вмешалась в него. Доверие к разработчику — это отдельное решение, которое вы принимаете, решая, из каких источников вы устанавливаете.

Что на самом деле означает «несоответствие подписей»

Самый распространенный сюрприз, с которым сталкиваются пользователи при сторонней установке, — это ошибка «несовпадение подписи» при обновлении. Вот что происходит на самом деле:

На практике это происходит двумя способами:

  1. Сторонний APK действительно получен от другого издателя, например представляет собой «модифицированную» или «пропатченную» копию. Отказ от установки — правильное поведение; его установка означала бы доверить незнакомцу те же данные, с которыми уже работало ваше банковское приложение.
  2. Сторонний APK — перезалив официального APK, но система подписи приложений Google Play подписывает каждую загрузку пользователя с помощью пользовательской оболочки загрузить ключ. Два устройства иногда могут видеть несколько разные данные подписи для одной и той же концептуальной версии приложения. В этом случае отпечаток сертификата в корне все еще совпадает; вы можете проверить с помощью нашего APK-верификатор.

Если отпечаток сертификата действительно отличается от вашей существующей установки, единственный выход — сначала удалить текущую копию (с потерей ее данных) перед загрузкой замены, но никогда не отключать проверку подписи.

Генерация собственного ключа подписи (для разработчиков)

Если вы создаете приложения для Android, вам в конечном итоге придется подписывать свои собственные сборки. Стандартная однострочная команда с использованием keytool из Java SDK:

keytool -genkeypair -v \
        -keystore my-release.keystore \
        -alias my-app -keyalg RSA -keysize 2048 \
        -validity 10000

Две вещи, которые нужно знать:

Для загруженных неопубликованных тестовых сборок подойдет неподписанное хранилище ключей отладки; для производства используйте защищенное паролем хранилище ключей с длительным сроком действия, хранящееся в автономной резервной копии.

Подтвердите личность приложения как профессионал

Не доверяйте общим именам файлов. Проверьте криптографическое ядро ​​ваших APK за считанные секунды.

Проверьте сертификаты сейчас

Распространенные ошибки подписания

  1. Самоподписанные сертификаты: большинство приложений Android являются самоподписанными. В отличие от SSL для веб-сайтов, не существует центрального удостоверяющего центра для подписания приложений Android. Вы должны доверять непосредственно разработчику.
  2. Сертификаты отладки: приложения, созданные для тестирования, используют общий отладочный ключ. Такие приложения никогда не должны публиковаться в открытом доступе и блокируются многими фильтрами безопасности.
  3. Потеря ключа: Если разработчик потеряет свое хранилище личных ключей, он может никогда снова обновить свое приложение. Им придется выпустить «новое» приложение с другим названием пакета.

Выбор правильной схемы подписи для вашего целевого SDK

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

Разработано и задокументировано Мстом Шафале Ведущий разработчик и архитектор пакетов Android • Проверено на Android 12–15.

Мст Шаефале поддерживает клиентское слияние XAPK/APKS, анализатор двоичных манифестов и инструменты подписи APK v1+v2 по адресу xapktoapk.com. Обнаружили устаревшую команду или изменение ОС? Отправить редакционную заметку.