Direct Boot-Modus unterstützen

Android 7.0 wird im sicheren Direktstart ausgeführt, wenn das Gerät eingeschaltet, aber nicht entsperrt wurde. Zu diesem Zweck bietet das System zwei Speicherorte für Daten:

  • Verschlüsselter Anmeldedatenspeicher: Dies ist der Standardspeicherort und er ist nur verfügbar, nachdem der Nutzer das Gerät entsperrt hat.
  • Geräteverschlüsselter Speicher – ein Speicherort, der sowohl im Direct Boot-Modus als auch nach dem Entsperren des Geräts verfügbar ist.

Standardmäßig werden Apps im Direktstartmodus nicht ausgeführt. Wenn Ihre App im Direktstartmodus Aktionen ausführen muss, können Sie App-Komponenten registrieren, die in diesem Modus ausgeführt werden sollen. Im Folgenden finden Sie einige häufige Anwendungsfälle für Anwendungen, die im Direct Boot-Modus 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 wie TalkBack bieten

Wenn Ihre Anwendung während der Ausführung im Direct Boot-Modus auf Daten zugreifen muss, verwenden Sie 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 ein Gerät einen erfolgreichen verifizierten Start ausgeführt hat.

Verwenden Sie den verschlüsselten Anmeldedatenspeicher 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. Der mit Anmeldedaten verschlüsselte Speicher ist verfügbar, nachdem der Nutzer das Gerät erfolgreich entsperrt hat, und bis er 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 anfordern, um während des direkten Starts ausgeführt zu werden

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

Verschlüsselungsbewusste Komponenten können sich registrieren, um eine ACTION_LOCKED_BOOT_COMPLETED-Broadcastnachricht vom System zu erhalten, wenn das Gerät neu gestartet wurde. An diesem Punkt ist der vom Gerät verschlüsselte 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 ist ein Beispiel dafür, wie Sie eine BroadcastReceiver als verschlüsselungsbewusst registrieren und im App-Manifest 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>

Sobald der Nutzer das Gerät entsperrt hat, können alle Komponenten sowohl auf den vom Gerät verschlüsselten Speicher als auch auf den verschlüsselten Speicher für Anmeldedaten zugreifen.

Auf verschlüsselten Gerätespeicher zugreifen

Wenn Sie auf den verschlüsselten Gerätespeicher 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 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 verschlüsselten Speicher für allgemeine Zwecke. Verwenden Sie für private Nutzerinformationen oder verschlüsselte Daten, die im Direktstartmodus nicht benötigt werden, einen mit Anmeldedaten verschlüsselten Speicher.

Benachrichtigungen über Entsperrung durch Nutzer erhalten

Wenn der Nutzer das Gerät nach dem Neustart entsperrt, kann Ihre App zum Zugriff auf den mit Anmeldedaten verschlüsselten Speicher wechseln und normale 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 eine BroadcastReceiver von einer laufenden Komponente, um auf Benachrichtigungsnachrichten für die Entsperrung zu warten. Wenn der Nutzer das Gerät nach dem Starten entsperrt:

  • Wenn Ihre App Prozesse im Vordergrund hat, die sofort benachrichtigt werden müssen, achten Sie auf die Meldung ACTION_USER_UNLOCKED.
  • Wenn Ihre App nur Hintergrundprozesse verwendet, die auf verzögerte Benachrichtigungen reagieren können, warten Sie auf die Nachricht ACTION_BOOT_COMPLETED.

Wenn der Nutzer das Gerät entsperrt hat, kannst du dies durch Aufrufen von UserManager.isUserUnlocked() herausfinden.

Vorhandene Daten migrieren

Wenn ein Nutzer sein Gerät auf den Direct Boot-Modus umstellt, müssen möglicherweise vorhandene Daten in den verschlüsselten Gerätespeicher migriert werden. Verwenden Sie Context.moveSharedPreferencesFrom() und Context.moveDatabaseFrom(), wobei der Zielkontext als Methode aufruft und der Quellkontext als Argument dient, um Präferenz- und Datenbankdaten zwischen mit Anmeldedaten verschlüsseltem Speicher und mit dem Gerät verschlüsseltem Speicher zu migrieren.

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

Verschlüsselungsfreundliche App testen

Testen Sie Ihre verschlüsselungsbewusste Anwendung mit aktiviertem Direct Boot-Modus.

Auf den meisten Geräten mit aktuellen Android-Versionen ist der Direktstartmodus aktiviert, wenn Anmeldedaten für den Sperrbildschirm (PIN, Muster oder Passwort) festgelegt wurden. Das gilt insbesondere für alle Geräte, auf denen die dateibasierte Verschlüsselung verwendet wird. Führen Sie den folgenden Shell-Befehl aus, um zu prüfen, ob auf einem Gerät die dateibasierte Verschlüsselung verwendet wird:

adb shell getprop ro.crypto.type

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

Auf Geräten, auf denen standardmäßig keine dateibasierte Verschlüsselung verwendet wird, gibt es möglicherweise andere Optionen zum Testen des Direktstartmodus:

  • Einige Geräte mit datenträgervollverschlüsselung (ro.crypto.type=block) und Android 7.0 bis Android 12 können auf die dateibasierte Verschlüsselung umgestellt 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. Gehen Sie dazu zu Einstellungen > Über das Telefon und tippen Sie siebenmal 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, der mithilfe von Dateiberechtigungen die Auswirkungen des Sperrens und Entsperrens verschlüsselter Dateien simuliert. Verwenden Sie den emulierten Modus nur während der Entwicklung, da sonst Datenverluste auftreten können. Wenn Sie den emulierten Direct Boot-Modus aktivieren möchten, legen Sie ein Sperrmuster auf dem Gerät fest, wählen Sie „Nein, danke“, wenn Sie beim Festlegen eines Sperrmusters zu einem sicheren Startbildschirm aufgefordert 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
    

    Durch das Ausführen dieser Befehle wird das Gerät neu gestartet.

Verschlüsselungsstatus der Geräterichtlinie 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 niedriger als Android 7.0 (API 24) ausgerichtet ist, gibt getStorageEncryptionStatus() ENCRYPTION_STATUS_ACTIVE zurück, wenn auf dem Gerät entweder die Volllaufwerkverschlüsselung oder die dateibasierte Verschlüsselung mit Direct Boot verwendet wird. In beiden Fällen werden Daten immer im Ruhezustand 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 die Datenträgervollverschlüsselung verwendet wird. Es wird ENCRYPTION_STATUS_ACTIVE_PER_USER zurückgegeben, wenn auf dem Gerät die dateibasierte Verschlüsselung mit Direct Boot verwendet wird.

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.

Weitere Codebeispiele

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