La firma dell'applicazione consente agli sviluppatori di identificare l'autore dell'applicazione e di aggiornare la propria applicazione senza creare interfacce e autorizzazioni complicate. Ogni applicazione eseguita sulla piattaforma Android deve essere firmata dallo sviluppatore . Le applicazioni che tentano di installarsi senza essere firmate verranno rifiutate da Google Play o dal programma di installazione del pacchetto sul dispositivo Android.
Su Google Play, la firma delle applicazioni unisce la fiducia che Google ha nei confronti dello sviluppatore e la fiducia che lo sviluppatore ha nella sua applicazione. Gli sviluppatori sanno che la loro applicazione viene fornita, senza modifiche, al dispositivo Android; e gli sviluppatori possono essere ritenuti responsabili del comportamento della loro applicazione.
Su Android, la firma dell'applicazione è il primo passaggio per inserire un'applicazione nella sandbox dell'applicazione. Il certificato dell'applicazione firmata definisce quale ID utente è associato a quale applicazione; applicazioni diverse vengono eseguite con ID utente diversi. La firma dell'applicazione garantisce che un'applicazione non possa accedere a nessun'altra applicazione se non tramite IPC ben definito.
Quando un'applicazione (file APK) viene installata su un dispositivo Android, il Package Manager verifica che l'APK sia stato firmato correttamente con il certificato incluso in quell'APK. Se il certificato (o, più precisamente, la chiave pubblica nel certificato) corrisponde alla chiave utilizzata per firmare qualsiasi altro APK sul dispositivo, il nuovo APK ha la possibilità di specificare nel manifest che condividerà un UID con l'altro in modo simile -APK firmati.
Le applicazioni possono essere firmate da terzi (OEM, operatore, mercato alternativo) o autofirmate. Android fornisce la firma del codice utilizzando certificati autofirmati che gli sviluppatori possono generare senza assistenza o autorizzazione esterna. Le domande non devono essere firmate da un'autorità centrale. Android attualmente non esegue la verifica CA per i certificati delle applicazioni.
Le applicazioni sono inoltre in grado di dichiarare autorizzazioni di sicurezza al livello di protezione della firma, limitando l'accesso solo alle applicazioni firmate con la stessa chiave mantenendo UID e sandbox dell'applicazione distinti. Una relazione più stretta con una sandbox dell'applicazione condivisa è consentita utilizzando la funzionalità UID condiviso in cui due o più applicazioni firmate con la stessa chiave sviluppatore possono dichiarare un UID condiviso nel loro manifest.
Schemi di firma APK
Android supporta tre schemi di firma delle applicazioni:
- Schema v1: basato sulla firma JAR
- Schema v2: APK Signature Scheme v2 , introdotto in Android 7.0.
- Schema v3: APK Signature Scheme v3 , introdotto in Android 9.
Per la massima compatibilità, firma le applicazioni con tutti gli schemi, prima con v1, poi v2 e infine v3. I dispositivi Android 7.0 e versioni successive installano le app firmate con schemi v2+ più rapidamente rispetto a quelle firmate solo con lo schema v1. Le piattaforme Android meno recenti ignorano le firme v2+ e quindi necessitano che le app contengano le firme v1.
Firma JAR (schema v1)
La firma APK fa parte di Android fin dall'inizio. Si basa sul JAR firmato . 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, come i metadati ZIP. Il verificatore APK deve elaborare molte strutture di dati non attendibili (non ancora verificate) e quindi scartare i dati non coperti dalle firme. Ciò offre una superficie di attacco considerevole. 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 APK v2.
Schema firma APK v2 e v3 (schema v2+)
I dispositivi con Android 7.0 e versioni successive supportano lo schema di firma APK v2 (schema v2) e versioni successive. (Lo schema v2 è stato aggiornato alla v3 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 APK risultante viene inserito nell'APK. Per informazioni dettagliate sull'applicazione dello schema v2+ a un'app, consulta Schema di firma APK v2 .
Durante la convalida, lo schema v2+ tratta il file APK come un BLOB ed esegue il controllo della firma sull'intero file. Qualsiasi modifica all'APK, comprese le modifiche ai metadati ZIP, invalida la firma dell'APK. Questa forma di verifica dell'APK è sostanzialmente più veloce e consente il rilevamento di più classi di modifiche non autorizzate.
Il nuovo formato è retrocompatibile, quindi gli APK firmati con il nuovo formato di firma possono essere installati su dispositivi Android meno recenti (che ignorano semplicemente i dati aggiuntivi aggiunti all'APK), purché anche questi APK siano firmati v1.
L'hash dell'intero file dell'APK viene verificato rispetto alla firma v2+ archiviata nel blocco di firma dell'APK. L'hash copre tutto tranne il blocco firma APK, che contiene la firma v2+. Qualsiasi modifica all'APK esterna al Blocco firma APK invalida la firma v2+ dell'APK. Anche gli APK con firma v2+ rimossa vengono rifiutati, perché la firma v1 specifica che l'APK era firmato v2, il che fa sì che Android 7.0 e versioni successive si rifiutino di verificare gli APK utilizzando le firme v1.
Per dettagli sul processo di verifica della firma APK, consulta la sezione Verifica di APK Signature Scheme v2.