Android 7.0 funziona in modalità Avvio diretto sicura quando il dispositivo è stato acceso, ma l'utente non lo ha sbloccato. A questo scopo, il sistema fornisce due posizioni di archiviazione per i dati:
- Spazio di archiviazione criptato delle credenziali, che è la posizione di archiviazione predefinita e disponibile solo dopo che l'utente ha sbloccato il dispositivo.
- Spazio di archiviazione criptato del dispositivo, ovvero un percorso di archiviazione disponibile sia durante la modalità di avvio diretto sia dopo che l'utente ha sbloccato il dispositivo.
Per impostazione predefinita, le app non vengono eseguite in modalità Avvio diretto. Se la tua app deve intervenire durante la modalità Avvio diretto, puoi registrare i componenti dell'app da eseguire in questa modalità. Ecco alcuni casi d'uso comuni per le app che devono essere eseguite durante la modalità di avvio diretto:
- App con notifiche programmate, ad esempio le app sveglia.
- App che forniscono notifiche importanti per gli utenti, ad esempio le app per SMS.
- App che forniscono servizi di accessibilità, come TalkBack.
Se la tua app deve accedere ai dati durante l'esecuzione in modalità di avvio diretto, utilizza lo spazio di archiviazione criptato del dispositivo. Lo spazio di archiviazione criptato del dispositivo contiene dati criptati con una chiave disponibile solo dopo che un dispositivo ha eseguito un avvio verificato riuscito.
Per i dati che devono essere criptati con una chiave associata alle credenziali dell'utente, ad esempio un PIN o una password, utilizza l'archiviazione con crittografia delle credenziali. Lo spazio di archiviazione con crittografia delle credenziali è disponibile dopo che l'utente ha sbloccato correttamente il dispositivo e fino a quando non lo riavvia. Se l'utente attiva la schermata di blocco dopo aver sbloccato il dispositivo, lo spazio di archiviazione criptato delle credenziali rimane disponibile.
Richiedi l'accesso per l'esecuzione durante il boot diretto
Le app devono registrare i propri componenti con il sistema prima di poter essere eseguite in modalità di avvio diretto o accedere allo spazio di archiviazione criptato del dispositivo. Le app si registrano al sistema contrassegnando i componenti come
consapevoli della crittografia. Per contrassegnare il componente come consapevole della crittografia, imposta l'attributo android:directBootAware
su true nel manifest.
I componenti a conoscenza della crittografia possono registrarsi per ricevere un messaggio di broadcastACTION_LOCKED_BOOT_COMPLETED
dal sistema quando il dispositivo è stato riavviato. A questo punto, lo spazio di archiviazione criptato del dispositivo è disponibile e il componente può eseguire le attività che devono essere eseguite durante la modalità Avvio diretto, ad esempio l'attivazione di una sveglia programmata.
Il seguente snippet di codice è un esempio di come registrare un BroadcastReceiver
come consapevole della crittografia e aggiungere un filtro per intent per ACTION_LOCKED_BOOT_COMPLETED
nel manifest dell'app:
<receiver android:directBootAware="true" > ... <intent-filter> <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /> </intent-filter> </receiver>
Una volta che l'utente ha sbloccato il dispositivo, tutti i componenti possono accedere sia allo spazio di archiviazione criptato del dispositivo sia allo spazio di archiviazione criptato delle credenziali.
Accedere allo spazio di archiviazione criptato del dispositivo
Per accedere allo spazio di archiviazione criptato del dispositivo, crea una seconda istanzaContext
chiamandoContext.createDeviceProtectedStorageContext()
. Tutte le chiamate all'API di archiviazione eseguite utilizzando questo contesto accedono allo spazio di archiviazione criptato del dispositivo. L'esempio seguente accede allo spazio di archiviazione criptato del dispositivo e apre un file di dati dell'app esistente:
Kotlin
val directBootContext: Context = appContext.createDeviceProtectedStorageContext() // Access appDataFilename that lives in device encrypted storage val inStream: InputStream = directBootContext.openFileInput(appDataFilename) // Use inStream to read content...
Java
Context directBootContext = appContext.createDeviceProtectedStorageContext(); // Access appDataFilename that lives in device encrypted storage FileInputStream inStream = directBootContext.openFileInput(appDataFilename); // Use inStream to read content...
Utilizza lo spazio di archiviazione criptato del dispositivo solo per le informazioni che devono essere accessibili durante la modalità di avvio diretto. Non utilizzare lo spazio di archiviazione criptato del dispositivo come archivio criptato generico. Per le informazioni private dell'utente o per i dati criptati non necessari durante la modalità di avvio diretto, utilizza lo spazio di archiviazione con crittografia delle credenziali.
Ricevere una notifica sullo sblocco da parte dell'utente
Quando l'utente sblocca il dispositivo dopo il riavvio, la tua app può passare all'accesso allo spazio di archiviazione criptato con le credenziali e utilizzare i normali servizi di sistema che dipendono dalle credenziali utente.
Per ricevere una notifica quando l'utente sblocca il dispositivo dopo un riavvio,
registra un BroadcastReceiver
da un componente in esecuzione
per ascoltare i messaggi di notifica di sblocco. Quando l'utente sblocca il dispositivo
dopo l'avvio:
- Se la tua app ha processi in primo piano che richiedono una notifica immediata,
ascolta il messaggio
ACTION_USER_UNLOCKED
. - Se la tua app utilizza solo processi in background che possono agire su una notifica con ritardo, ascolta il messaggio
ACTION_BOOT_COMPLETED
.
Se l'utente ha sbloccato il dispositivo, puoi scoprirlo chiamando
UserManager.isUserUnlocked()
.
Esegui la migrazione dei dati esistenti
Se un utente aggiorna il proprio dispositivo per utilizzare la modalità di avvio diretto, potresti avere dei dati esistenti che devono essere migrati allo spazio di archiviazione criptato del dispositivo. Utilizza
Context.moveSharedPreferencesFrom()
e
Context.moveDatabaseFrom()
, con il contesto di destinazione come chiamante del metodo e il contesto di origine come argomento, per eseguire la migrazione delle preferenze e dei dati del database tra lo spazio di archiviazione con crittografia delle credenziali e lo spazio di archiviazione con crittografia del dispositivo.
Non eseguire la migrazione delle informazioni private dell'utente, come password o token di autorizzazione, dallo stoccaggio criptato delle credenziali allo stoccaggio criptato del dispositivo. Usa il tuo buon senso per decidere quali altri dati eseguire la migrazione allo spazio di archiviazione criptato del dispositivo. In alcuni casi, potrebbe essere necessario gestire set di dati distinti nei due store criptati.
Testa la tua app che supporta la crittografia
Testa la tua app con crittografia con la modalità di avvio diretto abilitata.
La maggior parte dei dispositivi con versioni recenti di Android attiva la modalità Avvio diretto ogni volta che è stata impostata una credenziale della schermata di blocco (PIN, sequenza o password). Nello specifico, questo accade su tutti i dispositivi che utilizzano la crittografia basata su file. Per verificare se un dispositivo utilizza la crittografia basata su file, esegui il seguente comando shell:
adb shell getprop ro.crypto.type
Se l'output è file
, la crittografia basata su file è attivata sul dispositivo.
Sui dispositivi che non utilizzano la crittografia basata su file per impostazione predefinita, potrebbero essere disponibili altre opzioni per testare la modalità di avvio diretto:
-
Alcuni dispositivi che utilizzano la crittografia integrale del disco (
ro.crypto.type=block
) e che eseguono Android 7.0 fino ad Android 12 possono essere convertiti alla crittografia basata su file. Esistono due metodi per effettuare questa operazione:- Sul dispositivo, se non l'hai ancora fatto, attiva le Opzioni sviluppatore andando a Impostazioni > Informazioni sullo smartphone e toccando Numero build sette volte. Poi vai a Impostazioni > Opzioni sviluppatore e seleziona Converti in crittografia file.
- In alternativa, esegui i seguenti comandi shell:
adb reboot-bootloader
fastboot --wipe-and-use-fbe
Avviso: entrambi i metodi di conversione alla crittografia basata su file cancellano tutti i dati utente sul dispositivo.
-
I dispositivi con Android 13 o versioni precedenti supportano una modalità di avvio diretto "simulata" che utilizza le autorizzazioni dei file per simulare gli effetti del blocco e dello sblocco dei file criptati. Utilizza la modalità simulata solo durante lo sviluppo, poiché può causare la perdita di dati. Per attivare la modalità di avvio diretto simulata, imposta una sequenza di blocco sul dispositivo, scegli "No grazie" se ti viene chiesto di impostare una schermata di avvio sicura quando imposti una sequenza di blocco, quindi esegui il seguente comando shell:
adb shell sm set-emulate-fbe true
Per disattivare la modalità di avvio diretto emulata, esegui il seguente comando della shell:
adb shell sm set-emulate-fbe false
L'esecuzione di uno di questi comandi provoca il riavvio del dispositivo.
Controllare lo stato della crittografia dei criteri del dispositivo
Le app di amministrazione del dispositivo possono utilizzare
DevicePolicyManager.getStorageEncryptionStatus()
per controllare lo stato attuale della crittografia del dispositivo.
Se la tua app ha come target un livello API inferiore ad Android 7.0 (API 24),
getStorageEncryptionStatus()
restituisce
ENCRYPTION_STATUS_ACTIVE
se il dispositivo utilizza la crittografia completa del disco
o la crittografia basata su file con Direct Boot. In entrambi i casi, i dati vengono sempre archiviati criptati at-rest.
Se la tua app ha come target Android 7.0 (API 24) o versioni successive,
getStorageEncryptionStatus()
restituisce
ENCRYPTION_STATUS_ACTIVE
se il dispositivo utilizza la crittografia completa del disco. Restituisce
ENCRYPTION_STATUS_ACTIVE_PER_USER
se il dispositivo utilizza la crittografia basata su file
con Direct Boot.
Se crei un'app di amministrazione del dispositivo rivolta ad Android 7.0, assicurati di controllare sia ENCRYPTION_STATUS_ACTIVE
sia ENCRYPTION_STATUS_ACTIVE_PER_USER
per determinare se il dispositivo è criptato.
Altri esempi di codice
L'esempio DirectBoot dimostra ulteriormente l'utilizzo delle API trattate in questa pagina.