Короткий ответ: каждый 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. В обычных загрузках не встречается.
Как посмотреть сертификат самому
- Через apksigner. Утилита входит в Android SDK Build Tools. Команда
apksigner verify --print-certs файл.apkпроверит подпись и выведет отпечаток SHA-256 каждого сертификата. - Через keytool. Команда
keytool -printcert -jarfile файл.apkиз состава Java покажет сертификат подписи v1. - Сравните отпечаток. Возьмите отпечаток у версии, которой вы доверяете, например установленной из 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, а на сайте разработчик может подписывать своим ключом. Такие версии не обновляют друг друга.
Можно ли сменить подпись у установленного приложения?
Только удалив его и установив файл с другой подписью. Данные приложения при этом будут потеряны.