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.
- Zaszyfrowana pamięć urządzenia, czyli lokalizacja pamięci dostępna zarówno w trybie bezpośredniego uruchamiania, jak 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 zaplanowanym powiadomieniem (np. budzik). aplikacji.
- aplikacje, które wysyłają 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 potrzebuje dostępu do danych podczas uruchamiania w trybie bezpośredniego uruchamiania, użyj zaszyfrowanego miejsca na dane na urządzeniu. 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. Pamięć szyfrowana danymi logowania jest dostępna po tym, jak użytkownik odblokuje urządzenie, dopóki użytkownik nie uruchomi go ponownie. 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. Urządzenie jest obecnie zaszyfrowane
gdy dostępna jest pamięć masowa, a komponent może wykonywać zadania, które
uruchamiają się w trybie bezpośredniego uruchamiania, na przykład uruchamiając zaplanowany alarm.
Ten fragment kodu pokazuje, jak zarejestrować BroadcastReceiver
jako obsługujący szyfrowanie i dodać w pliku manifestu aplikacji filtr intencji dla ACTION_LOCKED_BOOT_COMPLETED
:
<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 zarówno do zaszyfrowanego magazynu danych urządzenia, jak i zaszyfrowanego magazynu danych z danymi logowania.
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.
ten przykład uzyskuje dostęp do zaszyfrowanej pamięci urządzenia i otwiera istniejącą
plik danych aplikacji:
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...
Zaszyfrowanej pamięci urządzenia używaj tylko do przechowywania informacji, które muszą być dostępne w trybie bezpośredniego uruchamiania. Nie używaj pamięci zaszyfrowanej na urządzeniu jako zaszyfrowanego 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 aplikacja używa tylko procesów w tle, które mogą działać z opóźnieniem
powiadomienie, nasłuchuj
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 używało trybu bezpośredniego rozruchu, być może
istniejących danych, które trzeba przenieść do zaszyfrowanej pamięci urządzenia. Używaj
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 informacji o użytkownikach, takich jak hasła czy tokeny autoryzacji, z szyfrowanego magazynu danych na urządzeniu do szyfrowanego magazynu danych na koncie. 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 sytuacjach konieczne może być zarządzanie osobne zbiory danych w dwóch zaszyfrowanych magazynach.
Testowanie aplikacji obsługującej szyfrowanie
Przetestuj aplikację obsługującą szyfrowanie z włączonym trybem bezpośredniego uruchamiania.
Większość urządzeń z najnowszymi wersjami Androida ma włączony tryb bezpośredniego rozruchu za każdym razem, gdy zostaną ustawione dane logowania na ekran blokady (kod PIN, wzór lub hasło). Dotyczy to wszystkich urządzeń korzystających z szyfrowania na podstawie plików. 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 nie używają domyślnie szyfrowania opartego na plikach, może pojawić się inne opcje testowania trybu bezpośredniego rozruchu:
-
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:- 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 wybierz Ustawienia > Dla programistów opcje i wybierz Konwertuj na szyfrowanie plików.
- Możesz też uruchomić te polecenia w powłoce:
adb reboot-bootloader
fastboot --wipe-and-use-fbe
Ostrzeżenie: dowolna metoda konwersji na szyfrowanie oparte na plikach powoduje wyczyszczenie wszystkich danych użytkownika na urządzeniu.
-
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 bezpośredniego rozruchu, uruchom następującą powłokę polecenie:
adb shell sm set-emulate-fbe false
Uruchomienie jednego z tych poleceń spowoduje zrestartowanie urządzenia.
Sprawdzanie stanu szyfrowania zasad dotyczących urządzeń
Aplikacje do zarządzania urządzeniami mogą używać funkcji DevicePolicyManager.getStorageEncryptionStatus()
do sprawdzania bieżącego stanu zaszyfrowania 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
moduł DirectBoot, przykład dokładniej przedstawia wykorzystanie interfejsów API omówionych na tej stronie.