Android 7.0 güvenli Doğrudan Başlatma modunda çalışır ancak kullanıcı cihazın kilidini açmadığında olanak tanır. Sistem, bunu desteklemek amacıyla veriler için iki depolama konumu sağlar:
- Varsayılan depolama konumu olan kimlik bilgisi ile şifrelenmiş depolama ve yalnızca kullanıcı cihazın kilidini açtıktan sonra kullanılabilir.
- Hem Doğrudan Başlatma modunda hem de kullanıcının cihazın kilidini açmasından sonra kullanılabilen bir depolama alanı olan cihaz şifrelenmiş depolama alanı.
Varsayılan olarak uygulamalar Doğrudan Başlatma modu sırasında çalışmaz. Uygulamanızın Doğrudan Başlatma modu sırasında işlem yapması gerekiyorsa bu modda çalışacak uygulama bileşenlerini kaydedebilirsiniz. Bazı yaygın kullanım alanları Doğrudan Başlatma modunda çalışması gereken uygulamalar için şunları içerir:
- Alarm saati uygulamaları gibi planlanmış bildirimlere sahip uygulamalar.
- SMS uygulamaları gibi önemli kullanıcı bildirimleri sağlayan uygulamalar.
- TalkBack gibi erişilebilirlik hizmetleri sunan uygulamalar.
Uygulamanızın Doğrudan Başlatma modunda çalışırken verilere erişmesi gerekiyorsa şunu kullanın: şifrelenmiş depolama alanı. Cihaz şifrelenmiş depolama alanı, yalnızca cihaz doğrulanmış başlatmayı başarıyla gerçekleştirdikten sonra kullanılabilen bir anahtarla şifrelenmiş veriler içerir.
PIN veya şifre gibi kullanıcı kimlik bilgileriyle ilişkili bir anahtarla şifrelenmesi gereken veriler için kimlik bilgisi şifrelenmiş depolama alanını kullanın. Kimlik bilgisi şifrelenmiş depolama alanı, kullanıcı cihazın kilidini başarıyla açtıktan sonra ve cihazı yeniden başlatana kadar kullanılabilir. Kullanıcı, cihazın kilidini açtıktan sonra kilit ekranını etkinleştirirse kimlik bilgisi şifrelenmiş depolama alanı kullanılabilir durumda kalır.
Doğrudan önyükleme sırasında çalıştırma erişimi isteğinde bulunma
Uygulamalar, çalıştırılmadan önce bileşenlerini sisteme kaydetmelidir.
Doğrudan Başlatma modunda çalışabilir veya şifrelenmiş cihaza erişebilir
depolama alanına sahip olursunuz. Uygulamalar, bileşenleri şu şekilde işaretleyerek sisteme kaydedilir:
şifrelemeye duyarlı olduğundan emin olun. Bileşeninizi şifreleme bilincine sahip olarak işaretlemek için manifest dosyanızda android:directBootAware
özelliğini true olarak ayarlayın.
Şifrelemeye duyarlı bileşenler, indirilebilecek
Şuradan ACTION_LOCKED_BOOT_COMPLETED
anons:
sistemi tekrar başlatmaz. Bu noktada cihaz şifrelendi
kullanılabilir bir depolama alanı sağlar ve bileşeniniz, Google'a geçiş yaptığınızda
doğrudan Başlatma modunda çalışırken (ör. programlanmış bir alarmı tetiklemek) çalışır.
Aşağıdaki kod snippet'i,
BroadcastReceiver
şifrelemeyi kullanın ve
Uygulama manifestinde, ACTION_LOCKED_BOOT_COMPLETED
için intent filtresi:
<receiver android:directBootAware="true" > ... <intent-filter> <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" /> </intent-filter> </receiver>
Kullanıcı cihazın kilidini açtıktan sonra tüm bileşenler hem kimlik bilgileri ile şifrelenmiş depolama alanının yanı sıra şifreli depolama alanı da dahildir.
Cihazla şifrelenmiş depolama alanına eriş
Cihazla şifrelenmiş depolama alanına erişmek için ikinci bir şifre oluşturun
Çağrı yaparak Context
örneği
Context.createDeviceProtectedStorageContext()
. Tüm depolama API'leri
Bu bağlam kullanılarak yapılan aramalar, cihazın şifrelenmiş depolama alanına erişir. Aşağıdaki örnekte, cihazın şifrelenmiş depolama alanına erişiliyor ve mevcut bir uygulama verisi dosyası açılıyor:
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...
Cihaz şifrelenmiş depolama alanını yalnızca Doğrudan Önyükleme modu sırasında erişilmesi gereken bilgiler için kullanın. Cihaz şifrelenmiş depolama alanını genel amaçlı şifrelenmiş depolama alanı olarak kullanmayın. Özel kullanıcı bilgileri veya işlem sırasında ihtiyaç duyulmayan şifrelenmiş veriler için Doğrudan Başlatma modu, kimlik bilgisi ile şifrelenmiş depolamayı kullanın.
Kullanıcının kilidi açması hakkında bildirim alma
Kullanıcı, yeniden başlatma işleminden sonra cihazın kilidini açtığında uygulamanız, kimlik bilgisiyle şifrelenmiş depolamaya erişmeye geçebilir ve kullanıcı kimlik bilgilerine bağlı olan normal sistem hizmetlerini kullanabilir.
Kullanıcı, yeniden başlatma sonrasında cihazın kilidini açtığında bildirim almak için:
çalışan bir bileşenden BroadcastReceiver
kaydedin
kilit açma bildirim mesajlarını dinlemeyi sağlar. Kullanıcı cihazın kilidini açtığında
açılıştan sonra:
- Uygulamanızda acil bildirim gerektiren ön plan işlemleri varsa
ACTION_USER_UNLOCKED
mesajını dinle. - Uygulamanız yalnızca gecikmeli olarak işlem yapabilecek arka plan işlemleri kullanıyorsa
bildirimi dinleyin,
ACTION_BOOT_COMPLETED
mesajını alırsınız.
Kullanıcının cihazın kilidini açıp açmadığını öğrenmek için UserManager.isUserUnlocked()
numaralı telefonu arayabilirsiniz.
Mevcut verileri taşıma
Bir kullanıcı cihazını Doğrudan Başlatma modunu kullanacak şekilde güncellerse
Cihazla şifrelenmiş depolama alanına taşınması gereken mevcut veriler. Tercih ve veritabanı verilerini kimlik bilgisi şifrelenmiş depolama alanı ile cihaz şifrelenmiş depolama alanı arasında taşımak için hedef bağlamı yöntem çağıran ve kaynak bağlamı bağımsız değişken olarak kullanarak Context.moveSharedPreferencesFrom()
ve Context.moveDatabaseFrom()
'u kullanın.
Şifreler veya yetkilendirme jetonları gibi gizli kullanıcı bilgilerini cihaz şifrelenmiş depolama alanına kimlik bilgisi şifrelenmiş depolama alanı. Neye karar vereceğiniz konusunda size en uygun gelen yanıtı verin şifreli depolama alanına taşınacak diğer veriler. Bazı durumlarda, şifrelenmiş iki depoda ayrı veri kümeleri oluşturabilir.
Şifreleme bilincine sahip uygulamanızı test etme
Şifreleme bilincine sahip uygulamanızı Doğrudan Başlatma modu etkinken test edin.
Android'in son sürümlerini çalıştıran cihazların çoğu Doğrudan Başlatma modunu etkinleştiriyor kilit ekranı kimlik bilgisi (PIN, desen veya şifre) ayarlandığında geçerlidir. Özellikle, dosya tabanlı şifreleme kullanan tüm cihazlarda bu durum geçerlidir. Bir cihazın dosya tabanlı şifreleme kullanıp kullanmadığını kontrol etmek için şu komutu çalıştırın: kabuk komutu:
adb shell getprop ro.crypto.type
Çıkış file
ise cihazda dosya tabanlı şifreleme etkindir.
Varsayılan olarak dosya tabanlı şifreleme kullanmayan cihazlarda Doğrudan Başlatma modunu test etmek için başka seçenekler olabilir:
-
Tam disk şifrelemeyi (
ro.crypto.type=block
) kullanan ve Android 7.0 ile Android 12 arasında bir sürümü çalıştıran bazı cihazlar dosya tabanlı şifrelemeye dönüştürülebilir. Bunu yapmanın iki yolu vardır:- Cihazınızda Ayarlar > Telefon hakkında'ya gidip Derleme numarası'na yedi kez dokunarak Geliştirici seçenekleri'ni etkinleştirmediyseniz bunu yapın. Ardından Ayarlar > Geliştirici seçeneklerini tıklayın ve Dosya şifrelemesine dönüştür'ü seçin.
- Alternatif olarak aşağıdaki kabuk komutlarını da çalıştırabilirsiniz:
adb reboot-bootloader
fastboot --wipe-and-use-fbe
Uyarı: Her iki yöntem de Dosya tabanlı şifreleme, cihazdaki tüm kullanıcı verilerini siler.
-
Android 13 veya daha eski sürümleri çalıştıran cihazlar, şifrelenmiş dosyaların kilitlenmesi ve kilidinin açılmasının etkilerini simüle etmek için dosya izinlerini kullanan "taklit edilmiş" bir Doğrudan Önyükleme modunu destekler. Yalnızca emülasyonlu modu kullan Geliştirme sırasında; veri kaybına neden olabilir. Emulated Direct Boot modunu etkinleştirmek için cihazda bir kilit deseni ayarlayın, kilit deseni ayarlarken güvenli bir başlangıç ekranı istenirse "Hayır teşekkürler"i seçin ve ardından aşağıdaki kabuk komutunu çalıştırın:
adb shell sm set-emulate-fbe true
Emülasyonlu Doğrudan Başlatma modunu kapatmak için aşağıdaki kabuğu çalıştırın komut:
adb shell sm set-emulate-fbe false
Bu komutlardan birinin çalıştırılması cihazın yeniden başlatılmasına neden olur.
Cihaz politikası şifreleme durumunu kontrol etme
Kullanabilecekleri cihaz yönetimi uygulamaları
DevicePolicyManager.getStorageEncryptionStatus()
cihazın mevcut şifreleme durumunu kontrol edin.
Uygulamanız Android 7.0'dan (API 24) daha düşük bir API düzeyini hedefliyorsa getStorageEncryptionStatus()
, cihazda doğrudan önyükleme ile tam disk şifrelemesi veya dosya tabanlı şifreleme kullanılıyorsa ENCRYPTION_STATUS_ACTIVE
döndürür. Her iki durumda da veriler,
kullanımda değilken her zaman şifrelenmiş halde saklanır.
Uygulamanız Android 7.0 (API 24) veya sonraki sürümleri hedefliyorsa
getStorageEncryptionStatus()
karşılığında iade
Cihaz tam disk şifreleme kullanıyorsa ENCRYPTION_STATUS_ACTIVE
. Cihaz, Doğrudan Başlatma ile dosya tabanlı şifreleme kullanıyorsa ENCRYPTION_STATUS_ACTIVE_PER_USER
döndürülür.
Android 7.0'ı hedefleyen bir cihaz yönetimi uygulaması oluşturursanız cihazın şifrelenmiş olup olmadığını belirlemek için hem ENCRYPTION_STATUS_ACTIVE
hem de ENCRYPTION_STATUS_ACTIVE_PER_USER
değerini kontrol ettiğinizden emin olun.
Diğer kod örnekleri
DirectBoot örnek, bu sayfada ele alınan API'lerin kullanımını daha ayrıntılı bir şekilde gösterir.