Supporto della modalità di avvio diretto

Android 7.0 viene eseguito in una 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 con credenziali, che è la posizione di archiviazione predefinita ed è disponibile solo dopo che l'utente ha sbloccato il dispositivo.
  • Spazio di archiviazione criptato del dispositivo, ovvero una posizione 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 durante la modalità di avvio diretto. Se la tua app deve eseguire un'azione durante la modalità Avvio diretto, puoi registrare i componenti dell'app da eseguire durante questa modalità. Alcuni casi d'uso comuni per le app che devono essere eseguite durante la modalità di avvio diretto includono:

  • App che hanno notifiche programmate, ad esempio app sveglia.
  • App che forniscono notifiche importanti per gli utenti, come le app per SMS.
  • App che forniscono servizi di accessibilità, come TalkBack.

Se la tua app deve accedere ai dati mentre è in 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 il dispositivo ha eseguito un avvio verificato con esito positivo.

Per i dati che devono essere criptati con una chiave associata alle credenziali utente, come un PIN o una password, utilizza lo spazio di archiviazione criptato con credenziali. Lo spazio di archiviazione criptato con credenziali è disponibile dopo che l'utente ha sbloccato 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 con credenziali rimane disponibile.

Richiedi 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 di poter accedere allo spazio di archiviazione criptato del dispositivo. Le app si registrano nel sistema contrassegnando i componenti come sensibili alla crittografia. Per contrassegnare il componente come compatibile con la crittografia, imposta l'attributo android:directBootAware su true nel manifest.

I componenti che supportano la crittografia possono registrarsi per ricevere un ACTION_LOCKED_BOOT_COMPLETED annuncio dal sistema quando il dispositivo viene riavviato. A questo punto, lo spazio di archiviazione criptato del dispositivo è disponibile e il componente può eseguire attività che devono essere eseguite durante la modalità di 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 che l'utente ha sbloccato il dispositivo, tutti i componenti possono accedere sia allo spazio di archiviazione con crittografia del dispositivo sia allo spazio di archiviazione con crittografia delle credenziali.

Accesso allo spazio di archiviazione criptato del dispositivo

Per accedere allo spazio di archiviazione criptato del dispositivo, crea una seconda istanza Context chiamando Context.createDeviceProtectedStorageContext(). Tutte le chiamate API Storage effettuate utilizzando questo contesto accedono allo spazio di archiviazione criptato del dispositivo. L'esempio seguente accede allo spazio di archiviazione protetto da crittografia 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 per uso generico. Per le informazioni private degli utenti o i dati criptati che non sono necessari durante la modalità di Avvio diretto, utilizza lo spazio di archiviazione criptato con credenziali.

Ricevi notifiche sullo sblocco degli utenti

Quando l'utente sblocca il dispositivo dopo il riavvio, l'app può passare all'accesso allo spazio di archiviazione crittografato da 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().

Esegui la migrazione dei dati esistenti

Se un utente aggiorna il proprio dispositivo per utilizzare la modalità di avvio diretto, potresti avere dati esistenti di cui è necessario eseguire la migrazione 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 dei dati delle preferenze e del database tra lo spazio di archiviazione criptato con credenziali e lo spazio di archiviazione criptato del dispositivo.

Non eseguire la migrazione di informazioni private degli utenti, come password o token di autorizzazione, dallo spazio di archiviazione con crittografia delle credenziali allo spazio di archiviazione con crittografia del dispositivo. Usa il buon senso per decidere quali altri dati migrare allo spazio di archiviazione criptato del dispositivo. In alcuni scenari, potrebbe essere necessario gestire insiemi di dati separati nei due archivi criptati.

Testa l'app con crittografia integrata

Testa l'app che supporta la crittografia con la modalità di avvio diretto attivata.

La maggior parte dei dispositivi con versioni recenti di Android attiva la modalità di avvio diretto ogni volta che viene impostata una credenziale della schermata di blocco (PIN, sequenza o password). In particolare, 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 il seguente comando della shell:

adb shell getprop ro.crypto.type

Se l'output è file, significa che sul dispositivo è abilitata la crittografia basata su file.

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 completa del disco (ro.crypto.type=block) e con Android 7.0-12 possono essere convertiti alla crittografia basata su file. Puoi farlo in due modi:

      Avviso : entrambi i metodi di conversione alla crittografia basata su file cancellano tutti i dati utente sul dispositivo.

    • Se non l'hai ancora fatto, attiva Opzioni sviluppatore sul dispositivo 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
      
  • I dispositivi con Android 13 o versioni precedenti supportano una modalità di Avvio diretto "emulata" che utilizza le autorizzazioni dei file per simulare gli effetti del blocco e dello sblocco dei file criptati. Utilizza la modalità emulata solo durante lo sviluppo, in quanto può causare la perdita di dati. Per attivare la modalità di avvio diretto emulata, imposta una sequenza di blocco sul dispositivo, scegli "No, grazie" se ti viene richiesta una schermata di avvio sicuro durante l'impostazione di 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 comporta il riavvio del dispositivo.

Controlla 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 precedente 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 l'avvio diretto. 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 l'avvio diretto.

Se crei un'app di amministrazione del dispositivo 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 è crittografato.

Altri esempi di codice

L'esempio DirectBoot mostra ulteriormente l'utilizzo delle API trattate in questa pagina.