Podepisování aplikací pro Android: Jak to funguje a proč na tom záleží

A brass key on a smartphone showing a verified checkmark, illustrating Android app signing

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.

Co se dozvíte v tomto článku
  • 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:

  1. 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.
  2. 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í:

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:

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:

  1. 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.
  2. 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.
  3. 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“.
  4. 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.
  5. 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:

V praxi se to děje dvěma způsoby:

  1. 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.
  2. 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:

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áty

Běžná úskalí podepisování

  1. 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.
  2. 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.
  3. 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.

Navrhl a zdokumentoval Mst Shaefale Vedoucí vývojář a architekt balíčku Android • Ověřeno na Androidu 12–15

Mst Shaefale spravuje nástroje pro slučování XAPK/APKS na straně klienta, analyzátor binárních manifestů a nástroje pro podepisování APK v1+v2 na xapktoapk.com. Zaznamenali jste zastaralý příkaz nebo změnu operačního systému? Pošlete redakční poznámku.