Direct Boot-Modus unterstützen

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

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

Standardmäßig werden Apps im Direct Boot-Modus nicht ausgeführt. Wenn Ihre App im Direct Boot-Modus eine Aktion ausführen muss, können Sie App-Komponenten registrieren, die in diesem Modus ausgeführt werden sollen. Einige häufige Anwendungsfälle für Apps, die im Direct Boot-Modus ausgeführt werden müssen:

  • Apps mit geplanten Benachrichtigungen, z. B. Wecker- Apps.
  • Apps, die wichtige Nutzerbenachrichtigungen bereitstellen, z. B. SMS-Apps.
  • Apps, die Bedienungshilfen bereitstellen, z. B. TalkBack.

Wenn Ihre App im Direct Boot-Modus auf Daten zugreifen muss, verwenden Sie den verschlüsselten Gerätespeicher. Der verschlüsselte Gerätespeicher enthält Daten, die mit einem Schlüssel verschlüsselt wurden, der erst verfügbar ist, nachdem ein Gerät einen erfolgreichen überprüften Start durchgeführt hat.

Verwenden Sie den mit Anmeldedaten verschlüsselten Speicher für Daten, die mit einem Schlüssel verschlüsselt werden müssen, der mit den Anmeldedaten des Nutzers verknüpft ist, z. B. einer PIN oder einem Passwort. 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 aktiviert, nachdem er das Gerät entsperrt hat, bleibt der mit Anmeldedaten verschlüsselte Speicher verfügbar.

Zugriff zum Ausführen während des Direct Boot-Modus anfordern

Apps müssen ihre Komponenten beim System registrieren, bevor sie im Direct Boot-Modus ausgeführt werden oder auf den verschlüsselten Gerätespeicher 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, legen Sie das android:directBootAware Attribut in Ihrem Manifest auf „true“ fest.

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 Geräte speicher verfügbar und Ihre Komponente kann Aufgaben ausführen, die im Direct Boot-Modus ausgeführt werden müssen, z. B. einen geplanten Alarm auslösen.

Das folgende Code-Snippet zeigt, wie Sie einen BroadcastReceiver als verschlüsselungsfähig registrieren und im App-Manifest einen Intent-Filter für ACTION_LOCKED_BOOT_COMPLETEDhinzufü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 verschlüsselten Gerätespeicher als auch auf den mit Anmeldedaten verschlüsselten Speicher zugreifen.

Auf den verschlüsselten Gerätespeicher zugreifen

Um auf den verschlüsselten Gerätespeicher zuzugreifen, erstellen Sie eine zweite Context Instanz, indem Sie Context.createDeviceProtectedStorageContext() aufrufen. Alle Speicher-API Aufrufe, die mit diesem Kontext ausgeführt werden, greifen auf den verschlüsselten Gerätespeicher zu. Im folgenden Beispiel wird auf den verschlüsselten Gerätespeicher 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, auf die im Direct Boot-Modus zugegriffen werden muss. Verwenden Sie den verschlüsselten Gerätespeicher nicht als allgemeinen verschlüsselten Speicher. Verwenden Sie den mit Anmeldedaten verschlüsselten Speicher für private Nutzerinformationen oder verschlüsselte Daten, die im Direct Boot-Modus nicht benötigt werden.

Benachrichtigung über das Entsperren durch den 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 den Anmeldedaten des Nutzers abhängen.

Wenn Sie benachrichtigt werden möchten, wenn der Nutzer das Gerät nach einem Neustart entsperrt, registrieren Sie einen BroadcastReceiver von einer aktiven Komponente, um auf Benachrichtigungen über das 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 ACTION_BOOT_COMPLETED Nachricht.

Mit UserManager.isUserUnlocked() können Sie herausfinden, ob der Nutzer das Gerät entsperrt hat.

Vorhandene Daten migrieren

Wenn ein Nutzer sein Gerät so aktualisiert, dass der Direct Boot-Modus verwendet wird, sind möglicherweise vorhandene Daten vorhanden, die in den verschlüsselten Gerätespeicher migriert werden müssen. Verwenden Sie Context.moveSharedPreferencesFrom() und Context.moveDatabaseFrom(), wobei der Zielkontext der Aufrufer der Methode und der Quellkontext das Argument ist, um Einstellungen und Datenbank daten zwischen dem mit Anmeldedaten verschlüsselten Speicher und dem verschlüsselten Gerätespeicher zu migrieren.

Migrieren Sie keine privaten Nutzerinformationen wie Passwörter oder Autorisierungstokens aus dem mit Anmeldedaten verschlüsselten Speicher in den verschlüsselten Gerätespeicher. Treffen Sie eine fundierte Entscheidung, welche anderen Daten in den verschlüsselten Gerätespeicher migriert werden sollen. 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 Direct Boot-Modus aktiviert wenn Anmeldedaten für den Sperrbildschirm (PIN, Muster oder Passwort) festgelegt wurden. Dies ist insbesondere bei allen Geräten der Fall, die die dateibasierte Verschlüsselung verwenden. Führen Sie den folgenden Shell-Befehl aus, um zu prüfen, ob ein Gerät die dateibasierte Verschlüsselung verwendet:

adb shell getprop ro.crypto.type

Wenn die Ausgabe file ist, ist die dateibasierte Verschlüsselung auf dem Gerät 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 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 konvertiert werden. Dafür gibt es zwei Möglichkeiten:

      Warnung : Bei beiden Methoden zum Konvertieren 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 . Rufen Sie dazu die Einstellungen > Über das Telefon auf und tippen Sie sieben Mal auf die Build Nummer. Rufen Sie dann die Einstellungen > Entwickler optionen auf 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, der Dateiberechtigungen verwendet, um die Auswirkungen von gesperrten und entsperrten verschlüsselten Dateien zu simulieren. Verwenden Sie den emulierten Modus nur während der Entwicklung. Er kann zu Datenverlust führen. Wenn Sie den emulierten Direct Boot-Modus aktivieren möchten, legen Sie ein Sperrmuster auf dem Gerät fest. Wählen Sie „Nein, danke“ aus, wenn Sie beim Festlegen eines Sperrmusters nach einem sicheren Startbildschirm gefragt werden, und 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äteverwaltung prüfen

Apps zur Geräteverwaltung können mit DevicePolicyManager.getStorageEncryptionStatus() den aktuellen Verschlüsselungsstatus des Geräts prüfen.

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

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

Wenn Sie eine App zur Geräteverwaltung entwickeln, die auf Android 7.0 ausgerichtet ist, 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

Im DirectBoot Beispiel wird die Verwendung der auf dieser Seite behandelten APIs weiter veranschaulicht.