Direct Boot-Modus unterstützen

Android 7.0 wird im sicheren Direct Boot-Modus ausgeführt, wenn das Gerät eingeschaltet, aber noch nicht vom Nutzer entsperrt wurde. Dazu bietet das System zwei Speicherorte für Daten:

  • Verschlüsselter Anmeldedatenspeicher, der Standardspeicherort, der erst verfügbar ist, nachdem der Nutzer das Gerät entsperrt hat.
  • Verschlüsselter Gerätespeicher, der sowohl im Direct Boot-Modus als auch nach dem Entsperren des Geräts durch den Nutzer verfügbar ist.

Standardmäßig werden Apps im Modus „Direktstart“ nicht ausgeführt. Wenn Ihre App im Direct Boot-Modus aktiv werden muss, können Sie App-Komponenten registrieren, die in diesem Modus ausgeführt werden sollen. Hier einige häufige Anwendungsfälle für Apps, die im Direct Boot-Modus ausgeführt werden müssen:

  • Apps, die Benachrichtigungen geplant haben, z. B. Wecker-Apps.
  • Apps, die wichtige Nutzerbenachrichtigungen bereitstellen, z. B. SMS-Apps.
  • Apps, die Bedienungshilfen wie TalkBack bereitstellen.

Wenn Ihre App im Direct Boot-Modus auf Daten zugreifen muss, verwenden Sie den geräteverschlüsselten Speicher. Der verschlüsselte Speicher auf Geräten enthält Daten, die mit einem Schlüssel verschlüsselt sind, der erst verfügbar ist, nachdem ein Gerät erfolgreich im verifizierten Bootmodus gestartet wurde.

Verwenden Sie den mit Anmeldedaten verschlüsselten Speicher für Daten, die mit einem Schlüssel verschlüsselt werden müssen, der mit Nutzeranmeldedaten wie einer PIN oder einem Passwort verknüpft ist. Die verschlüsselte Speicherung von Anmeldedaten ist verfügbar, nachdem der Nutzer das Gerät erfolgreich entsperrt hat und bis er es neu startet. Wenn der Nutzer die Displaysperre nach dem Entsperren des Geräts aktiviert, bleibt der verschlüsselte Speicher für Anmeldedaten verfügbar.

Zugriff zum Ausführen während des direkten Starts anfordern

Apps müssen ihre Komponenten beim System registrieren, bevor sie im Direct Boot-Modus ausgeführt werden können oder auf den geräteverschlüsselten Speicher zugreifen können. Apps registrieren sich beim System, indem sie Komponenten als verschlüsselungsfähig kennzeichnen. Wenn Sie Ihre Komponente als verschlüsselungsfähig kennzeichnen möchten, setzen Sie das Attribut android:directBootAware in Ihrem Manifest auf „true“.

Verschlüsselungsfähige Komponenten können sich registrieren, um eine ACTION_LOCKED_BOOT_COMPLETED-Broadcast-Nachricht vom System zu erhalten, wenn das Gerät neu gestartet wurde. An diesem Punkt ist der verschlüsselte Speicher des Geräts verfügbar und Ihre Komponente kann Aufgaben ausführen, die im Direct Boot-Modus ausgeführt werden müssen, z. B. das Auslösen eines geplanten Alarms.

Das folgende Code-Snippet ist ein Beispiel dafür, wie Sie eine BroadcastReceiver als verschlüsselungsfähig registrieren und einen Intent-Filter für ACTION_LOCKED_BOOT_COMPLETED im App-Manifest hinzufügen:

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

Sobald der Nutzer das Gerät entsperrt hat, können alle Komponenten sowohl auf den geräteverschlüsselten Speicher als auch auf den anmeldedatenverschlüsselten Speicher zugreifen.

Auf verschlüsselten Gerätespeicher zugreifen

Um auf den verschlüsselten Speicher des Geräts zuzugreifen, erstellen Sie eine zweite Context-Instanz, indem Sie Context.createDeviceProtectedStorageContext() aufrufen. Alle Speicher-API-Aufrufe, die mit diesem Kontext erfolgen, greifen auf den verschlüsselten Speicher des Geräts zu. Im folgenden Beispiel wird auf den verschlüsselten Speicher des Geräts zugegriffen und eine vorhandene App-Datendatei geöffnet:

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

Verwenden Sie den geräteverschlüsselten Speicher nur für Informationen, auf die im Direct Boot-Modus zugegriffen werden muss. Verwenden Sie den geräteverschlüsselten Speicher nicht als verschlüsselten Speicher für allgemeine Zwecke. Verwenden Sie credential-verschlüsselten Speicher für private Nutzerinformationen oder verschlüsselte Daten, die im Direct Boot-Modus nicht benötigt werden.

Benachrichtigung bei Entsperrung durch Nutzer erhalten

Wenn der Nutzer das Gerät nach dem Neustart entsperrt, kann Ihre App auf den mit Anmeldedaten verschlüsselten Speicher zugreifen und reguläre Systemdienste verwenden, die von Nutzeranmeldedaten abhängen.

Wenn Sie benachrichtigt werden möchten, wenn der Nutzer das Gerät nach einem Neustart entsperrt, registrieren Sie einen BroadcastReceiver über eine laufende Komponente, um auf Entsperrbenachrichtigungen zu warten. Wenn der Nutzer das Gerät nach dem Booten entsperrt:

  • Wenn Ihre App Vordergrundprozesse hat, die sofort benachrichtigt werden müssen, hören Sie auf die Nachricht ACTION_USER_UNLOCKED.
  • Wenn Ihre App nur Hintergrundprozesse verwendet, die auf eine verzögerte Benachrichtigung reagieren können, warten Sie auf die Meldung ACTION_BOOT_COMPLETED.

Wenn der Nutzer das Gerät entsperrt hat, können Sie das durch Aufrufen von UserManager.isUserUnlocked() herausfinden.

Vorhandene Daten migrieren

Wenn ein Nutzer sein Gerät auf den Direct Boot-Modus aktualisiert, müssen möglicherweise vorhandene Daten in den geräteverschlüsselten Speicher migriert werden. Verwenden Sie Context.moveSharedPreferencesFrom() und Context.moveDatabaseFrom(), wobei der Zielkontext der Methodenaufrufer und der Quellkontext das Argument ist, um Einstellungen und Datenbankdaten zwischen dem anmeldedatenverschlüsselten Speicher und dem geräteverschlüsselten Speicher zu migrieren.

Migrieren Sie keine privaten Nutzerinformationen wie Passwörter oder Autorisierungstokens aus dem mit Anmeldedaten verschlüsselten Speicher in den mit dem Gerät verschlüsselten Speicher. Es liegt in Ihrem Ermessen, welche anderen Daten Sie in den verschlüsselten Speicher des Geräts migrieren möchten. In einigen Fällen müssen Sie möglicherweise separate Datensätze in den beiden verschlüsselten Speichern verwalten.

Verschlüsselungsfähige App testen

Testen Sie Ihre verschlüsselungsfähige App mit aktiviertem Direct Boot-Modus.

Auf den meisten Geräten mit aktuellen Android-Versionen wird der Modus „Direktboot“ aktiviert, sobald Anmeldedaten für den Sperrbildschirm (PIN, Muster oder Passwort) festgelegt wurden. Das ist insbesondere bei allen Geräten der Fall, die dateibasierte Verschlüsselung verwenden. Führen Sie den folgenden Shell-Befehl aus, um zu prüfen, ob ein Gerät dateibasierte Verschlüsselung verwendet:

adb shell getprop ro.crypto.type

Wenn die Ausgabe file lautet, ist auf dem Gerät die dateibasierte Verschlüsselung aktiviert.

Auf Geräten, auf denen die dateibasierte Verschlüsselung nicht standardmäßig verwendet wird, gibt es möglicherweise andere Optionen zum Testen des Direct Boot-Modus:

  • Einige Geräte, die die vollständige Festplattenverschlüsselung (ro.crypto.type=block) verwenden und auf denen Android 7.0 bis Android 12 ausgeführt wird, können in die dateibasierte Verschlüsselung umgewandelt werden. Dafür gibt es zwei Möglichkeiten:

      Warnung : Bei beiden Methoden zur Umstellung auf die dateibasierte Verschlüsselung werden alle Nutzerdaten auf dem Gerät gelöscht.

    • Aktivieren Sie auf dem Gerät die Entwickleroptionen, falls noch nicht geschehen. Rufen Sie dazu die Einstellungen > Über das Telefon auf und tippen Sie sieben Mal auf die Build-Nummer. Gehen Sie dann zu Einstellungen > Entwickleroptionen und wählen Sie In Dateiverschlüsselung konvertieren aus.
    • Alternativ können Sie die folgenden Shell-Befehle ausführen:
      adb reboot-bootloader
      fastboot --wipe-and-use-fbe
      
  • Geräte mit Android 13 oder niedriger unterstützen einen „emulierten“ Direct Boot-Modus, bei dem Dateiberechtigungen verwendet werden, um die Auswirkungen des Sperrens und Entsperrens verschlüsselter Dateien zu simulieren. Verwenden Sie den emulierten Modus nur während der Entwicklung, da er zu Datenverlust führen kann. Wenn Sie den emulierten Direct Boot-Modus aktivieren möchten, legen Sie ein Sperrmuster auf dem Gerät fest. Wenn Sie beim Festlegen eines Sperrmusters aufgefordert werden, einen Bildschirm für den sicheren Start einzurichten, wählen Sie „Nein, danke“ aus. Führen Sie dann den folgenden Shell-Befehl aus:

    adb shell sm set-emulate-fbe true
    

    Führen Sie den folgenden Shell-Befehl aus, um den emulierten Direct Boot-Modus zu deaktivieren:

    adb shell sm set-emulate-fbe false
    

    Wenn Sie einen dieser Befehle ausführen, wird das Gerät neu gestartet.

Verschlüsselungsstatus der Geräte-Richtlinie prüfen

Geräteadministrator-Apps können DevicePolicyManager.getStorageEncryptionStatus() verwenden, um den aktuellen Verschlüsselungsstatus des Geräts zu prüfen.

Wenn Ihre App auf ein API-Level unter Android 7.0 (API 24) ausgerichtet ist, gibt getStorageEncryptionStatus() ENCRYPTION_STATUS_ACTIVE zurück, wenn auf dem Gerät entweder die vollständige Festplattenverschlüsselung oder die dateibasierte Verschlüsselung mit Direct Boot verwendet wird. In beiden Fällen werden Daten immer verschlüsselt gespeichert.

Wenn Ihre App auf Android 7.0 (API 24) oder höher ausgerichtet ist, gibt getStorageEncryptionStatus() ENCRYPTION_STATUS_ACTIVE zurück, wenn auf dem Gerät eine vollständige Festplattenverschlüsselung verwendet wird. Es wird ENCRYPTION_STATUS_ACTIVE_PER_USER zurückgegeben, wenn auf dem Gerät dateibasierte Verschlüsselung mit Direct Boot verwendet wird.

Wenn Sie eine Geräteadministrator-App für Android 7.0 entwickeln, müssen Sie sowohl ENCRYPTION_STATUS_ACTIVE als auch ENCRYPTION_STATUS_ACTIVE_PER_USER prüfen, um festzustellen, ob das Gerät verschlüsselt ist.

Zusätzliche Codebeispiele

Das DirectBoot-Beispiel veranschaulicht die Verwendung der auf dieser Seite behandelten APIs.