Android 7.0, cihaz açıldığında ancak kullanıcı cihazın kilidini açmadığında güvenli bir Doğrudan Başlatma modunda çalışır. Bunu desteklemek için sistem, veriler için iki depolama konumu sağlar:
- Varsayılan depolama konumu olan ve yalnızca kullanıcı cihazın kilidini açtıktan sonra kullanılabilen şifrelenmiş kimlik bilgisi deposu.
- Hem doğrudan başlatma modunda hem de kullanıcı cihazın kilidini açtıktan sonra kullanılabilen bir depolama alanı olan cihazda şifrelenmiş depolama alanı.
Varsayılan olarak, uygulamalar doğrudan başlatma modunda çalışmaz. Uygulamanızın doğrudan başlatma modu sırasında işlem yapması gerekiyorsa bu modda çalıştırılacak uygulama bileşenlerini kaydedebilirsiniz. Doğrudan başlatma modunda çalışması gereken uygulamalarla ilgili bazı yaygın kullanım alanları şunlardır:
- Alarm uygulamaları gibi planlanmış bildirimleri olan uygulamalar.
- SMS uygulamaları gibi önemli kullanıcı bildirimleri sağlayan uygulamalar.
- TalkBack gibi erişilebilirlik hizmetleri sağlayan uygulamalar.
Uygulamanızın doğrudan başlatma modunda çalışırken verilere erişmesi gerekiyorsa cihaz şifreli depolama alanını kullanın. Cihazın şifrelenmiş depolama alanında, yalnızca cihaz başarılı bir doğrulanmış başlatma işlemi gerçekleştirdikten sonra kullanılabilen bir anahtarla şifrelenmiş veriler bulunur.
PIN veya şifre gibi kullanıcı kimlik bilgileriyle ilişkili bir anahtarla şifrelenmesi gereken veriler için kimlik bilgileriyle ş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ılmaya devam eder.
Doğrudan başlatma sırasında çalıştırmak için erişim isteğinde bulunma
Uygulamalar, bileşenlerini Doğrudan Başlatma modunda çalıştırabilmek veya cihazda şifrelenmiş depolama alanına erişebilmek için sistemde kaydettirmelidir. Uygulamalar, bileşenleri şifreleme uyumlu olarak işaretleyerek sisteme kaydolur. Bileşeninizi şifreleme uyumlu olarak işaretlemek için manifest dosyanızda android:directBootAware
özelliğini true olarak ayarlayın.
Şifreleme konusunda bilgili bileşenler, cihaz yeniden başlatıldığında sistemden ACTION_LOCKED_BOOT_COMPLETED
yayın mesajı almak için kaydolabilir. Bu noktada cihazda şifrelenmiş depolama alanı kullanılabilir ve bileşeniniz, planlanmış bir alarmı tetikleme gibi doğrudan başlatma modunda çalıştırılması gereken görevleri yürütebilir.
Aşağıdaki kod snippet'i, BroadcastReceiver
öğesini şifreleme konusunda bilgili olarak kaydetme ve uygulama manifestine ACTION_LOCKED_BOOT_COMPLETED
için bir intent filtresi ekleme örneğidir:
<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 cihazın şifrelenmiş depolama alanına hem de kimlik bilgilerinin şifrelenmiş depolama alanına erişebilir.
Şifrelenmiş cihaz depolama alanına erişme
Cihazda şifrelenmiş depolama alanına erişmek için Context
çağrısını yaparak ikinci bir Context
örneği oluşturun.Context.createDeviceProtectedStorageContext()
Bu bağlam kullanılarak yapılan tüm depolama alanı API çağrıları, cihazın şifrelenmiş depolama alanına erişir. Aşağıdaki örnekte, cihazın şifrelenmiş depolama alanına erişilip mevcut bir uygulama veri 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...
Cihazda şifrelenmiş depolama alanını yalnızca doğrudan başlatma modunda erişilmesi gereken bilgiler için kullanın. Cihaz şifrelemeli depolama alanını genel amaçlı şifrelenmiş bir depolama alanı olarak kullanmayın. Özel kullanıcı bilgileri veya Doğrudan Başlatma modu sırasında gerekli olmayan şifrelenmiş veriler için kimlik bilgisi şifreli depolama alanını kullanın.
Kullanıcı kilidi açtığında bildirim alma
Kullanıcı, yeniden başlatma işleminden sonra cihazın kilidini açtığında uygulamanız, kimliği şifrelenmiş depolamaya erişmeye geçebilir ve kullanıcı kimlik bilgilerine bağlı olan normal sistem hizmetlerini kullanabilir.
Kullanıcı, yeniden başlatma işleminden sonra cihazın kilidini açtığında bildirim almak için çalışan bir bileşenden BroadcastReceiver
kaydederek kilit açma bildirimi mesajlarını dinleyin. Kullanıcı, başlatma işleminden sonra cihazın kilidini açtığında:
- Uygulamanızda acil bildirim gerektiren ön plan işlemleri varsa
ACTION_USER_UNLOCKED
mesajını dinleyin. - Uygulamanız yalnızca gecikmeli bir bildirime göre işlem yapabilen arka plan işlemlerini kullanıyorsa
ACTION_BOOT_COMPLETED
mesajını dinleyin.
Kullanıcı cihazın kilidini açtıysa UserManager.isUserUnlocked()
numarasını arayarak öğrenebilirsiniz.
Mevcut verileri taşıma
Kullanıcı cihazını doğrudan başlatma modunu kullanacak şekilde güncellerse cihaz şifreli depolama alanına taşınması gereken mevcut verileriniz olabilir. Tercih ve veritabanı verilerini kimlik bilgileriyle şifrelenmiş depolama alanı ile cihazla şifrelenmiş depolama alanı arasında taşımak için hedef bağlamı yöntem çağıran, kaynak bağlamı ise bağımsız değişken olarak kullanarak Context.moveSharedPreferencesFrom()
ve Context.moveDatabaseFrom()
yöntemlerini kullanın.
Şifreler veya yetkilendirme jetonları gibi özel kullanıcı bilgilerini kimlik bilgisi şifreli depolama alanından cihaz şifreli depolama alanına taşımayın. Cihazda şifrelenmiş depolama alanına hangi verileri taşıyacağınıza karar verirken dikkatli olun. Bazı senaryolarda, iki şifrelenmiş depolama alanında ayrı veri kümelerini yönetmeniz gerekebilir.
Şifrelemeye duyarlı uygulamanızı test etme
Şifreleme konusunda bilgi sahibi uygulamanızı doğrudan başlatma modu etkin durumdayken test edin.
Android'in son sürümlerini çalıştıran çoğu cihaz, kilit ekranı kimlik bilgisi (PIN, desen veya şifre) ayarlandığında doğrudan başlatma modunu etkinleştirir. Bu durum özellikle dosya tabanlı şifreleme kullanan tüm cihazlarda geçerlidir. Bir cihazın dosya tabanlı şifreleme kullanıp kullanmadığını kontrol etmek için aşağıdaki kabuk komutunu çalıştırın:
adb shell getprop ro.crypto.type
Çıktı file
ise cihazda dosya tabanlı şifreleme etkinleştirilmiştir.
Varsayılan olarak dosya tabanlı şifreleme kullanmayan cihazlarda doğrudan başlatma modunu test etmek için başka seçenekler olabilir:
-
Tam disk şifreleme kullanan (
ro.crypto.type=block
) 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:- Cihazda Ayarlar > Telefon hakkında'ya gidip Derleme numarası'na yedi kez dokunarak Geliştirici seçenekleri'ni etkinleştirin. Ardından Ayarlar > Geliştirici seçenekleri'ne gidip Dosya şifrelemeye dönüştür'ü seçin.
- Alternatif olarak, aşağıdaki kabuk komutlarını çalıştırın:
adb reboot-bootloader
fastboot --wipe-and-use-fbe
Uyarı: Dosya tabanlı şifrelemeye dönüştürme yöntemlerinden biri kullanıldığında cihazdaki tüm kullanıcı verileri silinir.
-
Android 13 veya daha eski sürümlerin yüklü olduğu cihazlar, şifrelenmiş dosyaların kilitlenip kilidinin açılmasının etkilerini simüle etmek için dosya izinlerini kullanan "emüle edilmiş" doğrudan başlatma modunu destekler. Geliştirme sırasında yalnızca emülasyon modunu kullanın. Bu mod, veri kaybına neden olabilir. Emüle edilmiş Direct Boot modunu etkinleştirmek için cihazda kilit deseni ayarlayın, kilit deseni ayarlanırken güvenli başlatma ekranı istenirse "Hayır, teşekkürler"i seçin ve ardından şu kabuk komutunu çalıştırın:
adb shell sm set-emulate-fbe true
Emüle edilmiş doğrudan başlatma modunu devre dışı bırakmak için aşağıdaki kabuk komutunu çalıştırın:
adb shell sm set-emulate-fbe false
Bu komutlardan herhangi birinin çalıştırılması cihazın yeniden başlatılmasına neden olur.
Cihaz politikası şifreleme durumunu kontrol etme
Cihaz yönetimi uygulamaları, cihazın mevcut şifreleme durumunu kontrol etmek için
DevicePolicyManager.getStorageEncryptionStatus()
kullanabilir.
Uygulamanız Android 7.0'dan (API 24) daha düşük bir API düzeyini hedefliyorsa cihazda tam disk şifreleme veya doğrudan başlatma ile dosya tabanlı şifreleme kullanılıyorsa getStorageEncryptionStatus()
değeri döndürülür.
ENCRYPTION_STATUS_ACTIVE
Her iki durumda da veriler, aktif olmadıkları sürece her zaman şifrelenmiş olarak depolanır.
Uygulamanız Android 7.0'ı (API 24) veya sonraki bir sürümü hedefliyorsa,
getStorageEncryptionStatus()
cihazda tam disk şifreleme kullanılıyorsa
ENCRYPTION_STATUS_ACTIVE
değerini döndürür. Cihaz, doğrudan başlatma ile dosya tabanlı şifreleme kullanıyorsa ENCRYPTION_STATUS_ACTIVE_PER_USER
değerini döndürür.
Android 7.0'ı hedefleyen bir cihaz yönetimi uygulaması oluşturuyorsanız cihazın şifrelenip şifrelenmediğini belirlemek için hem ENCRYPTION_STATUS_ACTIVE
hem de ENCRYPTION_STATUS_ACTIVE_PER_USER
değerlerini kontrol ettiğinizden emin olun.
Ek kod örnekleri
DirectBoot örneği, bu sayfada ele alınan API'lerin kullanımını daha ayrıntılı bir şekilde gösterir.