Direct Boot-Modus unterstützen

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

  • Mit Anmeldedaten verschlüsselter Speicher: Dies ist der Standardspeicherort und er ist erst verfügbar, nachdem der Nutzer das Gerät entsperrt hat.
  • Verschlüsselter Gerätespeicher: Dieser Speicherort ist sowohl im Direktstartmodus als auch nach dem Entsperren des Geräts durch den Nutzer verfügbar.

Standardmäßig werden Apps im Direktstartmodus nicht ausgeführt. Wenn deine App im Direktstartmodus Aktionen ausführen muss, kannst du App-Komponenten registrieren, die in diesem Modus ausgeführt werden sollen. Hier einige häufige Anwendungsfälle für Apps, die im Direktstartmodus ausgeführt werden müssen:

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

Wenn deine App im Direktstartmodus auf Daten zugreifen muss, verwende den geräteverschlüsselten Speicher. Der verschlüsselte Gerätespeicher enthält Daten, die mit einem Schlüssel verschlüsselt sind, der erst verfügbar ist, nachdem das Gerät einen erfolgreichen Bootmodus mit Verifikation durchgeführt hat.

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, verwende den mit Anmeldedaten verschlüsselten Speicher. Der mit Anmeldedaten verschlüsselte Speicher ist verfügbar, nachdem der Nutzer das Gerät erfolgreich entsperrt hat, und bis der Nutzer das Gerät neu startet. Wenn der Nutzer den Sperrbildschirm nach dem Entsperren des Geräts aktiviert, bleibt der mit Anmeldedaten verschlüsselte Speicher verfügbar.

Zugriff für die Ausführung während des Direktstarts anfordern

Apps müssen ihre Komponenten beim System registrieren, bevor sie im Direktstartmodus ausgeführt werden 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 nach einem Neustart des Geräts eine ACTION_LOCKED_BOOT_COMPLETED-Nachricht an alle vom System zu erhalten. An diesem Punkt ist der verschlüsselte Gerätespeicher verfügbar und deine Komponente kann Aufgaben ausführen, die im Direktstartmodus ausgeführt werden müssen, z. B. das Auslösen eines geplanten Alarms.

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

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

Nachdem der Nutzer das Gerät entsperrt hat, können alle Komponenten sowohl auf den auf dem Gerät verschlüsselten Speicher als auch auf den mit Anmeldedaten verschlüsselten Speicher zugreifen.

Auf verschlüsselten Gerätespeicher zugreifen

Wenn Sie auf den verschlüsselten Speicher des Geräts zugreifen möchten, erstellen Sie eine zweite Context-Instanz, indem Sie Context.createDeviceProtectedStorageContext() aufrufen. Alle Storage API-Aufrufe, die mit diesem Kontext erfolgen, greifen auf den verschlüsselten Speicher des Geräts zu. Im folgenden Beispiel wird auf den geräteverschlüsselten Speicher 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 verschlüsselten Gerätespeicher nur für Informationen, die im Direct Boot-Modus zugänglich sein müssen. Verwenden Sie den geräteverschlüsselten Speicher nicht als verschlüsselten Speicher für allgemeine Zwecke. Verwende für private Nutzerinformationen oder verschlüsselte Daten, die im Direktstartmodus nicht benötigt werden, den mit Anmeldedaten verschlüsselten Speicher.

Benachrichtigung erhalten, wenn ein Nutzer das Schloss entriegelt

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

Wenn du benachrichtigt werden möchtest, wenn der Nutzer das Gerät nach einem Neustart entsperrt, registriere einen BroadcastReceiver von einer laufenden Komponente, um auf Benachrichtigungen zum Entsperren zu warten. Wenn der Nutzer das Gerät nach dem Start entsperrt:

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

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

Vorhandene Daten migrieren

Wenn ein Nutzer sein Gerät auf den Direktstartmodus aktualisiert, müssen möglicherweise vorhandene Daten in den geräteverschlüsselten Speicher migriert werden. Verwenden Sie Context.moveSharedPreferencesFrom() und Context.moveDatabaseFrom() mit dem Zielkontext als Methodenaufrufer und dem Quellkontext als Argument, um Einstellungen und Datenbankdaten zwischen dem mit Anmeldedaten verschlüsselten Speicher und dem mit dem Gerät verschlü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. Entscheiden Sie nach bestem Wissen und Gewissen, welche anderen Daten Sie in den geräteverschlüsselten Speicher migrieren möchten. In einigen Szenarien 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 Direktstartmodus aktiviert, wenn Anmeldedaten für den Sperrbildschirm (PIN, Muster oder Passwort) festgelegt wurden. Das ist insbesondere auf allen Geräten der Fall, die eine dateibasierte Verschlüsselung verwenden. Mit dem folgenden Shell-Befehl kannst du prüfen, ob ein Gerät die 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, die standardmäßig keine dateibasierte Verschlüsselung verwenden, gibt es möglicherweise andere Optionen zum Testen des Direct Boot-Modus:

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

      Warnung : Bei beiden Methoden zur Konvertierung in 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. Gehen Sie dazu zu Einstellungen > Telefoninfo und tippen Sie siebenmal auf Build-Nummer. Gehe dann zu Einstellungen > Entwickleroptionen und wähle 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“ Direktstartmodus, in 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 du den emulierten Direktstartmodus aktivieren möchtest, lege ein Sperrmuster auf dem Gerät fest. Wähle „Nein danke“ aus, wenn du beim Festlegen eines Sperrmusters nach einem sicheren Startbildschirm gefragt wirst, und führe dann den folgenden Shell-Befehl aus:

    adb shell sm set-emulate-fbe true
    

    Führe den folgenden Shell-Befehl aus, um den emulierten Direktstartmodus 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äterichtlinie prüfen

Apps zur Geräteverwaltung 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() den Wert ENCRYPTION_STATUS_ACTIVE zurück, wenn das Gerät entweder die Datenträgervollverschlüsselung oder die dateibasierte Verschlüsselung mit Direktstart verwendet. In beiden Fällen werden die Daten immer im Ruhezustand verschlüsselt gespeichert.

Wenn Ihre App auf Android 7.0 (API 24) oder höher ausgerichtet ist, gibt getStorageEncryptionStatus() den Wert ENCRYPTION_STATUS_ACTIVE zurück, wenn das Gerät die Datenträgervollverschlüsselung verwendet. Gibt ENCRYPTION_STATUS_ACTIVE_PER_USER zurück, wenn das Gerät die dateibasierte Verschlüsselung mit Direktstart verwendet.

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

Zusätzliche Codebeispiele

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