Инструкция AndroidSoft

Подпись APK: что такое сертификат и зачем его сравнивать

Что такое подпись и сертификат APK, чем отличаются схемы v1–v4 и как по отпечатку SHA-256 понять, что файл выпустил тот же разработчик.

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

Коротко

  • Подпись — это криптографическая печать разработчика. Изменить файл так, чтобы подпись осталась прежней, без ключа разработчика нельзя.
  • Сертификат обычно сравнивают по отпечатку SHA-256 — строке из 64 символов.
  • Одинаковый сертификат у разных версий означает, что их подписал один и тот же ключ.
  • Другой сертификат — повод насторожиться: такой файл не встанет поверх установленного приложения.

Схемы подписи v1, v2, v3 и v4

Android поддерживает несколько схем подписи, и один файл часто подписан сразу несколькими.

  • v1 — старая схема на основе JAR. Её проверяют версии до Android 6 включительно.
  • v2 — подпись всего файла целиком, появилась в Android 7.0. Проверка быстрее и надёжнее.
  • v3 — появилась в Android 9. Позволяет разработчику сменить ключ и сохранить цепочку доверия: новые версии подписаны новым ключом, но Android знает, что он заменил старый.
  • v3.1 — уточнение v3 для Android 13 и новее, позволяет применить новый ключ только на свежих версиях системы.
  • v4 — вспомогательная подпись в отдельном файле .idsig для потоковой установки через adb. В обычных загрузках не встречается.

Как посмотреть сертификат самому

  1. Через apksigner. Утилита входит в Android SDK Build Tools. Команда apksigner verify --print-certs файл.apk проверит подпись и выведет отпечаток SHA-256 каждого сертификата.
  2. Через keytool. Команда keytool -printcert -jarfile файл.apk из состава Java покажет сертификат подписи v1.
  3. Сравните отпечаток. Возьмите отпечаток у версии, которой вы доверяете, например установленной из Google Play, и сверьте с новым файлом. Совпадение всех 64 символов означает, что ключ тот же.

Когда сертификат отличается

  • Приложение распространяется через Google Play App Signing. Google подписывает файлы своим ключом приложения, и у версий из Play отпечаток один и тот же. Если сторонний файл подписан иначе, это другая сборка.
  • Разработчик сменил ключ. При схеме v3 файл содержит и старый, и новый сертификат, и Android примет обновление. Без v3 смена ключа означает, что приложение придётся переустановить.
  • Файл пересобран третьей стороной. Модифицированные сборки подписаны чужим ключом. Поверх оригинального приложения они не встанут, и происхождение их кода неизвестно.

Как это выглядит на AndroidSoft

Для файлов, которые прошли проверку AndroidSoft, в блоке «Проверка файла AndroidSoft» показан отпечаток SHA-256 сертификата подписи. Рядом — пометка: совпадает ли он с прошлыми проверенными версиями приложения или сравнивать пока не с чем. Мы учитываем все сертификаты из схем v1–v3.1, чтобы плановая смена ключа не выглядела как подмена.

Если сертификат не совпал ни с одним из ранее проверенных, файл получает статус «На повторной проверке»: скачивание приостанавливается, а файл перепроверяется на следующий день. Сертификат читается из файла, криптографическая проверка подписи пока не выполняется. Это проверка соответствия файла, а не антивирусная проверка.

Вопросы и ответы

Подпись гарантирует, что в приложении нет вредного кода?

Нет. Подпись подтверждает только, кто выпустил файл и что его не изменили после подписи. Оценить поведение приложения она не помогает.

Почему у версии из Google Play и у файла разработчика с сайта разные отпечатки?

Если приложение использует Google Play App Signing, магазин переподписывает файлы ключом Google, а на сайте разработчик может подписывать своим ключом. Такие версии не обновляют друг друга.

Можно ли сменить подпись у установленного приложения?

Только удалив его и установив файл с другой подписью. Данные приложения при этом будут потеряны.