Bei der Festplattenverschlüsselung werden alle Nutzerdaten auf einem Android-Gerät mit einem verschlüsselten Schlüssel codiert. Sobald ein Gerät verschlüsselt ist, werden alle vom Nutzer erstellten Daten automatisch verschlüsselt, bevor sie auf die Festplatte geschrieben werden. Bei allen Lesevorgängen werden die Daten automatisch entschlüsselt, bevor sie an den aufrufenden Prozess zurückgegeben werden.
Die vollständige Datenträgerverschlüsselung wurde in Android 4.4 eingeführt. In Android 5.0 kamen folgende neue Funktionen hinzu:
- Schnelle Verschlüsselung erstellt, bei der nur verwendete Blöcke auf der Datenpartition verschlüsselt werden, damit der erste Start nicht so lange dauert. Derzeit unterstützen nur ext4- und f2fs-Dateisysteme die 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.
- Hardwarebasierte Speicherung des Verschlüsselungsschlüssels mithilfe der Signaturfunktion der vertrauenswürdigen Ausführungsumgebung (Trusted Execution Environment, TEE) (z. B. in einer TrustZone) hinzugefügt. Weitere Informationen finden Sie unter Verschlüsselten Schlüssel speichern.
Achtung:Geräte, die auf Android 5.0 aktualisiert und dann verschlüsselt wurden, können durch Zurücksetzen auf die Werkseinstellungen in einen unverschlüsselten Zustand zurückversetzt werden. Neue Android 5.0-Geräte, die beim ersten Start verschlüsselt werden, können nicht in einen unverschlüsselten Zustand zurückversetzt werden.
So funktioniert die vollständige Datenträgerverschlüsselung unter Android
Die vollständige Datenträgerverschlüsselung unter Android basiert auf dm-crypt
, einer Kernelfunktion, die auf der Blockgeräteebene funktioniert. Daher funktioniert die Verschlüsselung mit Embedded MultiMediaCard (eMMC) und ähnlichen Flash-Geräten, die sich dem Kernel als Blockgeräte präsentieren. Die Verschlüsselung ist mit YAFFS nicht möglich, da YAFFS direkt mit einem 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 mindestens 128 Bit für den Schlüssel verwenden (256 Bit sind optional).
Hinweis:OEMs können 128 Bit oder mehr verwenden, um den Hauptschlüssel zu verschlüsseln.
In Android 5.0 gibt es vier Arten von Verschlüsselungsstatus:
- Standard
- PIN
- Passwort
- Muster
Beim ersten Starten des Geräts wird ein zufällig generierter 128-Bit-Masterschlüssel erstellt und dann mit einem Standardpasswort und einem gespeicherten Salt gehasht. Das Standardpasswort lautet „default_password“. Der resultierende Hash wird jedoch auch über eine TEE (z. B. TrustZone) signiert, die einen Hash der Signatur zum Verschlüsseln des Hauptschlüssels verwendet.
Das im Android Open Source Project definierte Standardpasswort finden Sie in der Datei cryptfs.cpp.
Wenn der Nutzer die PIN, das Muster oder das Passwort auf dem Gerät festlegt, wird nur der 128‑Bit-Schlüssel neu verschlüsselt und gespeichert. (z. B. führen Änderungen der Nutzer-PIN, des Passworts oder des Musters NICHT zu einer erneuten Verschlüsselung der Nutzerdaten). Beachten Sie, dass für verwaltete Geräte möglicherweise Einschränkungen für PIN, Muster oder Passwort gelten.
Die Verschlüsselung wird von init
und vold
verwaltet.
init
ruft vold
auf und vold legt Attribute fest, um Ereignisse in init auszulösen. Andere Teile des Systems verwenden die Eigenschaften auch für Aufgaben wie das Melden des Status, das Anfordern eines Passworts oder das Auffordern zum Zurücksetzen auf die Werkseinstellungen im Falle eines schwerwiegenden Fehlers. Zum Aufrufen von Verschlüsselungsfunktionen in vold
verwendet das System die cryptfs
-Befehle des Befehlszeilentools vdc
: checkpw
, restart
, enablecrypto
, changepw
, cryptocomplete
, verifypw
, setfield
, getfield
, mountdefaultencrypted
, getpwtype
, getpw
und clearpw
.
Damit /data
verschlüsselt, entschlüsselt oder gelöscht werden kann, darf /data
nicht eingebunden sein. Damit eine Benutzeroberfläche angezeigt werden kann, muss das Framework jedoch gestartet werden. Dazu ist /data
erforderlich. Um dieses Problem zu lösen, wird ein temporäres Dateisystem unter /data
bereitgestellt.
So kann Android bei Bedarf nach Passwörtern fragen, den Fortschritt anzeigen oder vorschlagen, die Daten zu löschen. Es gibt jedoch die Einschränkung, dass das System zum Wechsel vom temporären Dateisystem zum tatsächlichen /data
-Dateisystem alle Prozesse mit geöffneten Dateien im temporären Dateisystem beenden und diese Prozesse im tatsächlichen /data
-Dateisystem neu starten muss. Dazu müssen alle Dienste in einer von drei Gruppen sein: core
, main
und late_start
.
core
: Nach dem Starten wird das Gerät nie heruntergefahren.main
: Das Gerät wird heruntergefahren und nach Eingabe des Laufwerkpassworts neu gestartet.late_start
: Wird erst gestartet, nachdem/data
entschlüsselt und bereitgestellt wurde.
Um diese Aktionen auszulösen, wird die Eigenschaft vold.decrypt
auf verschiedene Strings festgelegt.
Die init
-Befehle zum Beenden und Neustarten von Diensten lauten:
class_reset
: Beendet einen Dienst, ermöglicht aber einen Neustart mit class_start.class_start
: Startet einen Dienst neu.class_stop
: Beendet einen Dienst und fügt einSVC_DISABLED
-Flag hinzu. Angehaltene Dienste reagieren nicht aufclass_start
.
Flows
Es gibt vier Abläufe für ein verschlüsseltes Gerät. Ein Gerät wird nur einmal verschlüsselt und folgt dann einem normalen Bootvorgang.
- So verschlüsseln Sie ein bisher unverschlüsseltes Gerät:
- Verschlüsseln Sie ein neues Gerät mit
forceencrypt
: Die Verschlüsselung ist beim ersten Start (ab Android L) obligatorisch. - Ein vorhandenes Gerät verschlüsseln: Vom Nutzer initiierte Verschlüsselung (Android K und früher).
- Verschlüsseln Sie ein neues Gerät mit
- Verschlüsseltes Gerät booten:
- 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).
- Verschlüsseltes Gerät mit einem Passwort starten: Ein verschlüsseltes Gerät mit einem festgelegten Passwort booten.
Zusätzlich zu diesen Abläufen kann das Gerät auch die Verschlüsselung von /data
fehlschlagen.
Die einzelnen Abläufe werden unten ausführlich beschrieben.
Neues Gerät mit forceencrypt verschlüsseln
Das ist der normale erste Startvorgang für ein Gerät mit Android 5.0.
- Nicht verschlüsseltes Dateisystem mit dem Flag
forceencrypt
erkennen/data
ist nicht verschlüsselt, muss es aber sein, weilforceencrypt
dies vorschreibt. Trennen Sie/data
. - Verschlüsselung von
/data
startenvold.decrypt = "trigger_encryption"
löstinit.rc
aus, wodurchvold
/data
ohne Passwort verschlüsselt. (Keine festgelegt, da es sich um ein neues Gerät handeln sollte.) - tmpfs bereitstellen
vold
stellt ein tmpfs-/data
bereit (mit den tmpfs-Optionen ausro.crypto.tmpfs_options
) und setzt das Attributvold.encrypt_progress
auf 0.vold
bereitet das tmpfs/data
für das Booten eines verschlüsselten Systems vor und legt die Eigenschaftvold.decrypt
auftrigger_restart_min_framework
fest. - Framework aufrufen, um den Fortschritt anzuzeigen
Da auf dem Gerät so gut wie keine Daten verschlüsselt werden müssen, wird die Fortschrittsanzeige nicht oft angezeigt, da die Verschlüsselung so schnell erfolgt. Weitere Informationen zur Fortschrittsanzeige finden Sie unter Vorhandenes Gerät verschlüsseln.
- Framework entfernen, wenn
/data
verschlüsselt istvold
setztvold.decrypt
auftrigger_default_encryption
, wodurch derdefaultcrypto
-Dienst gestartet wird. (Dadurch wird der unten beschriebene Ablauf zum Einbinden verschlüsselter Standardnutzerdaten gestartet.)trigger_default_encryption
prüft den Verschlüsselungstyp, um festzustellen, ob/data
mit oder ohne Passwort verschlüsselt ist. Da Geräte mit Android 5.0 beim ersten Start verschlüsselt werden, sollte kein Passwort festgelegt sein. Daher entschlüsseln und mounten wir/data
. - Bereitstellen
/data
init
stellt dann/data
auf einer tmpfs-RAM-Disk bereit. Dazu werden Parameter verwendet, die ausro.crypto.tmpfs_options
übernommen werden.ro.crypto.tmpfs_options
wird ininit.rc
festgelegt. - Framework starten
vold
setztvold.decrypt
auftrigger_restart_framework
, wodurch der normale Bootvorgang fortgesetzt wird.
Vorhandenes Gerät verschlüsseln
Das passiert, wenn Sie ein unverschlüsseltes Gerät mit Android K oder niedriger verschlüsseln, das zu L migriert wurde.
Dieser Vorgang wird vom Nutzer initiiert und im Code als „Inplace-Verschlüsselung“ bezeichnet. Wenn ein Nutzer ein Gerät verschlüsseln möchte, wird in der Benutzeroberfläche darauf geachtet, dass der Akku vollständig aufgeladen und das Netzteil angeschlossen ist, damit genügend Strom für die Verschlüsselung vorhanden ist.
Warnung:Wenn das Gerät keinen Strom mehr hat und heruntergefahren wird, bevor die Verschlüsselung abgeschlossen ist, bleiben 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 dann auf das Krypto-Blockgerät zu schreiben. vold
prüft, ob ein Sektor verwendet wird, bevor er gelesen und geschrieben wird. Dadurch wird die Verschlüsselung auf einem neuen Gerät mit wenigen oder keinen Daten viel schneller.
Gerätestatus: Legen Sie ro.crypto.state = "unencrypted"
fest und führen Sie den on nonencrypted
-init
-Trigger aus, um den Startvorgang fortzusetzen.
- Passwort prüfen
Die Benutzeroberfläche ruft
vold
mit dem Befehlcryptfs enablecrypto inplace
auf, wobeipasswd
das Sperrbildschirm-Passwort des Nutzers ist. - Framework entfernen
vold
prüft auf Fehler, gibt -1 zurück, wenn die Verschlüsselung nicht möglich ist, und gibt einen Grund im Log aus. Wenn das Gerät verschlüsseln kann, wird das Attributvold.decrypt
auftrigger_shutdown_framework
festgelegt. Dadurch beendetinit.rc
die Dienste in den Klassenlate_start
undmain
. - Krypto-Fußzeile erstellen
- Breadcrumb-Datei erstellen
- Neu starten
- Breadcrumb-Datei erkennen
- Verschlüsselung von
/data
startenvold
richtet dann die kryptografische Zuordnung ein. Dadurch wird ein virtuelles kryptografisches Blockgerät erstellt, das dem echten Blockgerät zugeordnet ist, aber jeden Sektor beim Schreiben verschlüsselt und beim Lesen entschlüsselt.vold
erstellt und schreibt dann die Kryptometadaten. - Während der Verschlüsselung tmpfs bereitstellen
vold
stellt ein tmpfs-/data
bereit (mit den tmpfs-Optionen ausro.crypto.tmpfs_options
) und setzt das Attributvold.encrypt_progress
auf 0.vold
bereitet das tmpfs/data
für das Booten eines verschlüsselten Systems vor und legt das Attributvold.decrypt
auftrigger_restart_min_framework
fest. - Framework aufrufen, um den Fortschritt anzuzeigen
trigger_restart_min_framework
bewirkt, dassinit.rc
diemain
-Dienstklasse startet. Wenn das Framework feststellt, dassvold.encrypt_progress
auf 0 gesetzt ist, wird die Benutzeroberfläche der Fortschrittsanzeige aufgerufen. Diese fragt die Eigenschaft alle fünf Sekunden ab und aktualisiert die Fortschrittsanzeige. 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ßzeile.Wenn
/data
erfolgreich verschlüsselt wurde, entferntvold
das FlagENCRYPTION_IN_PROGRESS
in den Metadaten.Wenn das Gerät erfolgreich entsperrt wurde, wird das Passwort verwendet, um den Hauptschlüssel zu verschlüsseln, und die kryptografische Fußzeile wird aktualisiert.
Wenn der Neustart aus irgendeinem Grund fehlschlägt, wird mit
vold
die Eigenschaftvold.encrypt_progress
auferror_reboot_failed
gesetzt und in der Benutzeroberfläche sollte eine Meldung angezeigt werden, in der der Nutzer aufgefordert wird, eine Taste zum Neustarten zu drücken. Das sollte eigentlich nie passieren.
Verschlüsseltes Gerät mit Standardverschlüsselung starten
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 Passwort festgelegt sein. Dies ist der Standardverschlüsselungsstatus.
- Verschlüsselte
/data
ohne Passwort erkennenDas Android-Gerät ist verschlüsselt, da
/data
nicht bereitgestellt werden kann und eines der Flagsencryptable
oderforceencrypt
festgelegt 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. - /data entschlüsseln
Erstellt das
dm-crypt
-Gerät über dem Blockgerät, damit das Gerät einsatzbereit ist. - /data bereitstellen
vold
mountet dann die entschlüsselte echte/data
-Partition und bereitet die neue Partition vor. Dabei wird das Attributvold.post_fs_data_done
auf 0 und dannvold.decrypt
auftrigger_post_fs_data
gesetzt. Dadurch führtinit.rc
seinepost-fs-data
-Befehle aus. Sie erstellen alle erforderlichen Verzeichnisse oder Links und legen dannvold.post_fs_data_done
auf 1 fest.Sobald
vold
die 1 in dieser Eigenschaft sieht, wird die Eigenschaftvold.decrypt
auftrigger_restart_framework.
gesetzt. Dadurch startetinit.rc
die Dienste in der Klassemain
wieder und startet auch die Dienste in der Klasselate_start
zum ersten Mal seit dem Start. - Framework starten
Das Framework startet nun alle seine Dienste mit dem entschlüsselten
/data
und das System ist einsatzbereit.
Verschlüsseltes Gerät ohne Standardverschlüsselung starten
Das passiert, wenn Sie ein verschlüsseltes Gerät mit einem festgelegten Passwort starten. Das Passwort des Geräts kann eine PIN, ein Muster oder ein Passwort sein.
- Verschlüsseltes Gerät mit einem Passwort erkennen
Erkennen, dass das Android-Gerät verschlüsselt ist, da das Flag
ro.crypto.state = "encrypted"
vold
legtvold.decrypt
auftrigger_restart_min_framework
fest, weil/data
mit einem Passwort verschlüsselt ist. - tmpfs bereitstellen
init
legt fünf Attribute fest, um die ursprünglichen Bereitstellungsoptionen für/data
mit Parametern zu speichern, die voninit.rc
übergeben wurden.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
(8-stellige ASCII-Hexadezimalzahl, der 0x vorangestellt ist)
- Framework starten, um nach dem Passwort zu fragen
Das Framework wird gestartet und erkennt, dass
vold.decrypt
auftrigger_restart_min_framework
festgelegt ist. Dadurch wird dem Framework mitgeteilt, dass es auf einer tmpfs-Festplatte/data
gebootet wird und das Nutzerpasswort benötigt.Zuerst muss jedoch sichergestellt werden, dass die Festplatte ordnungsgemäß verschlüsselt wurde. Der Befehl
cryptfs cryptocomplete
wird anvold
gesendet.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
ermittelt dies anhand desCRYPTO_ENCRYPTION_IN_PROGRESS
-Flags in den Kryptometadaten. Wenn dieser Wert festgelegt ist, wurde der Verschlüsselungsvorgang unterbrochen und es sind keine nutzbaren Daten auf dem Gerät vorhanden. Wennvold
einen Fehler zurückgibt, sollte auf der Benutzeroberfläche eine Meldung für den Nutzer angezeigt werden, in der er aufgefordert wird, das Gerät neu zu starten und auf die Werkseinstellungen zurückzusetzen. Außerdem sollte dem Nutzer eine Schaltfläche zum Ausführen dieser Schritte angezeigt werden. - Daten mit einem Passwort entschlüsseln
Wenn
cryptfs cryptocomplete
erfolgreich ist, wird im Framework eine Benutzeroberfläche angezeigt, in der das Festplattenpasswort angefordert wird. Die Benutzeroberfläche prüft das Passwort, indem sie den Befehlcryptfs checkpw
anvold
sendet. Wenn das Passwort korrekt ist (was dadurch festgestellt wird, dass das entschlüsselte/data
an einem temporären Ort gemountet und dann wieder unmountet 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. - Framework für die Beendigung
In der Benutzeroberfläche wird ein Boot-Logo für die Kryptografie angezeigt und dann
vold
mit dem Befehlcryptfs restart
aufgerufen.vold
legt das Attributvold.decrypt
auftrigger_reset_main
fest, wodurchinit.rc
class_reset main
ausführt. Dadurch werden alle Dienste in der Hauptklasse beendet, sodass das tmpfs/data
unmountiert werden kann. - Bereitstellen
/data
vold
mountet dann die entschlüsselte echte/data
-Partition und bereitet die neue Partition vor. Diese wurde möglicherweise noch nie vorbereitet, wenn sie mit der Option „wipe“ verschlüsselt wurde, die bei der ersten Veröffentlichung nicht unterstützt wird. Dabei wird das Attributvold.post_fs_data_done
auf 0 und dannvold.decrypt
auftrigger_post_fs_data
gesetzt. Dadurch führtinit.rc
seinepost-fs-data
-Befehle aus. Sie erstellen alle erforderlichen Verzeichnisse oder Links und legen dannvold.post_fs_data_done
auf 1 fest. Wennvold
die 1 in dieser Property sieht, wird die Propertyvold.decrypt
auftrigger_restart_framework
festgelegt. Dadurch startetinit.rc
Dienste in der Klassemain
wieder und startet Dienste in der Klasselate_start
zum ersten Mal seit dem Booten. - Vollständiges Framework starten
Das Framework startet nun alle seine Dienste über das entschlüsselte
/data
-Dateisystem und das System ist einsatzbereit.
Fehler
Es kann verschiedene Gründe dafür geben, dass ein Gerät die Entschlüsselung nicht durchführen kann. Das Gerät startet mit der normalen Reihe von Schritten zum Booten:
- Verschlüsseltes Gerät mit einem Passwort erkennen
- tmpfs bereitstellen
- Framework starten, um nach dem Passwort zu fragen
Nach dem Öffnen des Rahmens können jedoch einige Fehler auftreten:
- Das Passwort stimmt überein, aber die Daten können nicht entschlüsselt werden
- Nutzer gibt 30-mal das falsche Passwort ein
Wenn diese Fehler nicht behoben werden, fordere den Nutzer auf, das Gerät auf die Werkseinstellungen zurückzusetzen:
Wenn vold
während der Verschlüsselung einen Fehler erkennt und noch keine Daten zerstört wurden und das Framework aktiv ist, wird die Property vold.encrypt_progress
von vold
auf error_not_encrypted
gesetzt.
Die Benutzeroberfläche fordert den Nutzer auf, das Gerät neu zu starten, und weist ihn darauf hin, dass der Verschlüsselungsvorgang nie gestartet wurde. Wenn der Fehler nach dem Beenden des Frameworks, aber vor dem Anzeigen der Fortschrittsanzeige auftritt, startet vold
das System neu. Wenn der Neustart fehlschlägt, wird vold.encrypt_progress
auf error_shutting_down
gesetzt und -1 zurückgegeben. Es gibt jedoch nichts, was den Fehler abfangen könnte. Das sollte nicht passieren.
Wenn vold
während der Verschlüsselung einen Fehler erkennt, wird vold.encrypt_progress
auf error_partially_encrypted
gesetzt und -1 zurückgegeben. Auf der Benutzeroberfläche sollte dann eine Meldung angezeigt werden, dass die Verschlüsselung fehlgeschlagen ist, und eine Schaltfläche, über die der Nutzer das Gerät auf die Werkseinstellungen zurücksetzen kann.
Verschlüsselten Schlüssel speichern
Der verschlüsselte Schlüssel wird in den Kryptometadaten gespeichert. Die Hardwareunterstützung wird durch die Verwendung der Signierungsfunktion der vertrauenswürdigen Ausführungsumgebung (Trusted Execution Environment, TEE) implementiert. Bisher haben wir den Hauptschlüssel mit einem Schlüssel verschlüsselt, der durch Anwenden von scrypt auf das Passwort des Nutzers und das gespeicherte Salt generiert wurde. Damit der Schlüssel vor Angriffen außerhalb des Geräts geschützt ist, wird der resultierende Schlüssel mit einem gespeicherten TEE-Schlüssel signiert. Die resultierende Signatur wird dann durch eine weitere Anwendung von scrypt in einen Schlüssel mit der entsprechenden Länge umgewandelt. Dieser Schlüssel wird dann zum Ver- und Entschlüsseln des Masterschlüssels verwendet. So speichern Sie diesen Schlüssel:
- Generieren Sie einen zufälligen 16‑Byte-Schlüssel zur Laufwerksverschlüsselung (Data Encryption Key, DEK) und einen 16‑Byte-Salt.
- Wenden Sie scrypt auf das Nutzerpasswort und das Salt an, um den 32‑Byte-Zwischenschlüssel 1 (IK1) zu generieren.
- Füllen Sie IK1 mit Null-Bytes auf die Größe des hardwaregebundenen privaten Schlüssels (Hardware-Bound Key, HBK) auf. Genauer gesagt, füllen wir so auf: 00 || IK1 || 00..00; ein Nullbyte, 32 IK1-Bytes, 223 Nullbytes.
- Signiere den gepaddeten IK1 mit dem HBK, um den 256 Byte langen IK2 zu erstellen.
- Wenden Sie scrypt auf IK2 und Salt an (dasselbe Salt wie in Schritt 2), um 32 Byte IK3 zu erzeugen.
- Verwenden Sie die ersten 16 Byte von IK3 als KEK und die letzten 16 Byte als IV.
- Verschlüsseln Sie den DEK mit AES_CBC, dem Schlüssel KEK und dem Initialisierungsvektor IV.
Passwort ändern
Wenn ein Nutzer sein Passwort in den Einstellungen ändern oder entfernen möchte, sendet die Benutzeroberfläche den Befehl cryptfs changepw
an vold
. vold
verschlüsselt den Hauptschlüssel des Laufwerks dann mit dem neuen Passwort.
Verschlüsselungseigenschaften
vold
und init
kommunizieren miteinander, indem sie Eigenschaften festlegen. Hier finden Sie eine Liste der verfügbaren Properties für die Verschlüsselung.
Vold-Eigenschaften
Attribut | Beschreibung |
---|---|
vold.decrypt trigger_encryption |
Verschlüsseln Sie das Laufwerk ohne Passwort. |
vold.decrypt trigger_default_encryption |
Prüfen Sie, ob das Laufwerk ohne Passwort verschlüsselt ist.
Falls ja, entschlüsseln und mounten Sie sie. Andernfalls legen Sie vold.decrypt auf trigger_restart_min_framework fest. |
vold.decrypt trigger_reset_main |
Wird von vold festgelegt, um die Benutzeroberfläche zu schließen, in der nach dem Festplattenpasswort gefragt wird. |
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 festgelegt, 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 die Fortschrittsanzeige für die Verschlüsselung zu starten oder zur Eingabe des Passworts aufzufordern, je nach Wert von ro.crypto.state . |
vold.encrypt_progress |
Wenn das Framework gestartet wird und diese Eigenschaft festgelegt ist, wird der Benutzeroberflächenmodus der Fortschrittsanzeige aufgerufen. |
vold.encrypt_progress 0 to 100 |
In der Benutzeroberfläche der Fortschrittsanzeige sollte der festgelegte Prozentwert angezeigt werden. |
vold.encrypt_progress error_partially_encrypted |
In der Benutzeroberfläche der Fortschrittsanzeige sollte eine Meldung angezeigt werden, dass die Verschlüsselung fehlgeschlagen ist, und der Nutzer sollte die Möglichkeit haben, das Gerät auf die Werkseinstellungen zurückzusetzen. |
vold.encrypt_progress error_reboot_failed |
In der Fortschrittsanzeige sollte eine Meldung angezeigt werden, dass die Verschlüsselung abgeschlossen ist, und dem Nutzer eine Schaltfläche zum Neustarten des Geräts zur Verfügung gestellt werden. Dieser Fehler sollte nicht auftreten. |
vold.encrypt_progress error_not_encrypted |
Auf der Benutzeroberfläche der Fortschrittsanzeige sollte eine Meldung angezeigt werden, dass ein Fehler aufgetreten ist, keine Daten verschlüsselt oder verloren wurden, und dem Nutzer eine Schaltfläche zum Neustarten des Systems zur Verfügung gestellt werden. |
vold.encrypt_progress error_shutting_down |
Die Benutzeroberfläche der Fortschrittsanzeige wird nicht ausgeführt. Es ist also unklar, wer auf diesen Fehler reagiert. Das sollte ohnehin nie passieren. |
vold.post_fs_data_done 0 |
Wird von vold festgelegt, 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 festgelegt. |
init-Eigenschaften
Attribut | Beschreibung |
---|---|
ro.crypto.fs_crypto_blkdev |
Wird durch den Befehl vold auf checkpw festgelegt und später durch den Befehl vold auf restart . |
ro.crypto.state unencrypted |
Wird von init festgelegt, um anzugeben, dass auf diesem System eine unverschlüsselte /data ro.crypto.state encrypted ausgeführt wird. Wird von init festgelegt, um anzugeben, dass dieses System mit einem verschlüsselten /data ausgeführt wird. |
|
Diese fünf Eigenschaften werden von init festgelegt, wenn versucht wird, /data mit Parametern zu mounten, die von init.rc übergeben wurden. vold verwendet diese, um die Krypto-Zuordnung einzurichten. |
ro.crypto.tmpfs_options |
Wird von init.rc mit den Optionen festgelegt, die init beim Mounten des tmpfs-Dateisystems /data 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