Podepisování aplikací pro Android: Jak to funguje a proč na tom záleží
Pokaždé, když do telefonu Android nainstalujete aplikaci, proběhne na pozadí tichá, ale kritická bezpečnostní kontrola. Váš telefon ověří digitální podpis balíčku APK. Tento kryptografický handshake zabraňuje škodlivým hackerům „otrávit“ vaše aplikace malwarem a zároveň zajišťuje, že vývojáři mohou zasílat aktualizace bez ztráty své identity.
Pokud píšete aplikace, podepisování je něco, co jednoduše musíte udělat správně; pokud si jen rádi hrajete s Androidem, je to jedna z nejuspokojivějších částí systému, kterou je třeba pochopit. Ať tak či onak, jak funguje podepisování aplikací stojí za váš čas. Níže si projdeme technologii, jak se vyvíjela schémata podepisování a jak můžete ručně ověřit certifikáty online.
- Proč musí být podepsána každá aplikace pro Android a o jakou kryptografii se jedná (RSA / EC).
- Rozdíl mezi schématy podpisů v1 (JAR), v2, v3 a v4 a mezi schématy podpisů, které by vaše aplikace měla používat dnes.
- Jak se Android rozhoduje, zda povolit aktualizaci na základě kontinuity podpisu.
- Jak rotace klíčů umožňuje vývojáři změnit svůj podpisový klíč, aniž by narušil stávající instalace.
- Jak sami ověřit podpis libovolného souboru APK, na příkazovém řádku nebo pomocí našeho ověřovatel založený na prohlížeči.
Co je to podepisování aplikací?
Ve svém jádru je podepisování aplikací proces, kdy vývojář používá Soukromý klíč ke generování podpisového bloku pro soubory své aplikace. Odpovídající Veřejný klíč je pak vložen do APK ve složce META-INF. Když se váš telefon pokusí nainstalovat aplikaci, použije veřejný klíč ke kontrole, zda podpis odpovídá obsahu souboru.
To poskytuje dvě hlavní vlastnosti:
- Neměnnost: Pokud se změní jeden bajt kódu aplikace (např. trojským koněm), podpis již nebude odpovídat souboru a Android jej odmítne nainstalovat.
- Doklad o totožnosti: Pokud se aplikace pokusí aktualizovat existující, jejich podpisy se musí shodovat. To je důvod, proč nemůžete nainstalovat zmanipulovanou aplikaci Facebook přes oficiální aplikaci.
Vývoj podpisových schémat
Google neustále upgradoval mechanismus podepisování s cílem zlepšit rychlost i zabezpečení:
- V1 (podpis jaru): Podepisuje jednotlivé soubory v rámci APK (ZIP). To je pomalé, protože OS musí rozbalit a zkontrolovat každý soubor. Je také zranitelný vůči určitým manipulacím ZIP.
- V2 (podpisové schéma APK): Podepíše celý binární blok souboru APK. K ověření nevyžaduje rozbalení, takže je neuvěřitelně rychlý. Byl představen v Androidu 7.0 (Nougat).
- V3 (otočení kláves): Rozšiřuje V2 přidáním „řady“ klíčů. Umožňuje vývojáři prokázat, že nový klíč je autorizovaným nástupcem staršího klíče. Představeno v systému Android 9.0 (Pie).
- V4 (podepisování streamováním): Navrženo speciálně pro přírůstkové instalace, které umožňuje ověřovat aplikace, zatímco se stále stahují přes USB nebo Wi-Fi.
Proč jsou certifikáty důležité pro Sideloading
Když si stáhnete APK z neoficiálního zdroje, Hashování certifikátu je váš nejlepší přítel. Otisk certifikátu (jako je hash SHA-256) jednoznačně identifikuje podpisový klíč vývojáře. Každá aplikace si uchovává stejný podpisový klíč ve všech svých aktualizacích, takže můžete porovnat otisk souboru APK s hodnotou publikovanou vývojářem a potvrdit, že je pravý.
Pokud máte podezření, že je soubor APK falešný, měli byste jej spustit prostřednictvím našeho Online ověřovač APK. Náš nástroj vám ukáže:
- Common Name (CN) signatáře (např. „Android“).
- Doba platnosti certifikátu.
- Model otisky prstů SHA-1/SHA-256.
Jak Android ověřuje podpis v době instalace
Krok „ověření certifikátu“ je tak často opomíjen, že stojí za to projít si, co OS skutečně dělá, když klepnete na soubor APK a Android se rozhodne, zda jej nainstalovat:
- Otevřete soubor APK jako ZIP a najděte blok podpisu. Pro podpisy v2/v3, což je strukturovaný blok bezprostředně před centrálním adresářem; pro starší schéma v1 je to obsah META-INF/*.RSA, *.DSA nebo *.EC.
- Vypočítejte SHA-256 digesty každého druhého bajtu souboru APK. Podpisový blok je vyloučen ze svého vlastního výtahu; vše ostatní je hašováno v definovaných blocích.
- Ověřte výtah každého bloku proti výtahům zaznamenaným v podpisovém bloku. Pokud byl od podepsání souboru vývojářem změněn byť jen jeden bajt, výtahy se nebudou shodovat a instalace bude odmítnuta s obecnou chybou „Aplikace není nainstalována“.
- Ověřte, že samotný blok podpisu byl vytvořen pomocí soukromého klíče certifikátu. Veřejný klíč certifikátu se používá ke kontrole kryptografického podpisu v bloku. Úspěšná kontrola znamená, že kdokoli podepsal soubor, vlastnil soukromý klíč spárovaný s tímto certifikátem.
- Porovnejte otisk certifikátu s jakoukoli existující instalací se stejným názvem balíčku. Pokud je balíček již nainstalován a nový soubor APK je podepsán jiným certifikátem, bude instalace zamítnuta pomocí INSTALL_FAILED_UPDATE_INCOMPATIBLE. Toto je hlavní obrana operačního systému proti napodobování identity: zlomyslný hráč nemůže nahradit vaši bankovní aplikaci svou vlastní kopií, pokud také neukradl podpisový klíč banky.
Nic z toho nedokazuje, že vývojář je důvěryhodný, pouze to, že soubor, který se chystáte nainstalovat, je bajtově identický s tím, co podepsal, a že s ním žádná jiná strana nemanipulovala. Důvěra ve vývojáře je samostatným rozhodnutím a rozhodujete se, ze kterých zdrojů budete instalovat.
Co ve skutečnosti znamená „neshoda podpisů“
Jediným nejčastějším překvapením, které lidé při načítání z boku zasáhli, je chyba „nesoulad podpisu“ při aktualizaci. Zde je to, co se ve skutečnosti děje:
- Aplikace X verze 1.0 máte nainstalovaný z Obchodu Play.
- Aplikace X verze 1.1 stáhnete ze zdroje mimo Play.
- OS vidí stejný název balíčku (com.example.app), ale soubor APK je podepsán jiným certifikátem (podpisový klíč bočního zdroje, nikoli původní vydavatel). Odmítá instalaci.
V praxi se to děje dvěma způsoby:
- Soubor APK třetí strany je skutečně od jiného vydavatele, například „upravená“ nebo „opravená“ kopie. Odmítnout instalaci je správné chování; jeho instalace by znamenalo důvěřovat cizímu člověku se stejnými údaji, kterých se již dotkla aplikace vaší banky.
- Soubor APK třetí strany je opětovné nahrání oficiálního souboru APK, ale systém Google Play App Signing podepisuje stahování každého uživatele pomocí uživatelského obalu klíč pro nahrávání. Dvě zařízení mohou někdy vidět mírně odlišná data podpisu pro stejnou koncepční verzi aplikace. V takovém případě se otisk certifikátu v kořenovém adresáři stále shoduje; můžete ověřit pomocí našeho Ověřovač APK.
Pokud se otisk certifikátu skutečně liší od vaší stávající instalace, jedinou cestou vpřed je nejprve odinstalovat aktuální kopii (ztráta jejích dat) před vložením náhrady, nikdy nezakázat ověřování podpisu.
Vygenerování vlastního podpisového klíče (pro vývojáře)
Pokud vytváříte aplikace pro Android, budete nakonec muset podepsat své vlastní sestavení. Standardní jednořádkový příkaz používající keytool z Java SDK je:
keytool -genkeypair -v \
-keystore my-release.keystore \
-alias my-app -keyalg RSA -keysize 2048 \
-validity 10000
Dvě věci, které byste měli vědět:
- Na platnost záleží: 10 000 dní (zhruba 27 let) je konvenční hodnota, protože operační systém považuje aktualizace podepsané klíčem s téměř prošlou platností nebo s prošlou platností za kompromitované. Jednou vygenerujte klíč s dlouhou životností a chraňte jej.
- Po zveřejnění nelze klíče snadno přepínat. Schéma podepisování v3 přidává klíč otáčení jako explicitní funkci: starý certifikát „požehná“ novému prostřednictvím uloženého důkazu, což umožňuje OS přijímat aktualizace z nového klíče při zachování kontinuity identity. Bez v3 znamená ztráta původního klíče osamocení všech existujících instalací.
Pro testovací sestavení s bočním zatížením je nepodepsané úložiště klíčů pro ladění v pořádku; pro produkci použijte úložiště klíčů s dlouhou platností chráněné heslem uložené v offline záloze.
Ověřte identitu aplikace jako profesionál
Nedůvěřujte obecným názvům souborů. Zkontrolujte kryptografické jádro vašich APK během několika sekund.
Ověřte certifikátyBěžná úskalí podepisování
- Certifikáty s vlastním podpisem: Většina aplikací pro Android je podepsána sama sebou. Na rozdíl od SSL pro webové stránky neexistuje žádná centrální autorita pro podepisování aplikací pro Android. Musíte věřit přímo vývojáři.
- Certifikáty ladění: Aplikace vytvořené pro testování používají obecný „ladicí“ klíč. Tyto aplikace by nikdy neměly být zveřejněny a jsou blokovány mnoha bezpečnostními filtry.
- Ztráta klíče: Pokud vývojář ztratí své soukromé úložiště klíčů, může nikdy svou aplikaci znovu aktualizovat. Museli by vydat „Novou“ aplikaci s jiným názvem balíčku.
Výběr správného schématu podepisování pro vaši cílovou sadu SDK
Podepisování aplikací tiše podporuje zabezpečení Androidu. Jakmile klepne vztah soukromého/veřejného klíče, můžete posuzovat vedlejší aplikaci podle jejích předností a potvrdit, že to, co instalujete, se od podpisu vývojáře nezměnilo. Další informace o vnitřních částech systému Android naleznete v našem průvodce formátem XAPK.