Supporto della modalità di avvio diretto

Android 7.0 funziona in modalità sicura di avvio diretto quando il dispositivo è stato acceso, ma l'utente non ha sbloccato la dispositivo. A questo scopo, il sistema fornisce due posizioni di archiviazione dei 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, che è una posizione di archiviazione disponibile per entrambi durante la modalità Avvio diretto e dopo che l'utente ha sbloccato il dispositivo.

Per impostazione predefinita, le app non vengono eseguite durante la modalità Avvio diretto. Se l'app deve intervenire durante la modalità Avvio diretto, puoi registrarti componenti dell'app da eseguire durante questa modalità. Alcuni casi d'uso comuni per le app che devono essere eseguite durante la modalità Avvio diretto includono:

  • App con notifiche programmate, ad esempio la sveglia. app.
  • App che forniscono notifiche importanti per l'utente, come le app per gli 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 all'utente credenziali, come un PIN o una password, usano l'archiviazione crittografata delle credenziali. L'archiviazione criptata delle credenziali sarà disponibile dopo che l'utente ha completato ha sbloccato il dispositivo e fino a quando l'utente 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.

Richiedere l'accesso per l'esecuzione durante il boot diretto

Le app devono registrare i propri componenti nel sistema prima di può essere eseguito durante la modalità Avvio diretto o accedere al dispositivo criptato archiviazione. Le app vengono registrate nel sistema contrassegnando i componenti come a conoscenza 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 il dispositivo è criptato disponibile e il componente può eseguire attività che devono essere attivare durante la modalità Avvio diretto, ad esempio attivando 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 al sull'archiviazione crittografata del dispositivo e sull'archiviazione con crittografia delle credenziali.

Accedi allo spazio di archiviazione criptato del dispositivo

Per accedere allo spazio di archiviazione criptato del dispositivo, crea un secondo Context istanza mediante la chiamata Context.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:

KotlinJava
val directBootContext: Context = appContext.createDeviceProtectedStorageContext()
// Access appDataFilename that lives in device encrypted storage
val inStream: InputStream = directBootContext.openFileInput(appDataFilename)
// Use inStream to read content...
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 l'archiviazione criptata del dispositivo come archivio criptato per uso 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, l'app può passare a che accede allo spazio di archiviazione delle credenziali criptate e utilizza 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 dello 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 un ritardo di notifica, resta in ascolto ACTION_BOOT_COMPLETED per creare un nuovo messaggio email.

Per sapere se l'utente ha sbloccato il dispositivo, chiama 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 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 scenari, potresti dover gestire e set di dati separati nei due archivi criptati.

Testa la tua app che supporta la crittografia

Testa la tua app sensibile alla crittografia con la modalità Avvio diretto abilitata.

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 vale per 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 Altre opzioni per testare la modalità Avvio diretto:

  • Alcuni dispositivi che usano la crittografia completa del disco (ro.crypto.type=block) e che utilizzino dalla versione Android 7.0 alla Android 12 può essere convertito in file la crittografia. Esistono due metodi per effettuare questa operazione:

      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 le Opzioni sviluppatore sul dispositivo. andando su Impostazioni > Informazioni sullo smartphone e toccando Crea numero 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
      
  • I dispositivi con Android 13 o versioni precedenti supportano un "emulato" la modalità Avvio diretto che utilizza le autorizzazioni dei file per simulare 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 l'emulazione Modalità Avvio diretto, imposta una sequenza di blocco sul dispositivo e scegli "No, grazie" se viene richiesta una schermata di avvio sicura durante l'impostazione di una sequenza di blocco, quindi esegui questo comando shell:

    adb shell sm set-emulate-fbe true
    

    Per disattivare la modalità di avvio diretto emulato, esegui la shell seguente :

    adb shell sm set-emulate-fbe false
    

    L'esecuzione di uno di questi comandi determina 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 di crittografia attuale del dispositivo.

Se la tua app ha come target un livello API inferiore ad Android 7.0 (API 24), Resi a getStorageEncryptionStatus() ENCRYPTION_STATUS_ACTIVE se il dispositivo utilizza la crittografia dell'intero disco o la crittografia basata su file con Avvio diretto. In entrambi i casi, i dati vengono sempre archiviati, crittografati 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 dei dispositivi che ha come target Android 7.0, assicurati di controllare ENCRYPTION_STATUS_ACTIVE e 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.