Obsługa trybu bezpośredniego rozruchu

Android 7.0 działa w bezpiecznym trybie Direct Boot, gdy urządzenie jest włączone, ale użytkownik go nie odblokował. W tym celu system udostępnia 2 miejsca przechowywania danych:

  • Pamięć szyfrowana dane logowania: domyślna lokalizacja, w której są przechowywane dane. i jest dostępna tylko po odblokowaniu urządzenia przez użytkownika.
  • Pamięć szyfrowana urządzenia, czyli lokalizacja dostępna zarówno w trybie bezpośredniego uruchamiania i po odblokowaniu urządzenia przez użytkownika.

Domyślnie aplikacje nie działają w trybie bezpośredniego uruchamiania. Jeśli aplikacja musi wykonać działanie w trybie bezpośredniego rozruchu, możesz zarejestrować komponentów aplikacji, które będą uruchamiane w tym trybie. Częste przypadki użycia w przypadku aplikacji, które muszą działać w trybie bezpośredniego rozruchu, to między innymi:

  • aplikacje z zaplanowanymi powiadomieniami, takie jak budziki;
  • aplikacje wysyłające ważne powiadomienia, np. aplikacje do obsługi SMS-ów;
  • Aplikacje, które zapewniają usługi ułatwień dostępu, takie jak TalkBack.

Jeśli aplikacja musi mieć dostęp do danych podczas działania w trybie bezpośredniego rozruchu, użyj zaszyfrowanej pamięci urządzenia. Szyfrowana pamięć urządzenia zawiera dane zaszyfrowany kluczem, który jest dostępny tylko po wykonaniu pomyślne uruchomienie zweryfikowane.

W przypadku danych, które muszą być szyfrowane za pomocą klucza powiązanego z danymi logowania użytkownika, np. z kodem PIN lub hasłem, użyj szyfrowanego magazynu danych logowania. Skryta pamięć z danymi logowania jest dostępna od momentu odblokowania urządzenia przez użytkownika do momentu jego ponownego uruchomienia. Jeśli użytkownik włączy ekran blokady po odblokowaniu urządzenia, magazyn zaszyfrowany danych logowania pozostanie dostępny.

Poproś o dostęp w celu uruchamiania podczas bezpośredniego rozruchu

Aplikacje muszą zarejestrować swoje komponenty w systemie, zanim zostaną może działać w trybie bezpośredniego rozruchu lub uzyskiwać dostęp do urządzenia zaszyfrowanego pamięci masowej. Aplikacje rejestrują się w systemie, oznaczając komponenty jako świadome szyfrowania. Aby oznaczyć komponent jako obsługujący szyfrowanie, ustaw atrybut android:directBootAware na wartość true w pliku manifestu.

Komponenty obsługujące szyfrowanie mogą zarejestrować się w celu odbierania wiadomości ACTION_LOCKED_BOOT_COMPLETED z systemu po ponownym uruchomieniu urządzenia. W tym momencie pamięć urządzenia szyfrowana jest dostępna, a Twój komponent może wykonywać zadania, które muszą być wykonywane w trybie bezpośredniego uruchamiania, takie jak wywoływanie zaplanowanego alarmu.

Poniższy fragment kodu pokazuje, jak zarejestrować BroadcastReceiver zgodnie z szyfrowaniem i dodaj filtr intencji dla elementu ACTION_LOCKED_BOOT_COMPLETED w manifeście aplikacji:

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

Gdy użytkownik odblokuje urządzenie, wszystkie komponenty będą miały dostęp do zaszyfrowane dane na urządzeniu i magazyn szyfrowany danymi uwierzytelniającymi.

Dostęp do zaszyfrowanej pamięci urządzenia

Aby uzyskać dostęp do zaszyfrowanego miejsca na dane na urządzeniu, utwórz drugą instancję Context, wywołując funkcję Context.createDeviceProtectedStorageContext(). Wszystkie wywołania interfejsu Storage API wykonane przy użyciu tego kontekstu uzyskują dostęp do zaszyfrowanego miejsca na dane urządzenia. W tym przykładzie uzyskujemy dostęp do zaszyfrowanego miejsca na dane na urządzeniu i otwieramy istniejący plik danych aplikacji:

KotlinJava
val directBootContext: Context = appContext.createDeviceProtectedStorageContext()
// Access appDataFilename that lives in device encrypted storage
val inStream: InputStream = directBootContext.openFileInput(appDataFilename)
// Use inStream to read content...
Context directBootContext = appContext.createDeviceProtectedStorageContext();
// Access appDataFilename that lives in device encrypted storage
FileInputStream inStream = directBootContext.openFileInput(appDataFilename);
// Use inStream to read content...

Używaj pamięci zaszyfrowanej na urządzeniu tylko w przypadku które muszą być dostępne w trybie bezpośredniego rozruchu. Nie używaj zaszyfrowanej pamięci urządzenia jako szyfrowanego magazynu ogólnego przeznaczenia. W przypadku prywatnych informacji użytkownika lub zaszyfrowanych danych, które nie są potrzebne w trybie bezpośredniego uruchamiania, użyj pamięci szyfrowanej za pomocą danych logowania.

Otrzymuj powiadomienia o odblokowaniu przez użytkownika

Gdy użytkownik odblokuje urządzenie po ponownym uruchomieniu, aplikacja może przełączyć się na dostęp do zaszyfrowanego magazynu danych z danymi logowania i wykorzystywać zwykłe usługi systemowe, które zależą od danych logowania użytkownika.

Aby otrzymać powiadomienie, gdy użytkownik odblokuje urządzenie po ponownym uruchomieniu: zarejestruj BroadcastReceiver z uruchomionego komponentu nasłuchuj powiadomień o odblokowaniu. Gdy użytkownik odblokuje urządzenie po uruchomieniu:

  • Jeśli aplikacja ma procesy na pierwszym planie, które wymagają natychmiastowego powiadomienia, wysłuchaj wiadomości ACTION_USER_UNLOCKED.
  • Jeśli Twoja aplikacja korzysta tylko z procesów w tle, które mogą działać w ramach opóźnionego powiadomienia, nasłuchuj wiadomośćACTION_BOOT_COMPLETED.

Jeśli użytkownik odblokował urządzenie, możesz to sprawdzić, dzwoniąc UserManager.isUserUnlocked()

Migracja dotychczasowych danych

Jeśli użytkownik zaktualizuje urządzenie, aby korzystać z trybu bezpośredniego uruchamiania, możesz mieć istniejące dane, które trzeba przenieść do zaszyfrowanej pamięci urządzenia. Użyj Context.moveSharedPreferencesFrom() i Context.moveDatabaseFrom() z kontekstem docelowym jako wywołującym metodę i kontekstem źródła jako argumentem, aby przenieść preferencje i bazę danych między magazynem zaszyfrowanym danymi logowania a magazynem zaszyfrowanym na urządzeniu.

Nie przenoś prywatnych danych użytkownika, takich jak hasła czy tokeny autoryzacji, z z zaszyfrowanymi danymi logowania do pamięci zaszyfrowanej na urządzeniu. Przy podejmowaniu decyzji należy kierować się własną oceną inne dane, które mają zostać przeniesione do zaszyfrowanej pamięci urządzenia. W niektórych przypadkach może być konieczne zarządzanie osobnymi zestawami danych w 2 odrębnych szyfrowanych magazynach.

Testowanie aplikacji obsługującej szyfrowanie

Przetestuj aplikację rozpoznającą szyfrowanie z włączonym trybem bezpośredniego rozruchu.

Większość urządzeń z najnowszymi wersjami Androida włącza tryb bezpośredniego uruchamiania, gdy tylko ustawiono dane uwierzytelniające (kod PIN, wzór lub hasło) na ekranie blokady. Dotyczy to w szczególności wszystkich urządzeń, które używają szyfrowania opartego na plikach. Aby sprawdzić, czy urządzenie używa szyfrowania plików, uruchom to polecenie w powłoce:

adb shell getprop ro.crypto.type

Jeśli dane wyjściowe to file, oznacza to, że na urządzeniu jest używane szyfrowanie na podstawie plików. .

Na urządzeniach, które domyślnie nie używają szyfrowania opartego na plikach, mogą być dostępne inne opcje testowania trybu bezpośredniego uruchamiania:

  • Niektóre urządzenia, które korzystają z szyfrowania całego dysku (ro.crypto.type=block) i mają zainstalowanego Androida w wersji od 7.0 do 12, można przekształcić w urządzenia z szyfrowaniem na poziomie pliku. Można to zrobić na dwa sposoby:

      Ostrzeżenie: obie metody konwertowania na szyfrowanie plików spowoduje wyczyszczenie wszystkich danych użytkownika na urządzeniu.

    • Włącz na urządzeniu Opcje programisty (jeśli nie są włączone). wybierając kolejno Ustawienia > Informacje o telefonie i klikając Utwórz siedem razy. Następnie otwórz Ustawienia > Opcje programisty i wybierz Przekształcanie na szyfrowanie plików.
    • Możesz też uruchomić te polecenia powłoki:
      adb reboot-bootloader
      fastboot --wipe-and-use-fbe
      
  • Urządzenia z Androidem 13 lub starszym obsługują „emulacja” tryb bezpośredniego rozruchu, który korzysta z uprawnień do plików do symulowania skutki zablokowania i odblokowania zaszyfrowanych plików. Podczas tworzenia używaj tylko trybu emulacji, ponieważ tryb emulacji może spowodować utratę danych. Aby włączyć emulowany tryb bezpośredniego uruchamiania, ustaw na urządzeniu wzór blokady, a gdy pojawi się ekran bezpiecznego uruchamiania, wybierz „Nie, dziękuję”. Następnie uruchom to polecenie w powłoce:

    adb shell sm set-emulate-fbe true
    

    Aby wyłączyć emulowany tryb Direct Boot, uruchom to polecenie w powłoce:

    adb shell sm set-emulate-fbe false
    

    Uruchomienie jednego z tych poleceń spowoduje zrestartowanie urządzenia.

Sprawdzanie stanu szyfrowania zasad dotyczących urządzeń

Dozwolone przez aplikacje do administrowania urządzeniem DevicePolicyManager.getStorageEncryptionStatus() aby sprawdzić bieżący stan szyfrowania urządzenia.

Jeśli aplikacja jest kierowana na interfejs API niższy niż Android 7.0 (API 24): getStorageEncryptionStatus() za możliwość zwrotu ENCRYPTION_STATUS_ACTIVE jeśli urządzenie korzysta z pełnego szyfrowania dysku lub opartego na plikach szyfrowania bezpośredniego rozruchu. W obu tych przypadkach dane są zawsze zaszyfrowane w spoczynku.

Jeśli Twoja aplikacja jest kierowana na Androida 7.0 (interfejs API 24) lub nowszego, funkcja getStorageEncryptionStatus() zwraca wartość ENCRYPTION_STATUS_ACTIVE, jeśli urządzenie używa szyfrowania całego dysku. Zwraca ENCRYPTION_STATUS_ACTIVE_PER_USER, jeśli urządzenie używa szyfrowania na podstawie plików dzięki bezpośredniemu rozruchowi.

Jeśli utworzysz aplikację do administrowania urządzeniem aplikacji kierowanych na Androida 7.0, ENCRYPTION_STATUS_ACTIVE i ENCRYPTION_STATUS_ACTIVE_PER_USER, aby ustalić, czy urządzenie zaszyfrowane.

Dodatkowe przykłady kodu

Przykład DirectBoot pokazuje dodatkowe zastosowania interfejsów API opisanych na tej stronie.