Подписване на приложения за Android: как работи и защо има значение
Всеки път, когато инсталирате приложение на телефона си с Android, във фонов режим се извършва тиха, но критична проверка на сигурността. Телефонът ви проверява цифров подпис на APK пакета. Това криптографско ръкостискане е това, което не позволява на злонамерените хакери да „тровят“ вашите приложения със злонамерен софтуер, като същевременно гарантира, че разработчиците могат да изпращат актуализации, без да губят самоличността си.
Ако пишете приложения, подписването е нещо, което просто трябва да направите правилно; ако просто обичате да се занимавате с Android, това е една от най-удовлетворяващите части на системата за разбиране. Така или иначе, как работи подписването на приложения си заслужава вашето време. По-долу ще разгледаме технологията, как са се развили схемите за подписване и как можете да ръчна проверка на сертификати онлайн.
- Защо всяко приложение за Android трябва да бъде подписано и каква криптография е включена (RSA / EC).
- Разликата между схемите за подписи v1 (JAR), v2, v3 и v4 и коя трябва да използва вашето приложение днес.
- Как Android решава дали да разреши актуализация въз основа на непрекъснатостта на подписа.
- Как ротацията на ключове позволява на програмист да промени своя ключ за подписване, без да прекъсва съществуващите инсталации.
- Как сами да проверите подписа на всеки APK, на командния ред или с нашия базиран на браузър верификатор.
Какво е подписване на приложения?
В основата си подписването на приложение е процес, при който програмист използва Личен ключ, за да генерира блок за подпис за файловете на своето приложение. След това съответният Публичен ключ се вгражда в APK в папката META-INF. Когато телефонът ви се опита да инсталира приложението, той използва публичния ключ, за да провери дали подписът съответства на съдържанието на файла.
Това осигурява две основни свойства:
- Неизменност: Ако един байт от кода на приложението бъде променен (напр. от троянски кон), подписът вече няма да съответства на файла и Android ще откаже да го инсталира.
- Доказателство за самоличност: Ако дадено приложение се опита да актуализира съществуващо, техните подписи трябва да съвпадат. Ето защо не можете да инсталирате манипулирано приложение на Facebook вместо официалното.
Еволюция на схемите за подписване
Google непрекъснато надгражда механизма за подписване, за да подобри както скоростта, така и сигурността:
- V1 (подписване на буркан): Подписва отделни файлове в APK (ZIP). Това е бавно, защото операционната система трябва да разархивира и проверява всеки файл. Освен това е уязвим към определени ZIP манипулации.
- V2 (схема за подпис на APK): Подписва целия двоичен блок на APK. Не изисква разархивиране за проверка, което го прави невероятно бързо. Той беше представен в Android 7.0 (Nougat).
- V3 (завъртане на клавиши): Разширява V2 чрез добавяне на "родословие" от ключове. Позволява на разработчика да докаже, че нов ключ е упълномощен наследник на по-стар. Въведено в Android 9.0 (Pie).
- V4 (Поточно подписване): Създаден специално за инкрементални инсталации, позволявайки приложенията да бъдат проверявани, докато все още се изтеглят през USB или Wi-Fi.
Защо сертификатите са важни за страничното зареждане
Когато изтеглите APK от неофициален източник, Хеширане на сертификат е вашият най-добър приятел. Пръстов отпечатък на сертификат (като хеш SHA-256) идентифицира уникално ключа за подписване на разработчика. Всяко приложение запазва един и същ ключ за подписване във всичките си актуализации, така че можете да сравните пръстовия отпечатък на APK с публикуваната от разработчика стойност, за да потвърдите, че е оригинален.
Ако подозирате, че APK е фалшив, трябва да го пуснете през нашия Онлайн APK верификатор. Нашият инструмент ще ви покаже:
- Общо име (CN) на подписалия (напр. „Android“).
- Период на валидност на сертификата.
- Пръстови отпечатъци SHA-1/SHA-256.
Как Android проверява подпис по време на инсталиране
Стъпката „потвърдете сертификата“ толкова често се загърбва, че си струва да разгледате какво всъщност прави операционната система, когато докоснете APK и Android реши дали да го инсталира:
- Отворете APK като ZIP и намерете блока за подписване. За подписи v2/v3, който е структуриран блок непосредствено преди централната директория; за наследената схема v1 това е съдържанието на META-INF/*.RSA, *.DSA или *.EC.
- Изчислете SHA-256 обобщения на всеки друг байт на APK. Подписващият блок е изключен от своя собствен дайджест; всичко останало се хешира на определени парчета.
- Проверете дайджеста на всяка част спрямо дайджестите, записани в блока за подписване. Ако дори един байт е бил променен, откакто разработчикът е подписал файла, дайджестите няма да съвпадат и инсталирането се отхвърля с обща грешка „Приложението не е инсталирано“.
- Уверете се, че самият блок за подписване е произведен с частния ключ на сертификата. Публичният ключ на сертификата се използва за проверка на криптографския подпис в блока. Успешна проверка означава, че всеки, който е подписал файла, е притежавал частния ключ, свързан с този сертификат.
- Сравнете пръстовия отпечатък на сертификата с всяка съществуваща инсталация на същото име на пакет. Ако пакетът вече е инсталиран и новият APK е подписан с различен сертификат, инсталирането се отхвърля с INSTALL_FAILED_UPDATE_INCOMPATIBLE. Това е основната защита на операционната система срещу имитиране: злонамерен играч не може да замени вашето банково приложение със собствено копие, освен ако не е откраднал и ключа за подписване на банката.
Нищо от това не доказва, че разработчикът заслужава доверие, а само че файлът, който ще инсталирате, е байтово идентичен с това, което са подписали и че никоя друга страна не го е подправяла. Доверието на разработчика е отделно решение и това, което вие вземате, като решите от кои източници да инсталирате.
Какво всъщност означава „несъответствие на подписа“.
Единствената най-честа изненада, която хората срещат при странично зареждане, е грешката „несъответствие на подписа“ при актуализация. Ето какво всъщност се случва:
- Имате инсталиран Приложение X версия 1.0 от Play Store.
- Изтегляте Приложение X версия 1.1 от източник, различен от Play.
- Операционната система вижда същото име на пакет (com.example.app), но APK е подписан с различен сертификат (ключа за подписване на страничния източник, а не на оригиналния издател). Отказва да се инсталира.
На практика това се случва по два начина:
- APK на трета страна е наистина от друг издател, например „модифицирано“ или „поправено“ копие. Отказът от инсталиране е правилното поведение; инсталирането му би означавало да се доверите на непознат със същите данни, които приложението на вашата банка вече е докоснало.
- 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
Две неща, които трябва да знаете:
- валидност има значение: 10 000 дни (приблизително 27 години) е конвенционалната стойност, тъй като операционната система третира актуализациите, подписани с почти изтекъл или изтекъл ключ, като компрометирани. Веднъж генерирайте дълготраен ключ и го защитете.
- Веднъж публикувани, не можете лесно да превключвате клавишите. Схемата за подписване v3 добавя ключ въртене като изрична функция: стар сертификат „благославя“ нов чрез съхранено доказателство, което позволява на операционната система да приема актуализации от новия ключ, като същевременно запазва непрекъснатостта на самоличността. Без v3, загубата на оригиналния ключ означава прекъсване на всички съществуващи инсталации.
За странично заредени тестови компилации, неподписано хранилище за ключове за отстраняване на грешки е добре; за производство използвайте защитено с парола хранилище за ключове с дълга валидност, съхранено в офлайн архивиране.
Потвърдете идентичността на приложението като професионалист
Не се доверявайте на общи имена на файлове. Проверете криптографското сърце на вашите APK за секунди.
Проверете сертификатите сегаЧесто срещани клопки при подписване
- Самоподписани сертификати: Повечето приложения за Android са самоподписани. За разлика от SSL за уебсайтове, няма централен орган за подписване на приложения за Android. Трябва да се доверите директно на разработчика.
- Сертификати за отстраняване на грешки: Приложенията, създадени за тестване, използват общ ключ за отстраняване на грешки. Тези приложения никога не трябва да се пускат публично и се блокират от много филтри за сигурност.
- Загуба на ключ: Ако разработчик загуби частното си хранилище за ключове, той може да никога актуализира приложението си отново. Те ще трябва да пуснат „Ново“ приложение с различно име на пакет.
Избор на правилната схема за подписване за вашия целеви SDK
Подписването на приложения тихо е в основата на голяма част от сигурността на Android. След като връзката частен/публичен ключ щракне, можете да прецените странично зареденото приложение по достойнствата му и да потвърдите, че това, което инсталирате, не е променено, откакто разработчикът го е подписал. За повече относно вътрешните функции на Android вижте нашия ръководство за формата XAPK.