Android 7.0, cihaz açılmış ancak kullanıcının cihazın kilidini açmadığı durumlarda güvenli bir Doğrudan Başlatma modunda çalışır. Bu özelliği desteklemek için sistem, veriler için iki depolama yeri sağlar:
- Varsayılan depolama konumu olan ve yalnızca kullanıcının cihazın kilidini açmasından sonra kullanılabilen kimlik bilgileri şifrelenmiş depolama alanı.
- 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 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 içerir. Doğrudan Önyükleme modunda çalışması gereken uygulamaların bazı yaygın kullanım alanları şunlardır:
- Alarm saati uygulamaları gibi planlanmış bildirimlere sahip uygulamalar.
- SMS uygulamaları gibi önemli kullanıcı bildirimleri sağlayan uygulamalar.
- TalkBack gibi erişilebilirlik hizmetleri sağlayan uygulamalar.
Uygulamanızın Doğrudan Önyükleme modunda çalışırken verilere erişmesi gerekiyorsa cihaz şifrelenmiş depolama alanını kullanın. 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.
Kullanıcıyla ilişkili bir anahtarla şifrelenmesi gereken veriler için kimlik bilgileri (ör. PIN veya şifre), kimlik bilgileri ile şifrelenmiş depolama alanını kullanır. Kimlik bilgisi ile şifrelenmiş depolama alanı, kullanıcı şu işlemleri başarıyla tamamladıktan sonra kullanılabilir: ve kullanıcı cihazı yeniden başlatana kadar kilit açmaz. Öğe Kullanıcı, cihazın kilidini açtıktan sonra kilit ekranını etkinleştirirse kimlik bilgisi ile şifrelenmiş depolama alanı mevcut.
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.
Şifreleme bilincine sahip bileşenler, cihaz yeniden başlatıldığında sistemden ACTION_LOCKED_BOOT_COMPLETED
yayın mesajı almak için kaydolabilir. Bu noktada cihaz ş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
değerinin şifreleme bilincine sahip olarak nasıl kaydedileceğini ve uygulama manifest dosyasına ACTION_LOCKED_BOOT_COMPLETED
için bir intent filtresi ekleneceğini gösteren bir örnektir:
<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. İlgili içeriği oluşturmak için kullanılan
Aşağıdaki örnek, cihazın şifrelenmiş depolama alanına erişir ve mevcut bir cihazı açar
uygulama verileri dosyası:
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...
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ı kilidini açma bildirimi alın
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 işleminden sonra cihazın kilidini açtığında bildirim almak için kilit açma bildirim mesajlarını dinlemek üzere çalışan bir bileşenden BroadcastReceiver
kaydedin. Kullanıcı, önyükleme işleminden sonra cihazın kilidini açtığında:
- Uygulamanızda anında bildirim gerektiren ön plan işlemleri varsa
ACTION_USER_UNLOCKED
mesajını dinleyin. - 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ı cihazın kilidini açmışsa telefon ederek bu durumu öğrenebilirsiniz.
UserManager.isUserUnlocked()
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. Tekliflerinizi otomatikleştirmek ve optimize etmek için
Context.moveSharedPreferencesFrom()
ve
Context.moveDatabaseFrom()
, yöntem çağırıcı olarak hedef bağlam ve bağımsız değişken olarak kaynak bağlam ile tercihi ve veritabanını taşır
kimlik bilgisi ile şifrelenmiş depolama alanı ile cihaz tarafından şifrelenmiş depolama arasındaki veriler.
Şifreler veya yetkilendirme jetonları gibi gizli kullanıcı bilgilerini cihaz şifrelenmiş depolama alanına kimlik bilgisi şifrelenmiş depolama alanı. Cihaz şifrelenmiş depolama alanına hangi diğer verilerin taşınacağına karar verirken dikkatli olun. Bazı durumlarda, iki şifrelenmiş mağazada ayrı veri kümelerini yönetmeniz gerekebilir.
Şifrelemeye duyarlı uygulamanızı test etme
Doğrudan Başlatma modu etkinken şifrelemeye duyarlı uygulamanızı 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 ş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 şifreleme kullanan bazı cihazlar (
ro.crypto.type=block
) ve Android 7.0 - Android 12 dosya tabanlı sürüme dönüştürülebilir bahsedeceğim. Bunu yapmanın iki yolu vardır:- Henüz yapmadıysanız cihazda Geliştirici seçenekleri'ni etkinleştirin Ayarlar > Telefon hakkında ve Derlemeye dokunun sayı ile yedi kez tıklayın. Ardından Ayarlar > Geliştirici seçenekleri'ne gidip 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ı: Dosya tabanlı şifrelemeye dönüştürme yöntemlerinden hangisi kullanılırsa kullanılsın cihazdaki tüm kullanıcı verileri silinir.
-
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
Emulated Direct Boot modunu kapatmak için aşağıdaki kabuk komutunu çalıştırın:
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()
karşılığında iade
ENCRYPTION_STATUS_ACTIVE
Cihaz tam disk şifrelemesi kullanıyorsa
doğrudan Başlatma ile dosya tabanlı şifrelemeyi kullanabilirsiniz. Her iki durumda da veriler her zaman aktif olmayan durumda şifrelenmiş olarak depolanır.
Uygulamanız Android 7.0 (API 24) veya sonraki sürümleri hedefliyorsa cihaz tam disk şifrelemesi kullanıyorsa getStorageEncryptionStatus()
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
döndürülür.
Cihaz yönetimi uygulaması derliyorsanız
Android 7.0'ı hedefleyen bir sürüm kullanıyorsanız her iki
ENCRYPTION_STATUS_ACTIVE
ve
Cihazın şu özelliklere sahip olup olmadığını belirlemek için ENCRYPTION_STATUS_ACTIVE_PER_USER
:
şifrelenmiş.
Diğer kod örnekleri
DirectBoot örneği, bu sayfada ele alınan API'lerin kullanımını daha ayrıntılı bir şekilde gösterir.