Firma dell'app

La firma dell'app consente agli sviluppatori di identificare l'autore dell'app e di aggiornarla senza creare interfacce e autorizzazioni complicate. Ogni app eseguita sulla piattaforma Android deve essere firmata dallo sviluppatore. Le app che tentano di installarsi senza essere firmate vengono rifiutate da Google Play o dall'installatore del pacchetto sul dispositivo Android.

Su Google Play, la firma dell'app colma il divario di fiducia tra Google e lo sviluppatore e tra lo sviluppatore e la sua app. Gli sviluppatori sanno che la loro app viene fornita, non modificata, al dispositivo Android e possono essere ritenuti responsabili del comportamento della loro app.

Su Android, la firma dell'app è il primo passaggio per inserire un'app nella sandbox dell'applicazione. Il certificato dell'app firmato definisce a quale ID utente è associata ciascuna 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 del codice utilizzando certificati autofirmati che gli sviluppatori possono generare senza assistenza o autorizzazione esterna. Le app non devono essere firmate da un'autorità centrale. Al momento Android non esegue la verifica dell'autorità di certificazione per i certificati delle app.

Le app sono inoltre in grado di dichiarare le autorizzazioni di sicurezza a livello di 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:

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 informazioni dettagliate 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 informazioni dettagliate sull'applicazione dello schema v2 o versioni successive a un'app, consulta Schema di firma dell'APK v2.

Durante la convalida, lo schema v2 e versioni successive tratta il file APK come un blob ed esegue il controllo della firma sull'intero 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 della firma possono essere installati sui dispositivi Android meno recenti (che ignorano semplicemente i dati aggiuntivi aggiunti all'APK), a condizione che questi APK siano firmati anche con la versione 1.

Procedura di verifica della firma dell'APK

Figura 1. Procedura di verifica della firma dell'APK

L'hash dell'intero file dell'APK viene verificato in base alla firma v2 e versioni successive 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 firma v2 o successive rimossa vengono rifiutati, perché la loro firma v1 specifica che l'APK è stato firmato con la versione v2, il che fa sì che Android 7.0 e versioni successive rifiutino di verificare gli APK utilizzando le loro firme v1.

Per informazioni dettagliate sulla procedura di verifica della firma dell'APK, consulta la sezione Verifica dello Schema di firma dell'APK v2.