Подписване на приложения за 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.

Проектиран и документиран от Mst Shaefale Водещ разработчик и архитект на пакети за Android • Проверен на Android 12–15

Mst Shaefale поддържа инструментите за подписване на XAPK/APKS от страна на клиента, парсер на бинарен манифест и APK v1+v2 в xapktoapk.com. Забележите остаряла команда или промяна на операционната система? Изпратете редакционна бележка.