Direct Boot-Modus unterstützen

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

  • 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 Direktstartmodus als auch nach dem Entsperren des Geräts durch den Nutzer verfügbar.

Standardmäßig werden Apps im Direktstartmodus nicht ausgeführt. Wenn Ihre App im Direktstartmodus 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 Direktstartmodus ausgeführt werden müssen:

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

Wenn Ihre App im Direktstartmodus 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 Direktstarts anfordern

Apps müssen ihre Komponenten beim System registrieren, bevor sie im Direktstartmodus ausgeführt werden oder auf den verschlüsselten Gerätespeicher zugreifen können. Apps registrieren sich beim System, indem sie Komponenten als verschlüsselungssensibel kennzeichnen. Wenn Sie Ihre Komponente als verschlüsselungssensibel kennzeichnen möchten, legen Sie das Attribut android:directBootAware in Ihrem Manifest auf „true“ fest.

Verschlüsselungssensible Komponenten können sich registrieren, um eine ACTION_LOCKED_BOOT_COMPLETED-Nachricht an alle vom System zu erhalten, wenn das Gerät neu gestartet wurde. An diesem Punkt ist der verschlüsselte Gerätespeicher verfügbar und Ihre Komponente kann Aufgaben ausführen, die im Direktstartmodus ausgeführt werden müssen, z. B. einen geplanten Wecker auslösen.

Das folgende Code-Snippet ist ein Beispiel dafür, wie Sie einen BroadcastReceiver als verschlüsselungssensibel 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 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 Direktstartmodus zugegriffen werden muss. Verwenden Sie den verschlüsselten Gerätespeicher nicht als Speicher für allgemeine Zwecke. Verwenden Sie den mit Anmeldedaten verschlüsselten Speicher für private Nutzerinformationen oder verschlüsselte Daten, die im Direktstartmodus nicht benötigt werden.

Über das Entsperren durch den Nutzer benachrichtigt werden

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 laufenden Komponente, um auf Entsperrbenachrichtigungen 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 Nachricht ACTION_USER_UNLOCKED.
  • Wenn Ihre App nur Hintergrundprozesse verwendet, die auf eine verzögerte Benachrichtigung reagieren können, warten Sie auf die Nachricht ACTION_BOOT_COMPLETED.

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

Vorhandene Daten migrieren

Wenn ein Nutzer sein Gerät so aktualisiert, dass der Direktstartmodus 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 Methodenaufrufer und der Quellkontext das Argument ist, um Einstellungen und Datenbankdaten 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. Entscheiden Sie nach bestem Wissen und Gewissen, 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üsselungssensible App testen

Testen Sie Ihre verschlüsselungssensible App mit aktiviertem Direktstartmodus.

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

  • 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 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“ Direktstartmodus, 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. Er kann zu Datenverlust führen. Wenn Sie den emulierten Direktstartmodus 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 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ä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, gibt getStorageEncryptionStatus() ENCRYPTION_STATUS_ACTIVE zurück, wenn das Gerät entweder die vollständige Festplattenverschlüsselung oder die dateibasierte Verschlüsselung mit Direktstart 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, gibt getStorageEncryptionStatus() ENCRYPTION_STATUS_ACTIVE zurück, wenn das Gerät die vollständige Festplattenverschlüsselung verwendet. Wenn das Gerät die dateibasierte Verschlüsselung mit Direktstart 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.