Android 7.0 viene eseguito in modalità Avvio diretto sicura quando il dispositivo è stato acceso, ma l'utente non lo ha sbloccato. Per supportare questa funzionalità, il sistema fornisce due posizioni di archiviazione per i dati:
- Archivio 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 una posizione di archiviazione disponibile sia in modalità 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 eseguire un'azione durante la modalità Avvio diretto, puoi registrare i componenti dell'app da eseguire in questa modalità. Alcuni casi d'uso comuni per le app che devono essere eseguite in modalità Avvio diretto includono:
- App con notifiche programmate, come le app sveglia.
- App che forniscono notifiche importanti agli utenti, come 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à Avvio diretto, utilizza l'archivio criptato del dispositivo. L'archiviazione criptata del dispositivo contiene dati criptati con una chiave disponibile solo dopo che il dispositivo ha eseguito un avvio verificato riuscito.
Per i dati che devono essere criptati con una chiave associata alle credenziali utente, come un PIN o una password, utilizza l'archivio criptato con credenziali. L'archiviazione criptata delle credenziali è disponibile dopo che l'utente ha sbloccato correttamente il dispositivo e fino al riavvio. Se l'utente attiva la schermata di blocco dopo aver sbloccato il dispositivo, lo spazio di archiviazione criptato delle credenziali rimane disponibile.
Richiedere l'accesso per l'esecuzione durante l'avvio diretto
Le app devono registrare i propri componenti nel sistema prima di poter essere eseguite in modalità Avvio diretto o accedere allo spazio di archiviazione criptato del dispositivo. Le app si registrano al sistema contrassegnando i componenti come
compatibili con la crittografia. Per contrassegnare il componente come compatibile con la crittografia, imposta l'attributo
android:directBootAware
su true nel manifest.
I componenti compatibili con la crittografia possono registrarsi per ricevere un messaggio di trasmissione ACTION_LOCKED_BOOT_COMPLETED
dal sistema al riavvio del dispositivo. A questo punto è disponibile lo spazio di archiviazione criptato del dispositivo 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 compatibile con la 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 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 istanza di Context
chiamando Context.createDeviceProtectedStorageContext()
. Tutte le chiamate API
di archiviazione effettuate utilizzando questo contesto accedono all'archivio 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 l'archivio criptato del dispositivo solo per le informazioni a cui è necessario accedere durante la modalità Avvio diretto. Non utilizzare lo spazio di archiviazione criptato del dispositivo come spazio di archiviazione criptato generico. Per informazioni utente private o dati criptati che non sono necessari durante la modalità Avvio diretto, utilizza l'archivio criptato con credenziali.
Ricevere una notifica quando l'utente apre la serratura
Quando l'utente sblocca il dispositivo dopo il riavvio, la tua app può passare all'accesso allo spazio di archiviazione criptato delle 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 ritardata, ascolta il messaggio
ACTION_BOOT_COMPLETED
.
Se l'utente ha sbloccato il dispositivo, puoi scoprirlo chiamando
UserManager.isUserUnlocked()
.
Migrare i dati esistenti
Se un utente aggiorna il proprio dispositivo per utilizzare la modalità Avvio diretto, potresti avere
dati esistenti che devono essere migrati nello 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 dei dati delle preferenze e del database
tra l'archivio criptato con credenziali e l'archivio criptato con dispositivo.
Non eseguire la migrazione di informazioni private degli utenti, come password o token di autorizzazione, dallo spazio di archiviazione criptato delle credenziali allo spazio di archiviazione criptato del dispositivo. Usa il tuo miglior giudizio quando decidi quali altri dati eseguire la migrazione allo spazio di archiviazione criptato del dispositivo. In alcuni scenari, potrebbe essere necessario gestire set di dati separati nei due negozi criptati.
Testare l'app compatibile con la crittografia
Testa l'app compatibile con la crittografia con la modalità Avvio diretto attivata.
La maggior parte dei dispositivi con versioni recenti di Android attiva la modalità Avvio diretto ogni volta che viene impostata una credenziale della schermata di blocco (PIN, sequenza o password). Nello specifico, questo è il caso di tutti i dispositivi che utilizzano la crittografia basata su file. Per verificare se un dispositivo utilizza la crittografia basata su file, esegui questo comando della shell:
adb shell getprop ro.crypto.type
Se l'output è file
, la crittografia basata su file è abilitata sul dispositivo.
Sui dispositivi che non utilizzano la crittografia basata su file per impostazione predefinita, potrebbero essere disponibili altre opzioni per testare la modalità Avvio diretto:
-
Alcuni dispositivi che utilizzano la crittografia completa 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, attiva le Opzioni sviluppatore se non l'hai ancora fatto andando su Impostazioni > Informazioni sullo smartphone e toccando Numero build sette volte. Quindi vai a Impostazioni > Opzioni sviluppatore e seleziona Converti in crittografia file.
- In alternativa, esegui questi comandi della 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à "emulata" di avvio diretto che utilizza le autorizzazioni dei file per simulare gli effetti del blocco e dello sblocco dei file criptati. Utilizza la modalità di emulazione solo durante lo sviluppo, in quanto può causare la perdita di dati. Per attivare la modalità di avvio diretto emulato, imposta una sequenza di blocco sul dispositivo, scegli "No, grazie" se ti viene chiesto di impostare una schermata di avvio protetto 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 causa il riavvio del dispositivo.
Controllare lo stato della crittografia dei criteri relativi ai dispositivi
Le app di amministrazione del dispositivo possono utilizzare
DevicePolicyManager.getStorageEncryptionStatus()
per controllare lo stato di crittografia attuale 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 avvio diretto. In entrambi i casi, i dati vengono sempre memorizzati 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 avvio diretto.
Se crei un'app di amministrazione dei dispositivi
che ha come target 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 mostra ulteriormente l'utilizzo delle API trattate in questa pagina.