Bei der Festplattenverschlüsselung werden alle Benutzerdaten auf einem Android-Gerät mithilfe eines verschlüsselten Schlüssels verschlüsselt. Sobald ein Gerät verschlüsselt ist, werden alle vom Benutzer erstellten Daten automatisch verschlüsselt, bevor sie auf die Festplatte übertragen werden, und alle Lesevorgänge entschlüsseln die Daten automatisch, bevor sie an den aufrufenden Prozess zurückgegeben werden.
Die Festplattenverschlüsselung wurde in Android 4.4 eingeführt, aber Android 5.0 führte diese neuen Funktionen ein:
- Es wurde eine schnelle Verschlüsselung erstellt, die nur verwendete Blöcke auf der Datenpartition verschlüsselt, um zu vermeiden, dass der erste Start lange dauert. Derzeit unterstützen nur ext4- und f2fs-Dateisysteme schnelle Verschlüsselung.
- Das
forceencrypt
fstab-Flag wurde hinzugefügt, um beim ersten Start zu verschlüsseln. - Unterstützung für Muster und Verschlüsselung ohne Passwort hinzugefügt.
- Hardwaregestützte Speicherung des Verschlüsselungsschlüssels mithilfe der Signaturfunktion von Trusted Execution Environment (TEE) hinzugefügt (z. B. in einer TrustZone). Weitere Einzelheiten finden Sie unter Speichern des verschlüsselten Schlüssels .
Achtung: Geräte, die auf Android 5.0 aktualisiert und anschließend verschlüsselt wurden, werden möglicherweise durch Zurücksetzen der Werkseinstellungen wieder in einen unverschlüsselten Zustand versetzt. Neue Android 5.0-Geräte, die beim ersten Start verschlüsselt wurden, können nicht in einen unverschlüsselten Zustand zurückversetzt werden.
So funktioniert die Android-Festplattenverschlüsselung
Die Android-Festplattenverschlüsselung basiert auf dm-crypt
, einer Kernel-Funktion, die auf der Blockgeräteebene funktioniert. Aus diesem Grund funktioniert die Verschlüsselung mit Embedded MultiMediaCard ( eMMC) und ähnlichen Flash-Geräten, die sich dem Kernel als Blockgeräte präsentieren. Eine Verschlüsselung ist mit YAFFS nicht möglich, das direkt mit einem rohen NAND-Flash-Chip kommuniziert.
Der Verschlüsselungsalgorithmus ist 128 Advanced Encryption Standard (AES) mit Cipher-Block Chaining (CBC) und ESSIV:SHA256. Der Hauptschlüssel wird mit 128-Bit-AES über Aufrufe der OpenSSL-Bibliothek verschlüsselt. Sie müssen 128 Bit oder mehr für den Schlüssel verwenden (wobei 256 optional ist).
Hinweis: OEMs können 128-Bit oder höher verwenden, um den Hauptschlüssel zu verschlüsseln.
In der Version Android 5.0 gibt es vier Arten von Verschlüsselungszuständen:
- Standard
- STIFT
- Passwort
- Muster
Beim ersten Start erstellt das Gerät einen zufällig generierten 128-Bit-Hauptschlüssel und hasht ihn dann mit einem Standardkennwort und einem gespeicherten Salt. Das Standardkennwort lautet: „default_password“. Der resultierende Hash wird jedoch auch über ein TEE (z. B. TrustZone) signiert, das einen Hash der Signatur verwendet, um den Hauptschlüssel zu verschlüsseln.
Sie finden das Standardkennwort, das in der Datei cryptfs.cpp des Android Open Source Project definiert ist.
Wenn der Benutzer die PIN/das Passwort oder das Passwort auf dem Gerät festlegt, wird nur der 128-Bit-Schlüssel neu verschlüsselt und gespeichert. (d. h. Benutzer-PIN-/Passwort-/Musteränderungen führen NICHT zu einer erneuten Verschlüsselung der Benutzerdaten.) Beachten Sie, dass verwaltete Geräte möglicherweise PIN-, Muster- oder Passwortbeschränkungen unterliegen.
Die Verschlüsselung wird von init
und vold
verwaltet. init
ruft vold
auf und vold legt Eigenschaften fest, um Ereignisse in init auszulösen. Auch andere Teile des Systems prüfen die Eigenschaften, um Aufgaben wie den Berichtsstatus, die Abfrage eines Kennworts oder die Aufforderung zum Zurücksetzen auf die Werkseinstellungen im Falle eines schwerwiegenden Fehlers auszuführen. Um Verschlüsselungsfunktionen in vold
aufzurufen, verwendet das System die cryptfs
Befehle des Befehlszeilentools vdc
: checkpw
, restart
, enablecrypto
, changepw
, cryptocomplete
, verifypw
, setfield
, getfield
, mountdefaultencrypted
, getpwtype
, getpw
und clearpw
.
Um /data
zu verschlüsseln, zu entschlüsseln oder zu löschen, darf /data
nicht gemountet sein. Um jedoch eine Benutzeroberfläche (UI) anzuzeigen, muss das Framework gestartet werden und das Framework benötigt /data
zur Ausführung. Um dieses Rätsel zu lösen, wird ein temporäres Dateisystem auf /data
gemountet. Dadurch kann Android nach Passwörtern fragen, den Fortschritt anzeigen oder bei Bedarf eine Datenlöschung vorschlagen. Es besteht jedoch die Einschränkung, dass das System zum Wechsel vom temporären Dateisystem zum echten /data
Dateisystem jeden Prozess mit geöffneten Dateien im temporären Dateisystem stoppen und diese Prozesse im realen /data
Dateisystem neu starten muss. Dazu müssen sich alle Dienste in einer von drei Gruppen befinden: core
, main
und late_start
.
-
core
: Nach dem Start niemals herunterfahren. -
main
: Herunterfahren und dann neu starten, nachdem das Festplattenkennwort eingegeben wurde. -
late_start
: Startet erst, nachdem/data
entschlüsselt und gemountet wurde.
Um diese Aktionen auszulösen, wird die Eigenschaft vold.decrypt
auf verschiedene Zeichenfolgen gesetzt. Um Dienste zu beenden und neu zu starten, lauten die init
Befehle:
-
class_reset
: Stoppt einen Dienst, ermöglicht aber einen Neustart mit class_start. -
class_start
: Startet einen Dienst neu. -
class_stop
: Stoppt einen Dienst und fügt einSVC_DISABLED
Flag hinzu. Gestoppte Dienste reagieren nicht aufclass_start
.
Fließt
Für ein verschlüsseltes Gerät gibt es vier Abläufe. Ein Gerät wird nur einmal verschlüsselt und folgt dann einem normalen Boot-Ablauf.
- Verschlüsseln Sie ein zuvor unverschlüsseltes Gerät:
- Verschlüsseln Sie ein neues Gerät mit
forceencrypt
: Obligatorische Verschlüsselung beim ersten Start (ab Android L). - Verschlüsseln Sie ein vorhandenes Gerät: Vom Benutzer initiierte Verschlüsselung (Android K und früher).
- Verschlüsseln Sie ein neues Gerät mit
- Starten Sie ein verschlüsseltes Gerät:
- Starten eines verschlüsselten Geräts ohne Passwort: Starten eines verschlüsselten Geräts, für das kein Passwort festgelegt ist (relevant für Geräte mit Android 5.0 und höher).
- Starten eines verschlüsselten Geräts mit einem Passwort: Starten eines verschlüsselten Geräts mit einem festgelegten Passwort.
Zusätzlich zu diesen Abläufen kann es auch vorkommen, dass das Gerät /data
nicht verschlüsselt. Jeder der Abläufe wird im Folgenden ausführlich erläutert.
Verschlüsseln Sie ein neues Gerät mit Forceencrypt
Dies ist der normale erste Start für ein Android 5.0-Gerät.
- Erkennen Sie unverschlüsselte Dateisysteme mit dem
forceencrypt
-Flag/data
ist nicht verschlüsselt, muss aber verschlüsselt werden, daforceencrypt
dies vorschreibt./data
aushängen. - Beginnen Sie mit der Verschlüsselung von
/data
vold.decrypt = "trigger_encryption"
löstinit.rc
aus, was dazu führt, dassvold
/data
ohne Passwort verschlüsselt. (Es ist keine festgelegt, da es sich um ein neues Gerät handeln sollte.) - Mounten Sie tmpfs
vold
mountet ein tmpfs/data
(unter Verwendung der tmpfs-Optionen vonro.crypto.tmpfs_options
) und setzt die Eigenschaftvold.encrypt_progress
auf 0.vold
bereitet das tmpfs/data
für das Booten eines verschlüsselten Systems vor und setzt die Eigenschaftvold.decrypt
auf:trigger_restart_min_framework
- Rufen Sie das Framework auf, um den Fortschritt anzuzeigen
Da das Gerät praktisch keine zu verschlüsselnden Daten hat, wird der Fortschrittsbalken oft nicht angezeigt, da die Verschlüsselung so schnell erfolgt. Weitere Einzelheiten zur Fortschritts-Benutzeroberfläche finden Sie unter Vorhandenes Gerät verschlüsseln .
- Wenn
/data
verschlüsselt ist, entfernen Sie das Frameworkvold
setztvold.decrypt
auftrigger_default_encryption
, wodurch derdefaultcrypto
Dienst gestartet wird. (Damit wird der folgende Ablauf zum Mounten standardmäßig verschlüsselter Benutzerdaten gestartet.)trigger_default_encryption
überprüft den Verschlüsselungstyp, um festzustellen, ob/data
mit oder ohne Kennwort verschlüsselt ist. Da Android 5.0-Geräte beim ersten Start verschlüsselt werden, sollte kein Kennwort festgelegt werden. Deshalb entschlüsseln und mounten wir/data
. - Mounten Sie
/data
init
mountet dann/data
auf einer tmpfs-RAMDisk mit Parametern, die es vonro.crypto.tmpfs_options
abruft, die ininit.rc
festgelegt sind. - Framework starten
vold
setztvold.decrypt
auftrigger_restart_framework
, wodurch der übliche Startvorgang fortgesetzt wird.
Verschlüsseln Sie ein vorhandenes Gerät
Dies passiert, wenn Sie ein unverschlüsseltes Android K-Gerät oder ein früheres Gerät verschlüsseln, das auf L migriert wurde.
Dieser Vorgang wird vom Benutzer initiiert und im Code als „Inplace-Verschlüsselung“ bezeichnet. Wenn ein Benutzer die Verschlüsselung eines Geräts auswählt, stellt die Benutzeroberfläche sicher, dass der Akku vollständig aufgeladen und das Netzteil angeschlossen ist, sodass genügend Strom vorhanden ist, um den Verschlüsselungsvorgang abzuschließen.
Warnung: Wenn das Gerät keinen Strom mehr hat und herunterfährt, bevor die Verschlüsselung abgeschlossen ist, verbleiben die Dateidaten in einem teilweise verschlüsselten Zustand. Das Gerät muss auf die Werkseinstellungen zurückgesetzt werden und alle Daten gehen verloren.
Um die Inplace-Verschlüsselung zu aktivieren, startet vold
eine Schleife, um jeden Sektor des echten Blockgeräts zu lesen und ihn dann auf das Kryptoblockgerät zu schreiben. vold
prüft, ob ein Sektor verwendet wird, bevor er ihn liest und schreibt. Dadurch wird die Verschlüsselung auf einem neuen Gerät, das nur wenige oder gar keine Daten enthält, viel schneller.
Status des Geräts : Setzen Sie ro.crypto.state = "unencrypted"
und führen Sie den on nonencrypted
init
Trigger aus, um mit dem Booten fortzufahren.
- Passwort prüfen
Die Benutzeroberfläche ruft
vold
mit dem Befehlcryptfs enablecrypto inplace
auf, wobeipasswd
das Sperrbildschirmkennwort des Benutzers ist. - Nehmen Sie das Gerüst ab
vold
prüft auf Fehler, gibt -1 zurück, wenn die Verschlüsselung nicht möglich ist, und gibt einen Grund im Protokoll aus. Wenn es verschlüsseln kann, setzt es die Eigenschaftvold.decrypt
auftrigger_shutdown_framework
. Dies führt dazu, dassinit.rc
Dienste in den Klassenlate_start
undmain
stoppt. - Erstellen Sie eine Krypto-Fußzeile
- Erstellen Sie eine Breadcrumb-Datei
- Neustart
- Breadcrumb-Datei erkennen
- Beginnen Sie mit der Verschlüsselung von
/data
vold
richtet dann die Kryptozuordnung ein, die ein virtuelles Kryptoblockgerät erstellt, das auf das reale Blockgerät abgebildet wird, aber jeden Sektor beim Schreiben verschlüsselt und jeden Sektor beim Lesen entschlüsselt.vold
erstellt dann die Krypto-Metadaten und schreibt sie aus. - Während die Verschlüsselung läuft, mounten Sie tmpfs
vold
mountet ein tmpfs/data
(unter Verwendung der tmpfs-Optionen vonro.crypto.tmpfs_options
) und setzt die Eigenschaftvold.encrypt_progress
auf 0.vold
bereitet das tmpfs/data
für das Booten eines verschlüsselten Systems vor und setzt die Eigenschaftvold.decrypt
auf:trigger_restart_min_framework
- Rufen Sie das Framework auf, um den Fortschritt anzuzeigen
trigger_restart_min_framework
veranlasstinit.rc
, diemain
von Diensten zu starten. Wenn das Framework erkennt, dassvold.encrypt_progress
auf 0 gesetzt ist, ruft es die Fortschrittsbalken-Benutzeroberfläche auf, die diese Eigenschaft alle fünf Sekunden abfragt und einen Fortschrittsbalken aktualisiert. Die Verschlüsselungsschleife aktualisiertvold.encrypt_progress
jedes Mal, wenn ein weiteres Prozent der Partition verschlüsselt wird. - Wenn
/data
verschlüsselt ist, aktualisieren Sie die Krypto-FußzeileWenn
/data
erfolgreich verschlüsselt wurde, löschtvold
das FlagENCRYPTION_IN_PROGRESS
in den Metadaten.Wenn das Gerät erfolgreich entsperrt wurde, wird das Passwort zum Verschlüsseln des Hauptschlüssels verwendet und die Krypto-Fußzeile wird aktualisiert.
Wenn der Neustart aus irgendeinem Grund fehlschlägt, setzt
vold
die Eigenschaftvold.encrypt_progress
auferror_reboot_failed
und die Benutzeroberfläche sollte eine Meldung anzeigen, in der der Benutzer aufgefordert wird, zum Neustart eine Schaltfläche zu drücken. Es ist nicht zu erwarten, dass dies jemals der Fall sein wird.
Starten eines verschlüsselten Geräts mit Standardverschlüsselung
Dies passiert, wenn Sie ein verschlüsseltes Gerät ohne Passwort starten. Da Android 5.0-Geräte beim ersten Start verschlüsselt werden, sollte kein Kennwort festgelegt werden. Daher ist dies der Standardstatus der Verschlüsselung .
- Erkennen Sie verschlüsselte
/data
ohne PasswortErkennen Sie, dass das Android-Gerät verschlüsselt ist, da
/data
nicht gemountet werden kann und eines der Flagsencryptable
“ oderforceencrypt
gesetzt ist.vold
setztvold.decrypt
auftrigger_default_encryption
, wodurch derdefaultcrypto
Dienst gestartet wird.trigger_default_encryption
prüft den Verschlüsselungstyp, um festzustellen, ob/data
mit oder ohne Passwort verschlüsselt ist. - /Daten entschlüsseln
Erstellt das
dm-crypt
Gerät über dem Blockgerät, sodass das Gerät einsatzbereit ist. - Mounten Sie /data
vold
mountet dann die entschlüsselte echte/data
Partition und bereitet dann die neue Partition vor. Es setzt die Eigenschaftvold.post_fs_data_done
auf 0 und setzt dannvold.decrypt
auftrigger_post_fs_data
. Dies führt dazu, dassinit.rc
seinepost-fs-data
Befehle ausführt. Sie erstellen alle erforderlichen Verzeichnisse oder Links und setzen dannvold.post_fs_data_done
auf 1.Sobald
vold
die 1 in dieser Eigenschaft sieht, setzt es die Eigenschaftvold.decrypt
auf:trigger_restart_framework.
Dies führt dazu, dassinit.rc
Dienste in der Klassemain
erneut startet und zum ersten Mal seit dem Booten auch Dienste in der Klasselate_start
startet. - Framework starten
Jetzt startet das Framework alle seine Dienste mit dem entschlüsselten
/data
und das System ist einsatzbereit.
Starten eines verschlüsselten Geräts ohne Standardverschlüsselung
Dies geschieht, wenn Sie ein verschlüsseltes Gerät starten, für das ein Kennwort festgelegt ist. Das Passwort des Geräts kann eine PIN, ein Muster oder ein Passwort sein.
- Verschlüsseltes Gerät mit Passwort erkennen
Erkennen Sie, dass das Android-Gerät verschlüsselt ist, da das Flag
ro.crypto.state = "encrypted"
vold
setztvold.decrypt
auftrigger_restart_min_framework
, da/data
mit einem Passwort verschlüsselt ist. - Mounten Sie tmpfs
init
legt fünf Eigenschaften fest, um die anfänglichen Mount-Optionen für/data
mit den voninit.rc
übergebenen Parametern zu speichern.vold
verwendet diese Eigenschaften, um das Krypto-Mapping einzurichten:-
ro.crypto.fs_type
-
ro.crypto.fs_real_blkdev
-
ro.crypto.fs_mnt_point
-
ro.crypto.fs_options
-
ro.crypto.fs_flags
(8-stellige ASCII-Hexadezimalzahl mit vorangestelltem 0x)
-
- Starten Sie das Framework, um zur Eingabe eines Passworts aufzufordern
Das Framework startet und stellt fest, dass
vold.decrypt
auftrigger_restart_min_framework
gesetzt ist. Dadurch wird dem Framework mitgeteilt, dass es von einer tmpfs/data
Festplatte bootet und das Benutzerkennwort erhalten muss.Zunächst muss jedoch sichergestellt werden, dass die Festplatte ordnungsgemäß verschlüsselt wurde. Es sendet den Befehl
cryptfs cryptocomplete
anvold
.vold
gibt 0 zurück, wenn die Verschlüsselung erfolgreich abgeschlossen wurde, -1 bei einem internen Fehler oder -2, wenn die Verschlüsselung nicht erfolgreich abgeschlossen wurde.vold
stellt dies fest, indem es in den Krypto-Metadaten nach demCRYPTO_ENCRYPTION_IN_PROGRESS
-Flag sucht. Wenn es gesetzt ist, wurde der Verschlüsselungsprozess unterbrochen und es sind keine nutzbaren Daten auf dem Gerät vorhanden. Wennvold
einen Fehler zurückgibt, sollte die Benutzeroberfläche dem Benutzer eine Meldung anzeigen, dass er das Gerät neu starten und auf die Werkseinstellungen zurücksetzen soll, und dem Benutzer eine Schaltfläche zum Drücken geben, um dies zu tun. - Daten mit Passwort entschlüsseln
Sobald
cryptfs cryptocomplete
erfolgreich ist, zeigt das Framework eine Benutzeroberfläche an, in der Sie nach dem Festplattenkennwort gefragt werden. Die Benutzeroberfläche überprüft das Passwort, indem sie den Befehlcryptfs checkpw
anvold
sendet. Wenn das Passwort korrekt ist (was durch erfolgreiches Mounten der entschlüsselten/data
an einem temporären Speicherort und anschließendes Unmounten festgestellt wird), speichertvold
den Namen des entschlüsselten Blockgeräts in der Eigenschaftro.crypto.fs_crypto_blkdev
und gibt den Status 0 an die Benutzeroberfläche zurück . Wenn das Passwort falsch ist, wird -1 an die Benutzeroberfläche zurückgegeben. - Stoppen Sie das Framework
Die Benutzeroberfläche erstellt eine Krypto-Boot-Grafik und ruft dann
vold
mit dem Befehlcryptfs restart
auf.vold
setzt die Eigenschaftvold.decrypt
auftrigger_reset_main
, was dazu führt, dassinit.rc
class_reset main
ausführt. Dadurch werden alle Dienste in der Hauptklasse gestoppt, wodurch die Bereitstellung von tmpfs/data
aufgehoben werden kann. - Mounten Sie
/data
vold
mountet dann die entschlüsselte echte/data
Partition und bereitet die neue Partition vor (die möglicherweise nie vorbereitet wurde, wenn sie mit der Wipe-Option verschlüsselt wurde, die bei der ersten Veröffentlichung nicht unterstützt wird). Es setzt die Eigenschaftvold.post_fs_data_done
auf 0 und setzt dannvold.decrypt
auftrigger_post_fs_data
. Dies führt dazu, dassinit.rc
seinepost-fs-data
Befehle ausführt. Sie erstellen alle erforderlichen Verzeichnisse oder Links und setzen dannvold.post_fs_data_done
auf 1. Sobaldvold
die 1 in dieser Eigenschaft sieht, setzt es die Eigenschaftvold.decrypt
auftrigger_restart_framework
. Dies führt dazu, dassinit.rc
Dienste in der Klassemain
erneut startet und zum ersten Mal seit dem Booten auch Dienste in der Klasselate_start
startet. - Vollständiges Framework starten
Jetzt startet das Framework alle seine Dienste mit dem entschlüsselten
/data
Dateisystem und das System ist einsatzbereit.
Versagen
Ein Gerät, das nicht entschlüsseln kann, kann aus mehreren Gründen fehlerhaft sein. Das Gerät startet mit der normalen Reihe von Schritten zum Booten:
- Verschlüsseltes Gerät mit Passwort erkennen
- Mounten Sie tmpfs
- Starten Sie das Framework, um zur Eingabe eines Passworts aufzufordern
Nach dem Öffnen des Frameworks können jedoch einige Fehler auf dem Gerät auftreten:
- Das Passwort stimmt überein, aber die Daten können nicht entschlüsselt werden
- Der Benutzer gibt 30 Mal ein falsches Passwort ein
Wenn diese Fehler nicht behoben werden, fordern Sie den Benutzer auf, die Werkseinstellungen zurückzusetzen :
Wenn vold
während des Verschlüsselungsprozesses einen Fehler erkennt, noch keine Daten zerstört wurden und das Framework aktiv ist, setzt vold
die Eigenschaft vold.encrypt_progress
auf error_not_encrypted
. Die Benutzeroberfläche fordert den Benutzer zum Neustart auf und weist ihn darauf hin, dass der Verschlüsselungsprozess nie gestartet wurde. Wenn der Fehler auftritt, nachdem das Framework abgebaut wurde, aber bevor die Fortschrittsbalken-Benutzeroberfläche angezeigt wird, startet vold
das System neu. Wenn der Neustart fehlschlägt, wird vold.encrypt_progress
auf error_shutting_down
gesetzt und -1 zurückgegeben; aber es wird nichts geben, was den Fehler abfangen könnte. Dies wird voraussichtlich nicht passieren.
Wenn vold
während des Verschlüsselungsprozesses einen Fehler erkennt, setzt es vold.encrypt_progress
auf error_partially_encrypted
und gibt -1 zurück. Die Benutzeroberfläche sollte dann eine Meldung anzeigen, dass die Verschlüsselung fehlgeschlagen ist, und eine Schaltfläche bereitstellen, mit der der Benutzer das Gerät auf die Werkseinstellungen zurücksetzen kann.
Speichern des verschlüsselten Schlüssels
Der verschlüsselte Schlüssel wird in den Krypto-Metadaten gespeichert. Die Hardware-Unterstützung wird mithilfe der Signierungsfunktion von Trusted Execution Environment (TEE) implementiert. Zuvor haben wir den Hauptschlüssel mit einem Schlüssel verschlüsselt, der durch Anwenden von Scrypt auf das Benutzerkennwort und den gespeicherten Salt generiert wurde. Um den Schlüssel gegenüber Off-Box-Angriffen widerstandsfähig zu machen, erweitern wir diesen Algorithmus, indem wir den resultierenden Schlüssel mit einem gespeicherten TEE-Schlüssel signieren. Die resultierende Signatur wird dann durch eine weitere Scrypt-Anwendung in einen Schlüssel geeigneter Länge umgewandelt. Dieser Schlüssel wird dann zum Verschlüsseln und Entschlüsseln des Hauptschlüssels verwendet. So speichern Sie diesen Schlüssel:
- Generieren Sie einen zufälligen 16-Byte-Festplattenverschlüsselungsschlüssel (DEK) und einen 16-Byte-Salt.
- Wenden Sie scrypt auf das Benutzerkennwort und den Salt an, um den 32-Byte-Zwischenschlüssel 1 (IK1) zu erzeugen.
- Füllen Sie IK1 mit null Bytes auf die Größe des hardwaregebundenen privaten Schlüssels (HBK) auf. Konkret füllen wir wie folgt auf: 00 || IK1 || 00..00; ein Nullbyte, 32 IK1-Bytes, 223 Nullbytes.
- Signieren Sie aufgefülltes IK1 mit HBK, um 256-Byte-IK2 zu erzeugen.
- Wenden Sie scrypt auf IK2 und Salt an (das gleiche Salt wie in Schritt 2), um 32-Byte-IK3 zu erzeugen.
- Verwenden Sie die ersten 16 Bytes von IK3 als KEK und die letzten 16 Bytes als IV.
- Verschlüsseln Sie DEK mit AES_CBC, mit Schlüssel KEK und Initialisierungsvektor IV.
Passwort ändern
Wenn ein Benutzer sein Passwort in den Einstellungen ändern oder entfernen möchte, sendet die Benutzeroberfläche den Befehl cryptfs changepw
an vold
und vold
verschlüsselt den Festplattenhauptschlüssel erneut mit dem neuen Passwort.
Verschlüsselungseigenschaften
vold
und init
kommunizieren miteinander, indem sie Eigenschaften festlegen. Hier ist eine Liste der verfügbaren Eigenschaften für die Verschlüsselung.
Vold-Eigenschaften
Eigentum | Beschreibung |
---|---|
vold.decrypt trigger_encryption | Verschlüsseln Sie das Laufwerk ohne Passwort. |
vold.decrypt trigger_default_encryption | Überprüfen Sie das Laufwerk, um festzustellen, ob es ohne Passwort verschlüsselt ist. Wenn ja, entschlüsseln und mounten Sie es, andernfalls setzen Sie vold.decrypt auf trigger_restart_min_framework. |
vold.decrypt trigger_reset_main | Wird von vold festgelegt, um die Benutzeroberfläche herunterzufahren und nach dem Festplattenkennwort zu fragen. |
vold.decrypt trigger_post_fs_data | Wird von vold festgelegt, um /data mit den erforderlichen Verzeichnissen usw. vorzubereiten. |
vold.decrypt trigger_restart_framework | Wird von vold gesetzt, um das eigentliche Framework und alle Dienste zu starten. |
vold.decrypt trigger_shutdown_framework | Wird von „vold“ festgelegt, um das gesamte Framework herunterzufahren und die Verschlüsselung zu starten. |
vold.decrypt trigger_restart_min_framework | Wird von vold festgelegt, um abhängig vom Wert von ro.crypto.state die Fortschrittsbalken-Benutzeroberfläche für die Verschlüsselung zu starten oder zur Eingabe eines Passworts aufzufordern. |
vold.encrypt_progress | Wenn das Framework gestartet wird und diese Eigenschaft festgelegt ist, wird der Fortschrittsbalken-UI-Modus aufgerufen. |
vold.encrypt_progress 0 to 100 | Die Fortschrittsbalken-Benutzeroberfläche sollte den eingestellten Prozentwert anzeigen. |
vold.encrypt_progress error_partially_encrypted | Die Fortschrittsbalken-Benutzeroberfläche sollte eine Meldung anzeigen, dass die Verschlüsselung fehlgeschlagen ist, und dem Benutzer die Möglichkeit geben, das Gerät auf die Werkseinstellungen zurückzusetzen. |
vold.encrypt_progress error_reboot_failed | Auf der Fortschrittsbalken-Benutzeroberfläche sollte eine Meldung angezeigt werden, dass die Verschlüsselung abgeschlossen ist, und dem Benutzer eine Schaltfläche zum Neustarten des Geräts angezeigt werden. Es wird nicht erwartet, dass dieser Fehler auftritt. |
vold.encrypt_progress error_not_encrypted | Die Fortschrittsbalken-Benutzeroberfläche sollte eine Meldung anzeigen, dass ein Fehler aufgetreten ist, keine Daten verschlüsselt wurden oder verloren gegangen sind, und dem Benutzer eine Schaltfläche zum Neustarten des Systems bieten. |
vold.encrypt_progress error_shutting_down | Die Fortschrittsbalken-Benutzeroberfläche wird nicht ausgeführt, daher ist unklar, wer auf diesen Fehler reagieren wird. Und es sollte sowieso nie passieren. |
vold.post_fs_data_done 0 | Wird von vold gesetzt, kurz bevor vold.decrypt auf trigger_post_fs_data gesetzt wird. |
vold.post_fs_data_done 1 | Wird von init.rc oder init.rc direkt nach Abschluss der Aufgabe post-fs-data gesetzt. |
init-Eigenschaften
Eigentum | Beschreibung |
---|---|
ro.crypto.fs_crypto_blkdev | Wird vom vold -Befehl checkpw zur späteren Verwendung durch den vold Befehl restart gesetzt. |
ro.crypto.state unencrypted | Wird von init so festgelegt, dass dieses System mit einer unverschlüsselten /data ro.crypto.state encrypted läuft. Wird von init so eingestellt, dass dieses System mit einem verschlüsselten /data läuft. |
| Diese fünf Eigenschaften werden von init festgelegt, wenn versucht wird /data mit von init.rc übergebenen Parametern zu mounten. vold verwendet diese, um das Krypto-Mapping einzurichten. |
ro.crypto.tmpfs_options | Wird von init.rc mit den Optionen festgelegt, die init beim Mounten des tmpfs /data Dateisystems verwenden soll. |
Init-Aktionen
on post-fs-data on nonencrypted on property:vold.decrypt=trigger_reset_main on property:vold.decrypt=trigger_post_fs_data on property:vold.decrypt=trigger_restart_min_framework on property:vold.decrypt=trigger_restart_framework on property:vold.decrypt=trigger_shutdown_framework on property:vold.decrypt=trigger_encryption on property:vold.decrypt=trigger_default_encryption