Bei der Festplattenverschlüsselung werden alle Benutzerdaten auf einem Android-Gerät mit einem verschlüsselten Schlüssel 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:
- Schnelle Verschlüsselung erstellt, die nur verwendete Blöcke auf der Datenpartition verschlüsselt, um zu vermeiden, dass der erste Start lange dauert. Nur ext4- und f2fs-Dateisysteme unterstützen derzeit eine schnelle Verschlüsselung.
-
forceencrypt
Flag forceencrypt 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 mit 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 dann verschlüsselt wurden, können durch Zurücksetzen auf die Werkseinstellungen wieder in einen unverschlüsselten Zustand versetzt werden. 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 Festplattenverschlüsselung von Android
Die vollständige Festplattenverschlüsselung von Android basiert auf dm-crypt
, einer Kernelfunktion, die auf der Blockgeräteebene arbeitet. 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 Android 5.0-Version gibt es vier Arten von Verschlüsselungszuständen:
- Ursprünglich
- STIFT
- Passwort
- Muster
Beim ersten Start erstellt das Gerät einen zufällig generierten 128-Bit-Hauptschlüssel und hasht ihn dann mit einem Standardpasswort und gespeichertem Salt. Das Standardpasswort lautet: "default_password". Der resultierende Hash wird jedoch auch durch ein TEE (wie TrustZone) signiert, das einen Hash der Signatur verwendet, um den Hauptschlüssel zu verschlüsseln.
Sie finden das Standardpasswort, das in der Datei cryptfs.cpp des Android Open Source-Projekts definiert ist.
Wenn der Benutzer die PIN/den Pass oder das Passwort auf dem Gerät festlegt, wird nur der 128-Bit-Schlüssel neu verschlüsselt und gespeichert. (d. h. Änderungen von Benutzer-PIN/Passwort/Muster bewirken KEINE erneute Verschlüsselung von Benutzerdaten.) Beachten Sie, dass verwaltete Geräte PIN-, Muster- oder Passwortbeschränkungen unterliegen können.
Die Verschlüsselung wird von init
und vold
. init
ruft vold
auf und vold legt Eigenschaften fest, um Ereignisse in init auszulösen. Andere Teile des Systems sehen sich ebenfalls die Eigenschaften an, um Aufgaben auszuführen, wie z. B. den Status zu melden, nach einem Passwort zu fragen oder im Falle eines schwerwiegenden Fehlers zum Zurücksetzen auf die Werkseinstellungen aufzufordern. Um Verschlüsselungsfunktionen in vold
, verwendet das System die cryptfs
-Befehle des checkpw
vdc
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 werden. Um jedoch eine Benutzeroberfläche (UI) anzuzeigen, muss das Framework gestartet werden, und das Framework benötigt /data
, um ausgeführt zu werden. Um dieses Rätsel zu lösen, wird ein temporäres Dateisystem auf /data
gemountet. Auf diese Weise kann Android zur Eingabe von Passwörtern auffordern, den Fortschritt anzeigen oder bei Bedarf eine Datenlöschung vorschlagen. Es erlegt die Einschränkung auf, dass das System, um vom temporären Dateisystem zum echten /data
Dateisystem zu wechseln, jeden Prozess mit offenen Dateien auf dem temporären Dateisystem stoppen und diese Prozesse auf dem echten /data
Dateisystem neu starten muss. Dazu müssen sich alle Dienste in einer von drei Gruppen befinden: core
, main
und late_start
.
-
core
: Niemals nach dem Start 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, lässt ihn aber mit class_start neu starten. -
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
Es gibt vier Flows für ein verschlüsseltes Gerät. Ein Gerät wird nur einmal verschlüsselt und folgt dann einem normalen Boot-Flow.
- 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). - Vorhandenes Gerät verschlüsseln: Benutzerinitiierte 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 ohne festgelegtes Passwort (relevant für Geräte mit Android 5.0 und höher).
- Starten eines verschlüsselten Geräts mit einem Passwort: Booten eines verschlüsselten Geräts, das ein festgelegtes Passwort hat.
Zusätzlich zu diesen Flüssen kann das Gerät auch /data
nicht verschlüsseln. Jeder der Flüsse wird unten im Detail erklärt.
Verschlüsseln Sie ein neues Gerät mit forceencrypt
Dies ist der normale erste Start für ein Android 5.0-Gerät.
- Unverschlüsseltes Dateisystem mit
forceencrypt
Flag erkennen/data
ist nicht verschlüsselt, muss es aber sein, weilforceencrypt
dies vorschreibt. Unmounten/data
. - Beginnen Sie mit der Verschlüsselung
/data
vold.decrypt = "trigger_encryption"
triggertinit.rc
, wodurchvold
/data
ohne Passwort verschlüsselt. (Keine ist gesetzt, da es sich um ein neues Gerät handeln soll.) - Mounten Sie tmpfs
vold
ein tmpfs/data
ein (unter Verwendung der tmpfs-Optionen vonro.crypto.tmpfs_options
) und setzt die Eigenschaftvold.encrypt_progress
auf 0.vold
bereitet die tmpfs/data
zum 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 Daten zu verschlüsseln hat, wird der Fortschrittsbalken oft nicht wirklich angezeigt, weil die Verschlüsselung so schnell erfolgt. Weitere Informationen zur Fortschritts-Benutzeroberfläche finden Sie unter Verschlüsseln eines vorhandenen Geräts .
- Wenn
/data
verschlüsselt ist, nehmen Sie das Framework heruntervold
setztvold.decrypt
auftrigger_default_encryption
, wodurch derdefaultcrypto
-Dienst gestartet wird. (Dies startet den folgenden Ablauf zum Mounten standardmäßig verschlüsselter Benutzerdaten.)trigger_default_encryption
überprüft den Verschlüsselungstyp, um festzustellen, ob/data
mit oder ohne Passwort 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
/data
init
mountet dann/data
auf einer tmpfs-RAMDisk unter Verwendung von Parametern, die es vonro.crypto.tmpfs_options
, das ininit.rc
ist. - Rahmen 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 oder früheres Gerät verschlüsseln, das auf L migriert wurde.
Dieser Vorgang ist benutzerinitiiert und wird im Code als „Inplace-Verschlüsselung“ bezeichnet. Wenn ein Benutzer entscheidet, ein Gerät zu verschlüsseln, stellt die Benutzeroberfläche sicher, dass der Akku vollständig aufgeladen und das Netzteil angeschlossen ist, damit genügend Strom vorhanden ist, um den Verschlüsselungsprozess abzuschließen.
Warnung: Wenn dem Gerät der Strom ausgeht und es herunterfährt, bevor es die Verschlüsselung abgeschlossen hat, 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 Krypto-Blockgerät zu schreiben. vold
prüft, ob ein Sektor verwendet wird, bevor er gelesen und geschrieben wird, was die Verschlüsselung auf einem neuen Gerät, das wenig bis gar keine Daten enthält, viel schneller macht.
Status des Geräts : Setzen 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
wobeipasswd
das Sperrbildschirmkennwort des Benutzers ist. - Nehmen Sie den Rahmen ab
vold
nach Fehlern, gibt -1 zurück, wenn es nicht verschlüsseln kann, und gibt einen Grund im Protokoll aus. Wenn es verschlüsseln kann, setzt es die Eigenschaftvold.decrypt
auftrigger_shutdown_framework
. Dies veranlasstinit.rc
, Dienste in den Klassenlate_start
undmain
zu stoppen. - Erstellen Sie eine Krypto-Fußzeile
- Erstellen Sie eine Breadcrumb-Datei
- Neustart
- Breadcrumb-Datei erkennen
- Beginnen Sie mit der Verschlüsselung
/data
vold
richtet dann die Krypto-Zuordnung ein, die ein virtuelles Krypto-Blockgerät erstellt, das auf das reale Blockgerät abgebildet wird, aber jeden Sektor verschlüsselt, während er geschrieben wird, und jeden Sektor entschlüsselt, während er gelesen wird.vold
erstellt und schreibt dann die Krypto-Metadaten. - Hängen Sie während der Verschlüsselung tmpfs ein
vold
ein tmpfs/data
ein (unter Verwendung der tmpfs-Optionen vonro.crypto.tmpfs_options
) und setzt die Eigenschaftvold.encrypt_progress
auf 0.vold
bereitet die tmpfs/data
zum 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
bewirkt, dassinit.rc
diemain
von Diensten startet. Wenn das Framework sieht, dassvold.encrypt_progress
auf 0 gesetzt ist, öffnet es die Fortschrittsbalken-Benutzeroberfläche, die diese Eigenschaft alle fünf Sekunden abfragt und einen Fortschrittsbalken aktualisiert. Die Verschlüsselungsschleife aktualisiertvold.encrypt_progress
jedes Mal, wenn sie einen weiteren Prozentsatz der Partition verschlüsselt. - 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 ist, 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, eine Schaltfläche zum Neustart zu drücken. Es wird nicht erwartet, dass dies jemals eintritt.
Starten eines verschlüsselten Geräts mit Standardverschlüsselung
Das 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, und daher ist dies der standardmäßige Verschlüsselungsstatus .
- Erkennen Sie verschlüsselte
/data
ohne PasswortErkennen, 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 der Dienstdefaultcrypto
wird.trigger_default_encryption
überprü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 /Daten
vold
dann die entschlüsselte reale/data
Partition ein und bereitet dann die neue Partition vor. Es setzt die Eigenschaftvold.post_fs_data_done
auf 0 und dannvold.decrypt
auftrigger_post_fs_data
. Dies veranlasstinit.rc
, seinepost-fs-data
Befehle auszuführen. 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 bewirkt, dassinit.rc
zum ersten Mal seit dem Booten Dienste in der Klassemain
erneut startet und auch Dienste in der Klasselate_start
. - Rahmen starten
Jetzt bootet 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 passiert, wenn Sie ein verschlüsseltes Gerät mit einem festgelegten Kennwort starten. Das Passwort des Geräts kann eine PIN, ein Muster oder ein Passwort sein.
- Erkennen Sie verschlüsselte Geräte mit einem Passwort
Erkennen, dass das Android-Gerät verschlüsselt ist, da das Flag
ro.crypto.state = "encrypted"
vold
setztvold.decrypt
auftrigger_restart_min_framework
, weil/data
mit einem Passwort verschlüsselt ist. - Mounten Sie tmpfs
init
legt fünf Eigenschaften fest, um die anfänglichen Einhängeoptionen für/data
mit Parametern zu speichern, die voninit.rc
.vold
verwendet diese Eigenschaften, um die Krypto-Zuordnung einzurichten:-
ro.crypto.fs_type
-
ro.crypto.fs_real_blkdev
-
ro.crypto.fs_mnt_point
-
ro.crypto.fs_options
-
ro.crypto.fs_flags
(ASCII 8-stellige Hexadezimalzahl mit vorangestelltem 0x)
-
- Starten Sie das Framework, um zur Eingabe des Kennworts aufzufordern
Das Framework startet und sieht, dass
vold.decrypt
auftrigger_restart_min_framework
gesetzt ist. Dies teilt dem Framework mit, dass es auf einer tmpfs/data
-Festplatte bootet und das Benutzerkennwort abrufen 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
bestimmt dies, indem es in den Krypto-Metadaten nach dem FlagCRYPTO_ENCRYPTION_IN_PROGRESS
sucht. Wenn es gesetzt ist, wurde der Verschlüsselungsprozess unterbrochen und es befinden sich keine nutzbaren Daten auf dem Gerät. Wennvold
einen Fehler zurückgibt, sollte die Benutzeroberfläche eine Meldung für den Benutzer anzeigen, um das Gerät neu zu starten und auf die Werkseinstellungen zurückzusetzen, und dem Benutzer eine Schaltfläche geben, die er dazu drücken kann. - 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
. 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. - Rahmen stoppen
Die Benutzeroberfläche zeigt eine Krypto-Boot-Grafik an und ruft dann
vold
mit dem Befehlcryptfs restart
auf.vold
setzt die Eigenschaftvold.decrypt
auftrigger_reset_main
, was bewirkt, dassinit.rc
class_reset main
. Dies stoppt alle Dienste in der Hauptklasse, wodurch tmpfs/data
ausgehängt werden kann. - Mounten
/data
vold
dann die entschlüsselte reale/data
Partition ein und bereitet die neue Partition vor (die möglicherweise nie vorbereitet wurde, wenn sie mit der Wipe-Option verschlüsselt wurde, die in der ersten Version nicht unterstützt wird). Es setzt die Eigenschaftvold.post_fs_data_done
auf 0 und dannvold.decrypt
auftrigger_post_fs_data
. Dies veranlasstinit.rc
, seinepost-fs-data
Befehle auszuführen. 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 bewirkt, dassinit.rc
zum ersten Mal seit dem Booten Dienste in der Klassemain
erneut startet und auch Dienste in der Klasselate_start
. - Vollständiges Framework starten
Jetzt bootet das Framework alle seine Dienste mit dem entschlüsselten
/data
Dateisystem, und das System ist einsatzbereit.
Fehler
Ein Gerät, das nicht entschlüsselt werden kann, kann aus mehreren Gründen fehlerhaft sein. Das Gerät beginnt mit der normalen Reihe von Schritten zum Booten:
- Erkennen Sie verschlüsselte Geräte mit einem Passwort
- Mounten Sie tmpfs
- Starten Sie das Framework, um zur Eingabe des Kennworts aufzufordern
Aber nachdem das Framework geöffnet wurde, kann das Gerät auf einige Fehler stoßen:
- Das Passwort stimmt überein, aber die Daten können nicht entschlüsselt werden
- Benutzer gibt 30 Mal ein falsches Passwort ein
Wenn diese Fehler nicht behoben werden, fordern Sie den Benutzer auf, die Werkseinstellungen zu löschen :
Wenn vold
während des Verschlüsselungsvorgangs einen Fehler erkennt und 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 heruntergefahren wurde, aber bevor die Fortschrittsbalken-Benutzeroberfläche aktiv ist, vold
das System neu. Wenn der Neustart fehlschlägt, wird vold.encrypt_progress
auf error_shutting_down
und -1 zurückgegeben; aber es wird nichts geben, um den Fehler abzufangen. Dies ist nicht zu erwarten.
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.
Speicherung des verschlüsselten Schlüssels
Der verschlüsselte Schlüssel wird in den Krypto-Metadaten gespeichert. Die Hardwareunterstützung wird mithilfe der Signierfunktion 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 Kennwort des Benutzers und das gespeicherte Salt generiert wurde. Um den Schlüssel gegen Off-Box-Angriffe 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 Anwendung von Verschlüsselung in einen Schlüssel geeigneter Länge umgewandelt. Dieser Schlüssel wird dann verwendet, um den Hauptschlüssel zu verschlüsseln und zu entschlüsseln. So speichern Sie diesen Schlüssel:
- Generieren Sie einen zufälligen 16-Byte-Festplattenverschlüsselungsschlüssel (DEK) und 16-Byte-Salz.
- Wenden Sie scrypt auf das Benutzerkennwort und das Salt an, um den 32-Byte-Zwischenschlüssel 1 (IK1) zu erzeugen.
- Füllen Sie IK1 mit null Bytes bis zur Größe des hardwaregebundenen privaten Schlüssels (HBK) auf. Insbesondere füllen wir Folgendes auf: 00 || IK1 || 00..00; ein Nullbyte, 32 IK1-Bytes, 223 Nullbytes.
- Unterschreiben Sie aufgefülltes IK1 mit HBK, um 256-Byte-IK2 zu erzeugen.
- Wenden Sie scrypt auf IK2 und Salt (dasselbe Salt wie in Schritt 2) an, 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 Kennwort in den Einstellungen ändert oder entfernt, sendet die Benutzeroberfläche den Befehl cryptfs changepw
an vold
, und vold
verschlüsselt den Datenträgerhauptschlüssel erneut mit dem neuen Kennwort.
Verschlüsselungseigenschaften
vold
und init
kommunizieren miteinander, indem sie Eigenschaften setzen. 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 Kennwort verschlüsselt ist. Wenn dies der Fall ist, entschlüsseln und mounten Sie es, andernfalls setzen vold.decrypt auf trigger_restart_min_framework. |
vold.decrypt trigger_reset_main | Von vold gesetzt, um die Benutzeroberfläche herunterzufahren, die nach dem Festplattenkennwort fragt. |
vold.decrypt trigger_post_fs_data | Von vold auf prep /data mit den erforderlichen Verzeichnissen gesetzt, et al. |
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 gesetzt, um das gesamte Framework herunterzufahren und die Verschlüsselung zu starten. |
vold.decrypt trigger_restart_min_framework | Wird von vold festgelegt, um je nach Wert von ro.crypto.state die Fortschrittsbalken-Benutzeroberfläche für die Verschlüsselung zu starten oder zur Eingabe eines Kennworts aufzufordern. |
vold.encrypt_progress | Wenn das Framework gestartet wird und diese Eigenschaft festgelegt ist, wechseln Sie in den Fortschrittsbalken-UI-Modus. |
vold.encrypt_progress 0 to 100 | Die Benutzeroberfläche des Fortschrittsbalkens 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 | Die Fortschrittsbalken-Benutzeroberfläche sollte eine Meldung anzeigen, die besagt, dass die Verschlüsselung abgeschlossen ist, und dem Benutzer eine Schaltfläche zum Neustarten des Geräts geben. Es ist nicht zu erwarten, dass dieser Fehler auftritt. |
vold.encrypt_progress error_not_encrypted | Die Fortschrittsbalken-Benutzeroberfläche sollte eine Meldung anzeigen, die besagt, dass ein Fehler aufgetreten ist, keine Daten verschlüsselt wurden oder verloren gegangen sind, und dem Benutzer eine Schaltfläche zum Neustarten des Systems geben. |
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 , kurz bevor vold.decrypt auf trigger_post_fs_data . |
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 für die spätere Verwendung durch den vold -Befehl restart gesetzt. |
ro.crypto.state unencrypted | Von init gesetzt, um anzugeben, dass dieses System mit einem unverschlüsselten /data ro.crypto.state encrypted . Von init gesetzt, um anzugeben, dass dieses System mit einem verschlüsselten /data läuft. |
| Diese fünf Eigenschaften werden von init festgelegt, wenn es versucht, /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 gesetzt, die init beim Mounten des tmpfs /data Dateisystems verwenden soll. |
Aktionen initieren
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