Burada Android Kılavuzundan alıntı yapıyorum , ancak:
NOT:
Kullandığım kaynak doğrudan Marshmallow ile ilgili değil, Lollipop ve üstü ile ilgilidir.
TP: DR
Şimdi OP'nin sorularını yanıtlayacağım. Teknik detaylar takip edilecektir.
Varsayılan şifreleme anahtarı donanım kaynağından (TPM benzer bir çip) ve olarak tanımlanan AOSP varsayılan parola geliyor default_password
yılında cryptfs.c
kaynak dosyası, aşağıya bakın.
Evet, sadece varsayılan değil, herhangi bir şifre bir anahtara yapılır ve TEE adı verilen TPM benzeri bir çipte saklanır ("Güvenilir Yürütme Ortamı" nın kısaltmasıdır, daha fazla bilgi için aşağıya bakın).
Cihazın SoC'sindeki yongalara UART / JTAG erişimi olan bir hacker, TEE anahtarına teknik olarak erişebilir veya özel bir çekirdek bu bilgileri bir hacker'a sızdırabilir. Komplo teorilerindeki bazı 3 harfli ajanslar, üretim cihazlarında bu güvensiz çekirdekleri kullanmak için OEM ile ortaklık kurabilirler, ancak bunun için çok fazla mağaza bırakmam. Daha fazla ayrıntı için yine bu cevabın son bölümüne bakın.
Bir hacker'ın anahtara erişmesini engelleyen tek şey, bunun için gereken çok fazla çaba.
- Bellenimin ( Google tarafından "Doğrulanmış Önyükleme" olarak adlandırılır) karma değerini kontrol etmek aslında Lollipop üzerinde ve üstünde varsayılan olarak (ve JellyBean 4.3'ten itibaren kullanılabilir) denilen bir çekirdek modülü tarafından yapılır
dm-verity
. Ancak, bu şifreleme durumundan bağımsızdır.
Kaynak: AOSP güvenlik kılavuzu burada .
- Sistemin şifresini özel bir parola ile çözme işlemiyle ilgili süreç hakkında aşağıya bakın. Size burada sadece kullanıcı şifresinin şifreleme anahtarının hem oluşturulmasında hem de kullanımında yer aldığını söyleyeceğim.
genel bakış
İlk önyüklemede, aygıt rastgele oluşturulan 128 bitlik bir ana anahtar oluşturur ve ardından varsayılan bir parola ve depolanmış tuz ile karıştırır. Varsayılan parola: "default_password" Ancak, sonuçta elde edilen sağlama değeri, ana anahtarı şifrelemek için bir imza karma değeri kullanan bir TEE (TrustZone gibi) aracılığıyla da imzalanır.
Android Açık Kaynak Projesi cryptfs.c dosyasında tanımlanan varsayılan şifreyi bulabilirsiniz .
Kullanıcı cihazda PIN / parolayı veya parolayı ayarladığında, yalnızca 128 bit anahtar yeniden şifrelenir ve saklanır. (ör. kullanıcı PIN / geçiş / kalıp değişiklikleri kullanıcı verileri bölümünün yeniden şifrelenmesine neden OLMAZ.)
Varsayılan şifrelemeyle şifrelenmiş bir cihazı başlatma
Şifrelenmemiş şifreli bir cihazı açtığınızda bu olur. Android 5.0 cihazları ilk önyüklemede şifrelendiğinden, ayarlanmış bir şifre olmamalıdır ve bu nedenle bu varsayılan şifreleme durumudur.
- Şifrelenmemiş / şifrelenmemiş verileri algılama
/ Data bağlanamayacağı ve bayraklardan biri encryptable
veya forceencrypt
ayarlandığı için Android cihazının şifreli olduğunu tespit edin .
vold
ayarlar vold.decrypt
için trigger_default_encryption
başlar, hangi defaultcrypto
hizmeti. trigger_default_encryption
/ verinin şifreyle veya şifresiz olarak şifrelenip şifrelenmediğini görmek için şifreleme türünü kontrol eder.
- Şifreyi çöz / veri
dm-crypt
Cihazı blok cihaz üzerinde oluşturur, böylece cihaz kullanıma hazır hale gelir.
- Montaj / veri
vold
daha sonra şifresi çözülmüş gerçek / veri bölümünü bağlar ve yeni bölümü hazırlar. Bu özelliği ayarlar vold.post_fs_data_done
için 0
ayarlar ve daha sonra vold.decrypt
için trigger_post_fs_data
. Bu komutlarının init.rc
çalışmasına neden olur post-fs-data
. Onlar gerekli dizinleri veya bağlantılar oluşturmak ve sonra koyacaktır vold.post_fs_data_done
için 1
.
Bir kez vold
bu özelliğinde 1 görür, bu özelliğini ayarlar vold.decrypt
için: trigger_restart_framework
. Bu init.rc
, sınıfta hizmetlerin main
yeniden başlatılmasına ve önyüklemeden bu yana ilk seferde late_start sınıfında hizmetlerin başlatılmasına neden olur .
- Çerçeveyi başlat
Şimdi çerçeve şifresi çözülmüş / veri kullanarak tüm hizmetlerini önyükliyor ve sistem kullanıma hazır.
Varsayılan şifreleme olmadan şifreli bir cihazı başlatma
Şifresi ayarlanmış şifreli bir cihazı başlattığınızda olan şey budur. Cihazın şifresi bir pin, desen veya şifre olabilir.
- Şifrelenmiş cihazı bir şifre ile tespit etme
Bayrak nedeniyle Android cihazının şifreli olduğunu tespit edin ro.crypto.state = "encrypted"
vold
/ data bir parola ile şifrelenmiş olduğu vold.decrypt
için ayarlanır trigger_restart_min_framework
.
- Tmpfs Dağı
init
/ data için verilen ilk bağlama seçeneklerini kaydetmek için beş özellik ayarlar init.rc
. vold
kripto eşlemesini ayarlamak için şu özellikleri kullanır:
ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags
(ASCII 8 basamaklı onaltılık sayıdan önce 0x gelir)
- Şifre istemek için çerçeveyi başlat
Çerçeve başlar ve vold.decrypt
ayarlandığını görür trigger_restart_min_framework
. Bu, çerçeveye bir tmpfs /data
diskte önyükleme yaptığını ve kullanıcı parolasını alması gerektiğini söyler .
Ancak, önce diskin düzgün bir şekilde şifrelenmiş olduğundan emin olunmalıdır. Komutu cryptfs cryptocomplete
adresine gönderir vold
. vold
şifreleme başarıyla tamamlandıysa 0, dahili hatada -1 veya şifreleme başarıyla tamamlanmazsa -2 döndürür. vold
Bunu, CRYPTO_ENCRYPTION_IN_PROGRESS
bayrak için kripto meta verilerine bakarak belirler . Ayarlanmışsa, şifreleme işlemi yarıda kesildi ve cihazda kullanılabilir veri yok.
Bir vold
hata döndürürse, kullanıcı arayüzü, cihazı yeniden başlatmak ve fabrika ayarlarına sıfırlamak için kullanıcıya bir mesaj göstermeli ve kullanıcıya bunu yapmak için basması gereken bir düğme vermelidir.
- Parola ile verilerin şifresini çözme
cryptfs cryptocomplete
Başarılı olduktan sonra , çerçeve disk şifresini isteyen bir kullanıcı arayüzü görüntüler. UI kontrolleri komutunu göndererek şifre cryptfs checkpw
için vold
. Parola doğruysa (şifresi çözülen /data
geçici bir konuma başarıyla monte edilerek ve ardından kaldırılarak belirlenir) vold, şifresi çözülen blok aygıtının adını mülke kaydeder ro.crypto.fs_crypto_blkdev
ve durum 0'ı kullanıcı arayüzüne döndürür. Şifre yanlışsa, kullanıcı arayüzüne -1 döndürür.
- Çerçeveyi durdur
Kullanıcı arabirimi bir kripto önyükleme grafiği oluşturur ve ardından komutla vold çağırır cryptfs restart
. vold
özelliğini ayarlar vold.decrypt
için trigger_reset_main
neden, init.rc
yapmak class_reset main
. Bu, main
sınıftaki tüm hizmetleri durdurur ve tmpfs /data
bu da bağlantısının kaldırılmasını sağlar .
- Montaj / veri
vold
daha sonra şifresi çözülmüş gerçek /data
bölümü monte eder ve yeni bölümü hazırlar (ilk sürümde desteklenmeyen silme seçeneği ile şifrelenmişse asla hazırlanmamış olabilir). Bu özelliği ayarlar vold.post_fs_data_done
için 0
ayarlar ve daha sonra vold.decrypt
için trigger_post_fs_data
. Bu init.rc
onun çalışmasına neden olur post-fs-data commands
. Onlar gerekli dizinleri veya bağlantılar oluşturmak ve sonra koyacaktır vold.post_fs_data_done
için 1
. Bir kez vold
gördüğü 1
bu özelliğinde, bu özelliğini ayarlar vold.decrypt
için trigger_restart_framework
. Bu init.rc
, sınıfta hizmetlerin main
yeniden başlatılmasına ve late_start
önyüklemeden beri ilk kez sınıfta hizmetlerin başlatılmasına neden olur .
- Tam çerçeve başlat
Şimdi, çerçeve tüm hizmetlerini şifresi çözülmüş / veri dosya sistemini kullanarak önyükliyor ve sistem kullanıma hazır.
Şifrelenmiş anahtarı saklama
Şifrelenmiş anahtar kripto meta verilerinde saklanır. Donanım desteği, Güvenilir Yürütme Ortamı (TEE) imzalama özelliği kullanılarak gerçekleştirilir. Önceden, ana anahtarı scrypt
, kullanıcının şifresine ve depolanan tuzuna uygulayarak oluşturulan bir anahtarla şifrelemiştik .
Anahtarı kutu dışı saldırılara karşı dayanıklı hale getirmek için, sonuçta ortaya çıkan anahtarı depolanmış bir TEE anahtarıyla imzalayarak bu algoritmayı genişletiyoruz. Elde edilen imza daha sonra bir kez daha uygulanarak uygun bir uzunluk anahtarına dönüştürülür scrypt
. Bu anahtar daha sonra ana anahtarı şifrelemek ve şifresini çözmek için kullanılır. Bu anahtarı saklamak için:
- Rastgele 16 bayt disk şifreleme anahtarı (DEK) ve 16 bayt tuz oluşturun.
- Uygulama
scrypt
kullanıcı şifresi ve 32 baytlık ara anahtar 1 üretmek üzere tuz (IK1) için.
- IK1'i donanıma bağlı özel anahtarın (HBK) boyutuna sıfır bayt ile doldurun. Özellikle, biz ped olarak: 00 || IK1 || 00..00; bir sıfır bayt, 32 IK1 bayt, 223 sıfır bayt.
- 256 bayt IK2 üretmek için IK1'i HBK ile imzalayın.
- Uygulama
scrypt
32 bayt IK3 üretmek için IK2 ve tuz (aşama 2 ile aynı tuz) için.
- IK3'ün ilk 16 baytını KEK ve son 16 baytını IV olarak kullanın.
- DEK'i AES_CBC ile, KEK anahtarı ve başlatma vektörü IV ile şifreleyin.