La firma dell'app consente agli sviluppatori di identificare l'autore dell'app e di aggiornarla senza creare interfacce e autorizzazioni complesse. Ogni app eseguita sulla piattaforma Android deve essere firmata dallo sviluppatore. Le app che tentano di essere installate senza essere firmate vengono rifiutate da Google Play o dal programma di installazione del pacchetto sul dispositivo Android.
Su Google Play, la firma dell'app collega la fiducia che Google ha allo sviluppatore e a quella che quest'ultimo ha nei confronti della sua app. Gli sviluppatori sanno che la loro app è fornita al dispositivo Android, non modificata. Gli sviluppatori possono essere ritenuti responsabili del comportamento della loro app.
Su Android, la firma dell'app è il primo passo per inserire un'app nella relativa sandbox. Il certificato dell'app firmato definisce quale ID utente è associato a quale app; app diverse vengono eseguite con ID utente diversi. La firma dell'app garantisce che un'app non possa accedere a nessun'altra app, tranne tramite IPC ben definiti.
Quando un'app (file APK) viene installata su un dispositivo Android, Package Manager verifica che l'APK sia stato firmato correttamente con il certificato incluso nell'APK. Se il certificato (o, più precisamente, la chiave pubblica al suo interno) corrisponde alla chiave utilizzata per firmare qualsiasi altro APK sul dispositivo, il nuovo APK ha la possibilità di specificare nel file manifest che condivide un UID con gli altri APK firmati in modo simile.
Le app possono essere firmate da terze parti (OEM, operatore, mercato alternativo) o essere autofirmate. Android fornisce la firma codice tramite certificati autofirmati che gli sviluppatori possono generare senza assistenza o autorizzazioni esterne. Le app non devono essere firmate da un'autorità centrale. Al momento Android non esegue la verifica CA per i certificati delle app.
Le app sono inoltre in grado di dichiarare le autorizzazioni di sicurezza a livello di protezione della firma, limitando l'accesso solo alle app firmate con la stessa chiave, mantenendo al contempo UID e sandbox dell'applicazione distinti. È consentito un rapporto più stretto con una sandbox dell'applicazione condivisa utilizzando la funzionalità UID condiviso, in cui due o più app firmate con la stessa chiave sviluppatore possono dichiarare un UID condiviso nel file manifest.
Schemi di firma APK
Android supporta tre schemi di firma dell'app:
- Schema v1: basato sulla firma JAR
- Schema v2: Schema di firma dell'APK v2, introdotto in Android 7.0.
- Schema v3: Schema di firma dell'APK v3, introdotto in Android 9.
Per la massima compatibilità, firma le app con tutti gli schemi, prima con la versione 1, poi con la versione 2 e infine con la versione 3. I dispositivi Android 7.0 e versioni successive installano le app firmate con gli schemi v2 e versioni successive più rapidamente rispetto a quelle firmate solo con lo schema v1. Le piattaforme Android meno recenti ignorano le firme v2 e versioni successive e richiedono quindi che le app contengano firme v1.
Firma JAR (schema v1)
La firma dell'APK fa parte di Android fin dall'inizio. Si basa su file JAR firmati. Per maggiori dettagli sull'utilizzo di questo schema, consulta la documentazione di Android Studio sulla firma dell'app.
Le firme v1 non proteggono alcune parti dell'APK, ad esempio i metadati ZIP. Il verificatore APK deve elaborare molte strutture di dati non attendibili (non ancora verificate) e poi eliminare i dati non coperti dalle firme. Ciò offre una superficie di attacco di dimensioni considerevoli. Inoltre, il verificatore APK deve decomprimere tutte le voci compresse, consumando più tempo e memoria. Per risolvere questi problemi, Android 7.0 ha introdotto lo schema di firma dell'APK v2.
Schema di firma dell'APK v2 e v3 (schema v2+)
I dispositivi con Android 7.0 e versioni successive supportano lo schema di firma dell'APK v2 (schema v2) e versioni successive. Lo schema v2 è stato aggiornato alla versione 3 in Android 9 per includere informazioni aggiuntive nel blocco di firma, ma per il resto funziona allo stesso modo. I contenuti dell'APK vengono sottoposti ad hashing e firmati, quindi il blocco di firma dell'APK risultante viene inserito nell'APK. Per maggiori dettagli sull'applicazione dello schema v2+ a un'app, consulta Schema di firma dell'APK v2.
Durante la convalida, lo schema v2+ considera il file APK come un blob ed esegue il controllo della firma in tutto il file. Qualsiasi modifica all'APK, incluse le modifiche ai metadati ZIP, invalida la firma dell'APK. Questa forma di verifica dell'APK è molto più rapida e consente di rilevare più classi di modifiche non autorizzate.
Il nuovo formato è compatibile con le versioni precedenti, pertanto gli APK firmati con il nuovo formato di firma possono essere installati sui dispositivi Android meno recenti (che ignorano semplicemente i dati aggiuntivi aggiunti all'APK), purché questi APK siano firmati anche con v1.
L'hash dell'intero file dell'APK viene verificato in base alla firma v2 o successiva memorizzata nel blocco di firma dell'APK. L'hash copre tutto tranne il blocco di firma dell'APK, che contiene la firma v2 e versioni successive. Qualsiasi modifica all'APK al di fuori del blocco di firma dell'APK invalida la firma v2 e successive dell'APK. Anche gli APK con la firma v2+ rimossa vengono rifiutati, perché la firma v1 specifica che l'APK era firmato v2, perciò Android 7.0 e versioni successive si rifiutano di verificare gli APK utilizzando le firme v1.
Per informazioni dettagliate sulla procedura di verifica della firma dell'APK, consulta la sezione Verifica dello schema di firma dell'APK v2.