Android 7.0 działa w bezpiecznym trybie bezpośredniego uruchamiania, gdy urządzenie jest włączone, ale użytkownik nie odblokował urządzenia. W tym celu system udostępnia 2 miejsca przechowywania danych:
- zaszyfrowany magazyn danych logowania, który jest domyślną lokalizacją przechowywania i jest dostępny tylko po odblokowaniu urządzenia przez użytkownika;
- Zaszyfrowana pamięć urządzenia, czyli miejsce na dane dostępne 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 rozruchu. Jeśli aplikacja musi podejmować działania w trybie bezpośredniego uruchamiania, możesz zarejestrować komponenty aplikacji, które będą uruchamiane w tym trybie. Do typowych przypadków użycia aplikacji, które muszą działać w trybie bezpośredniego rozruchu, należą:
- Aplikacje, które mają zaplanowane powiadomienia, np. aplikacje z budzikiem.
- Aplikacje, które wysyłają ważne powiadomienia dla użytkowników, np. aplikacje do obsługi SMS-ów.
- Aplikacje, które udostępniają usługi ułatwień dostępu, np. TalkBack.
Jeśli aplikacja musi mieć dostęp do danych podczas działania w trybie bezpośredniego rozruchu, użyj zaszyfrowanego miejsca na dane na urządzeniu. Zaszyfrowana pamięć urządzenia zawiera dane zaszyfrowane kluczem, który jest dostępny tylko po pomyślnym uruchomieniu urządzenia z weryfikacją.
W przypadku danych, które muszą być szyfrowane za pomocą klucza powiązanego z danymi logowania użytkownika, np. kodem PIN lub hasłem, używaj magazynu szyfrowanego za pomocą danych logowania. Szyfrowane przechowywanie danych logowania jest dostępne po odblokowaniu urządzenia przez użytkownika i do momentu ponownego uruchomienia urządzenia. Jeśli użytkownik włączy ekran blokady po odblokowaniu urządzenia, zaszyfrowany magazyn danych logowania pozostanie dostępny.
Prośba o dostęp do uruchamiania podczas bezpośredniego rozruchu
Aplikacje muszą zarejestrować swoje komponenty w systemie, zanim będą mogły działać w trybie bezpośredniego uruchamiania lub uzyskać dostęp do zaszyfrowanej pamięci urządzenia. Aplikacje rejestrują się w systemie, oznaczając komponenty jako obsługujące szyfrowanie. Aby oznaczyć komponent jako obsługujący szyfrowanie, ustaw w pliku manifestu atrybut
android:directBootAware
na wartość true.
Komponenty obsługujące szyfrowanie mogą zarejestrować się, aby otrzymywać komunikat rozgłoszeniowy ACTION_LOCKED_BOOT_COMPLETED
z systemu po ponownym uruchomieniu urządzenia. W tym momencie dostępne jest zaszyfrowane miejsce na dane urządzenia, a komponent może wykonywać zadania, które muszą być uruchamiane w trybie bezpośredniego uruchamiania, np. wywoływać zaplanowany alarm.
Ten fragment kodu pokazuje, jak zarejestrować BroadcastReceiver
jako aplikację obsługującą szyfrowanie i dodać filtr intencji dla ACTION_LOCKED_BOOT_COMPLETED
w pliku manifestu 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 zarówno do zaszyfrowanego miejsca na dane na urządzeniu, jak i do zaszyfrowanego miejsca na dane 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ę, wywołując funkcję
Context
Context.createDeviceProtectedStorageContext()
. Wszystkie wywołania interfejsu API pamięci masowej wykonane w tym kontekście uzyskują dostęp do zaszyfrowanej pamięci urządzenia. W poniższym przykładzie uzyskuje się dostęp do zaszyfrowanego miejsca na dane na urządzeniu i otwiera istniejący 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...
Używaj zaszyfrowanej pamięci urządzenia tylko w przypadku informacji, które muszą być dostępne w trybie bezpośredniego uruchamiania. Nie używaj zaszyfrowanej pamięci urządzenia jako ogólnego zaszyfrowanego magazynu. W przypadku prywatnych informacji o użytkowniku lub zaszyfrowanych danych, które nie są potrzebne w trybie bezpośredniego rozruchu, używaj pamięci zaszyfrowanej za pomocą danych logowania.
Otrzymywanie powiadomień 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 miejsca na dane logowania i korzystać ze zwykłych usług systemowych, które zależą od danych logowania użytkownika.
Aby otrzymywać powiadomienia, gdy użytkownik odblokuje urządzenie po ponownym uruchomieniu, zarejestruj BroadcastReceiver
w działającym komponencie, aby nasłuchiwać wiadomości z powiadomieniami o odblokowaniu. Gdy użytkownik odblokuje urządzenie po uruchomieniu:
- Jeśli Twoja aplikacja ma procesy działające na pierwszym planie, które wymagają natychmiastowego powiadomienia, nasłuchuj wiadomości
ACTION_USER_UNLOCKED
. - Jeśli Twoja aplikacja używa tylko procesów działających w tle, które mogą reagować na opóźnione powiadomienie, nasłuchuj komunikatu
ACTION_BOOT_COMPLETED
.
Jeśli użytkownik odblokował urządzenie, możesz to sprawdzić, dzwoniąc pod numer UserManager.isUserUnlocked()
.
Migracja dotychczasowych danych
Jeśli użytkownik zaktualizuje urządzenie, aby korzystać z trybu bezpośredniego rozruchu, możesz mieć istniejące dane, które należy przenieść do zaszyfrowanej pamięci urządzenia. Użyj funkcji
Context.moveSharedPreferencesFrom()
i
Context.moveDatabaseFrom()
, gdzie kontekst docelowy jest wywołującym metodę, a kontekst źródłowy jest argumentem, aby przenieść dane preferencji i bazy danych między zaszyfrowanym za pomocą danych logowania a zaszyfrowanym na urządzeniu miejscem na dane.
Nie migruj prywatnych informacji o użytkowniku, takich jak hasła czy tokeny autoryzacji, z zaszyfrowanego miejsca przechowywania danych logowania do zaszyfrowanego miejsca przechowywania danych na urządzeniu. Decydując o tym, jakie inne dane przenieść do zaszyfrowanej pamięci urządzenia, kieruj się zdrowym rozsądkiem. W niektórych przypadkach może być konieczne zarządzanie oddzielnymi zestawami danych w obu zaszyfrowanych miejscach.
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 włącza tryb bezpośredniego uruchamiania, gdy tylko zostanie ustawione hasło blokady ekranu (kod PIN, wzór lub hasło). Dotyczy to w szczególności wszystkich urządzeń, które korzystają z szyfrowania opartego na plikach. Aby sprawdzić, czy urządzenie korzysta z szyfrowania opartego na plikach, uruchom to polecenie powłoki:
adb shell getprop ro.crypto.type
Jeśli dane wyjściowe to file
, na urządzeniu jest włączone szyfrowanie oparte na plikach.
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ą Androida w wersji od 7.0 do 12, można przekonwertować na szyfrowanie oparte na plikach. Można to zrobić na dwa sposoby:- Jeśli nie masz jeszcze włączonych opcji programisty, włącz je na urządzeniu. Aby to zrobić, otwórz Ustawienia > Informacje o telefonie i 7 razy kliknij Numer kompilacji. Następnie otwórz Ustawienia > Opcje programisty i kliknij Konwertuj na szyfrowanie plików.
- Możesz też uruchomić te polecenia w powłoce:
adb reboot-bootloader
fastboot --wipe-and-use-fbe
Ostrzeżenie: każda z metod przekształcania na szyfrowanie oparte na plikach powoduje wyczyszczenie wszystkich danych użytkownika na urządzeniu.
-
Urządzenia z Androidem 13 lub starszym obsługują „emulowany” tryb bezpośredniego rozruchu, który wykorzystuje uprawnienia do plików, aby symulować efekty blokowania i odblokowywania zaszyfrowanych plików. Trybu emulacji używaj tylko podczas programowania, ponieważ może on spowodować utratę danych. Aby włączyć emulowany tryb bezpośredniego uruchamiania, ustaw na urządzeniu wzór blokady, a gdy pojawi się prośba o skonfigurowanie bezpiecznego ekranu startowego, 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 uruchamiania, uruchom to polecenie powłoki:
adb shell sm set-emulate-fbe false
Uruchomienie dowolnego z tych poleceń spowoduje ponowne uruchomienie urządzenia.
Sprawdzanie stanu szyfrowania zasad dotyczących urządzenia
Aplikacje do zarządzania urządzeniami mogą używać tego interfejsu, aby sprawdzać bieżący stan szyfrowania urządzenia.DevicePolicyManager.getStorageEncryptionStatus()
Jeśli aplikacja jest kierowana na poziom interfejsu API niższy niż Android 7.0 (API 24), funkcja
getStorageEncryptionStatus()
zwraca
ENCRYPTION_STATUS_ACTIVE
wartość, jeśli urządzenie korzysta z szyfrowania całego dysku lub szyfrowania opartego na plikach z bezpośrednim rozruchem. W obu tych przypadkach dane są zawsze przechowywane w spoczynku w postaci zaszyfrowanej.
Jeśli Twoja aplikacja jest kierowana na Androida 7.0 (API 24) lub nowszego,getStorageEncryptionStatus()
zwracaENCRYPTION_STATUS_ACTIVE
wartość, jeśli urządzenie korzysta z szyfrowania całego dysku. Zwraca wartość ENCRYPTION_STATUS_ACTIVE_PER_USER
, jeśli urządzenie używa szyfrowania opartego na plikach z bezpośrednim rozruchem.
Jeśli tworzysz aplikację do zarządzania urządzeniami, która jest przeznaczona na Androida 7.0, sprawdź, czy urządzenie jest zaszyfrowane, korzystając z ENCRYPTION_STATUS_ACTIVE
i ENCRYPTION_STATUS_ACTIVE_PER_USER
.
Dodatkowe przykłady kodu
Przykład DirectBoot dodatkowo ilustruje użycie interfejsów API omówionych na tej stronie.