Prendre en charge le mode Démarrage direct

Android 7.0 s'exécute en mode Démarrage direct sécurisé lorsque l'appareil est allumé, mais que l'utilisateur ne l'a pas déverrouillé. Pour prendre en charge ce mode, le système propose deux emplacements de stockage pour les données :

  • Stockage chiffré par identifiants, l'emplacement de stockage par défaut qui n'est disponible qu'une fois l'appareil déverrouillé par l'utilisateur
  • Stockage chiffré de l'appareil, un emplacement de stockage disponible en mode Démarrage direct et après le déverrouillage de l'appareil par l'utilisateur

Par défaut, les applications ne s'exécutent pas en mode Démarrage direct. Si votre application doit intervenir en mode Démarrage direct, vous pouvez enregistrer les composants d'application à exécuter dans ce mode. Voici quelques cas d'utilisation courants d'applications qui doivent s'exécuter en mode Démarrage direct :

  • Applications qui ont des notifications planifiées, comme les applications de réveil
  • Applications qui envoient des notifications importantes aux utilisateurs, comme les applications de SMS
  • Applications qui fournissent des services d'accessibilité, comme TalkBack

Si votre application doit accéder aux données lorsqu'elle s'exécute en mode Démarrage direct, utilisez le stockage chiffré de l'appareil. Le stockage chiffré de l'appareil contient des données chiffrées à l'aide d'une clé qui n'est disponible qu'après un démarrage validé de l'appareil.

Pour les données qui doivent être chiffrées à l'aide d'une clé associée à des identifiants utilisateur, comme un code ou un mot de passe, utilisez le stockage chiffré par identifiants. Le stockage chiffré par identifiants est disponible une fois que l'utilisateur a déverrouillé l'appareil et jusqu'à ce qu'il le redémarre. Si l'utilisateur active l'écran de verrouillage après avoir déverrouillé l'appareil, le stockage chiffré par identifiants reste disponible.

Demander l'accès à l'exécution en mode Démarrage direct

Les applications doivent enregistrer leurs composants sur le système pour pouvoir s'exécuter en mode Démarrage direct ou accéder au stockage chiffré de l'appareil. Les applications s'enregistrent auprès du système en marquant les composants comme compatibles avec le chiffrement. Pour marquer votre composant comme compatible avec le chiffrement, définissez l'attribut android:directBootAware sur "true" dans votre fichier manifeste.

Les composants compatibles avec le chiffrement peuvent s'enregistrer pour recevoir un message de diffusion ACTION_LOCKED_BOOT_COMPLETED du système lorsque l'appareil est redémarré. À ce stade, le stockage chiffré de l'appareil est disponible et votre composant peut exécuter les tâches qui doivent être exécutées en mode Démarrage direct, telles que le déclenchement d'une alarme programmée.

L'extrait de code suivant montre comment enregistrer un BroadcastReceiver comme compatible avec le chiffrement et ajouter un filtre d'intent pour ACTION_LOCKED_BOOT_COMPLETED dans le fichier manifeste de l'application :

<receiver
  android:directBootAware="true" >
  ...
  <intent-filter>
    <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
  </intent-filter>
</receiver>

Une fois que l'utilisateur a déverrouillé l'appareil, tous les composants peuvent accéder à la fois au stockage chiffré de l'appareil et au stockage chiffré par identifiants.

Accéder au stockage chiffré de l'appareil

Pour accéder au stockage chiffré de l'appareil, créez une deuxième instance Context en appelant Context.createDeviceProtectedStorageContext(). Tous les appels d'API de stockage effectués à l'aide de ce contexte accèdent au stockage chiffré de l'appareil. L'exemple suivant accède au stockage chiffré de l'appareil et ouvre un fichier de données d'application existant :

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...

N'utilisez le stockage chiffré de l'appareil que pour les informations qui doivent être accessibles en mode Démarrage direct. N'utilisez pas le stockage chiffré de l'appareil comme un stockage chiffré à usage général. Pour les informations utilisateur privées ou les données chiffrées qui ne sont pas nécessaires en mode Démarrage direct, utilisez le stockage chiffré par identifiants.

Recevoir une notification en cas de déverrouillage par l'utilisateur

Lorsque l'utilisateur déverrouille l'appareil après le redémarrage, votre application peut accéder au stockage chiffré par identifiants et utiliser des services système standards qui dépendent des identifiants de l'utilisateur.

Pour recevoir une notification lorsque l'utilisateur déverrouille l'appareil après un redémarrage, enregistrez un BroadcastReceiver à partir d'un composant en cours d'exécution afin d'écouter les messages de notification de déverrouillage. Lorsque l'utilisateur déverrouille l'appareil après le démarrage :

  • Si votre application comporte des processus de premier plan qui nécessitent une notification immédiate, écoutez le message ACTION_USER_UNLOCKED.
  • Si votre application n'utilise que des processus en arrière-plan pouvant agir sur une notification retardée, écoutez le message ACTION_BOOT_COMPLETED.

Si l'utilisateur a déverrouillé l'appareil, vous pouvez le savoir en appelant UserManager.isUserUnlocked().

Migrer des données existantes

Si un utilisateur met à jour son appareil pour utiliser le mode Démarrage direct, vous devrez peut-être migrer des données vers le stockage chiffré de l'appareil. Utilisez Context.moveSharedPreferencesFrom() et Context.moveDatabaseFrom(), avec le contexte de destination comme appelant de méthode et le contexte source comme argument, pour migrer des données de préférence et de base de données entre le stockage chiffré par identifiants et le stockage chiffré de l'appareil.

Ne migrez pas des informations utilisateur privées, telles que des mots de passe ou des jetons d'autorisation, du stockage chiffré par identifiants vers le stockage chiffré de l'appareil. Faites appel à votre bon sens lorsque vous décidez des autres données à migrer vers le stockage chiffré de l'appareil. Dans certains cas, vous devrez peut-être gérer des ensembles de données distincts dans les deux stockages chiffrés.

Tester votre application compatible avec le chiffrement

Testez votre application compatible avec le chiffrement avec le mode Démarrage direct activé.

La plupart des appareils exécutant des versions récentes d'Android activent le mode Démarrage direct chaque fois qu'un identifiant d'écran de verrouillage (code, schéma ou mot de passe) est défini. C'est notamment le cas sur tous les appareils qui utilisent le chiffrement basé sur les fichiers. Pour vérifier si un appareil utilise le chiffrement basé sur les fichiers, exécutez la commande shell suivante :

adb shell getprop ro.crypto.type

Si la sortie est file, cela signifie que le chiffrement basé sur les fichiers est activé sur l'appareil.

Sur les appareils qui n'utilisent pas le chiffrement basé sur les fichiers par défaut, il peut exister d'autres options pour tester le mode Démarrage direct :

  • Certains appareils qui utilisent le chiffrement de disque (ro.crypto.type=block) et qui exécutent Android 7.0 à Android 12 peuvent être convertis en chiffrement basé sur les fichiers. Pour cela, vous pouvez procéder de deux façons :

      Avertissement : Quelle que soit la méthode de conversion choisie, le chiffrement basé sur les fichiers efface toutes les données utilisateur de l'appareil.

    • Sur l'appareil, activez les options pour les développeurs, si ce n'est pas déjà fait. Pour ce faire, sélectionnez Settings > About phone (Paramètres > À propos du téléphone), puis appuyez sur Build number (Numéro de version) sept fois. Accédez ensuite à Settings > Developer options (Paramètres > Options pour les développeurs), puis sélectionnez Convert to file encryption (Convertir en chiffrement basé sur les fichiers).
    • Vous pouvez également exécuter les commandes shell suivantes :
      adb reboot-bootloader
      fastboot --wipe-and-use-fbe
      
  • Les appareils équipés d'Android 13 ou d'une version antérieure prennent en charge un mode Démarrage direct "émulé", qui utilise des autorisations de fichiers pour simuler les effets du verrouillage et du déverrouillage de fichiers chiffrés. N'utilisez le mode émulé que pendant le développement, car il peut engendrer une perte de données. Pour activer le mode Démarrage direct émulé, définissez un schéma de verrouillage sur l'appareil, sélectionnez "Non, merci" si un écran vous invitant à sécuriser le démarrage s'affiche, puis exécutez la commande shell suivante :

    adb shell sm set-emulate-fbe true
    

    Pour désactiver le mode Démarrage direct émulé, exécutez la commande shell suivante :

    adb shell sm set-emulate-fbe false
    

    L'exécution de l'une de ces commandes entraîne le redémarrage de l'appareil.

Vérifier l'état du chiffrement de l'appareil

Les applications d'administration d'appareils peuvent utiliser DevicePolicyManager.getStorageEncryptionStatus() pour vérifier l'état du chiffrement actuel de l'appareil.

Si votre application cible un niveau d'API inférieur à Android 7.0 (API 24), getStorageEncryptionStatus() renvoie ENCRYPTION_STATUS_ACTIVE si l'appareil utilise le chiffrement de disque ou le chiffrement basé sur les fichiers avec le mode Démarrage direct. Dans les deux cas, les données sont toujours stockées chiffrées au repos.

Si votre application cible Android 7.0 (API 24) ou une version ultérieure, getStorageEncryptionStatus() renvoie ENCRYPTION_STATUS_ACTIVE si l'appareil utilise le chiffrement de disque. Elle renvoie ENCRYPTION_STATUS_ACTIVE_PER_USER si l'appareil utilise le chiffrement basé sur les fichiers avec le mode Démarrage direct.

Si vous compilez une application d'administration d'appareils qui cible Android 7.0, veillez à vérifier à la fois ENCRYPTION_STATUS_ACTIVE et ENCRYPTION_STATUS_ACTIVE_PER_USER pour déterminer si l'appareil est chiffré.

Autres exemples de code

L'exemple DirectBoot illustre davantage l'utilisation des API abordées sur cette page.