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