Vollständige Festplattenverschlüsselung

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 ein SVC_DISABLED Flag hinzu. Gestoppte Dienste reagieren nicht auf class_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).
  • 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.

  1. Erkennen Sie unverschlüsselte Dateisysteme mit dem forceencrypt -Flag

    /data ist nicht verschlüsselt, muss aber verschlüsselt werden, da forceencrypt dies vorschreibt. /data aushängen.

  2. Beginnen Sie mit der Verschlüsselung von /data

    vold.decrypt = "trigger_encryption" löst init.rc aus, was dazu führt, dass vold /data ohne Passwort verschlüsselt. (Es ist keine festgelegt, da es sich um ein neues Gerät handeln sollte.)

  3. Mounten Sie tmpfs

    vold mountet ein tmpfs /data (unter Verwendung der tmpfs-Optionen von ro.crypto.tmpfs_options ) und setzt die Eigenschaft vold.encrypt_progress auf 0. vold bereitet das tmpfs /data für das Booten eines verschlüsselten Systems vor und setzt die Eigenschaft vold.decrypt auf: trigger_restart_min_framework

  4. 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 .

  5. Wenn /data verschlüsselt ist, entfernen Sie das Framework

    vold setzt vold.decrypt auf trigger_default_encryption , wodurch der defaultcrypto 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 .

  6. Mounten Sie /data

    init mountet dann /data auf einer tmpfs-RAMDisk mit Parametern, die es von ro.crypto.tmpfs_options abruft, die in init.rc festgelegt sind.

  7. Framework starten

    vold setzt vold.decrypt auf trigger_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.

  1. Passwort prüfen

    Die Benutzeroberfläche ruft vold mit dem Befehl cryptfs enablecrypto inplace auf, wobei passwd das Sperrbildschirmkennwort des Benutzers ist.

  2. 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 Eigenschaft vold.decrypt auf trigger_shutdown_framework . Dies führt dazu, dass init.rc Dienste in den Klassen late_start und main stoppt.

  3. Erstellen Sie eine Krypto-Fußzeile
  4. Erstellen Sie eine Breadcrumb-Datei
  5. Neustart
  6. Breadcrumb-Datei erkennen
  7. 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.

  8. Während die Verschlüsselung läuft, mounten Sie tmpfs

    vold mountet ein tmpfs /data (unter Verwendung der tmpfs-Optionen von ro.crypto.tmpfs_options ) und setzt die Eigenschaft vold.encrypt_progress auf 0. vold bereitet das tmpfs /data für das Booten eines verschlüsselten Systems vor und setzt die Eigenschaft vold.decrypt auf: trigger_restart_min_framework

  9. Rufen Sie das Framework auf, um den Fortschritt anzuzeigen

    trigger_restart_min_framework veranlasst init.rc , die main von Diensten zu starten. Wenn das Framework erkennt, dass vold.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 aktualisiert vold.encrypt_progress jedes Mal, wenn ein weiteres Prozent der Partition verschlüsselt wird.

  10. Wenn /data verschlüsselt ist, aktualisieren Sie die Krypto-Fußzeile

    Wenn /data erfolgreich verschlüsselt wurde, löscht vold das Flag ENCRYPTION_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 Eigenschaft vold.encrypt_progress auf error_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 .

  1. Erkennen Sie verschlüsselte /data ohne Passwort

    Erkennen Sie, dass das Android-Gerät verschlüsselt ist, da /data nicht gemountet werden kann und eines der Flags encryptable “ oder forceencrypt gesetzt ist.

    vold setzt vold.decrypt auf trigger_default_encryption , wodurch der defaultcrypto Dienst gestartet wird. trigger_default_encryption prüft den Verschlüsselungstyp, um festzustellen, ob /data mit oder ohne Passwort verschlüsselt ist.

  2. /Daten entschlüsseln

    Erstellt das dm-crypt Gerät über dem Blockgerät, sodass das Gerät einsatzbereit ist.

  3. Mounten Sie /data

    vold mountet dann die entschlüsselte echte /data Partition und bereitet dann die neue Partition vor. Es setzt die Eigenschaft vold.post_fs_data_done auf 0 und setzt dann vold.decrypt auf trigger_post_fs_data . Dies führt dazu, dass init.rc seine post-fs-data Befehle ausführt. Sie erstellen alle erforderlichen Verzeichnisse oder Links und setzen dann vold.post_fs_data_done auf 1.

    Sobald vold die 1 in dieser Eigenschaft sieht, setzt es die Eigenschaft vold.decrypt auf: trigger_restart_framework. Dies führt dazu, dass init.rc Dienste in der Klasse main erneut startet und zum ersten Mal seit dem Booten auch Dienste in der Klasse late_start startet.

  4. 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.

  1. 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 setzt vold.decrypt auf trigger_restart_min_framework , da /data mit einem Passwort verschlüsselt ist.

  2. Mounten Sie tmpfs

    init legt fünf Eigenschaften fest, um die anfänglichen Mount-Optionen für /data mit den von init.rc übergebenen Parametern zu speichern. vold verwendet diese Eigenschaften, um das Krypto-Mapping einzurichten:

    1. ro.crypto.fs_type
    2. ro.crypto.fs_real_blkdev
    3. ro.crypto.fs_mnt_point
    4. ro.crypto.fs_options
    5. ro.crypto.fs_flags (8-stellige ASCII-Hexadezimalzahl mit vorangestelltem 0x)
  3. Starten Sie das Framework, um zur Eingabe eines Passworts aufzufordern

    Das Framework startet und stellt fest, dass vold.decrypt auf trigger_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 an vold . 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 dem CRYPTO_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. Wenn vold 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.

  4. 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 Befehl cryptfs checkpw an vold 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), speichert vold den Namen des entschlüsselten Blockgeräts in der Eigenschaft ro.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.

  5. Stoppen Sie das Framework

    Die Benutzeroberfläche erstellt eine Krypto-Boot-Grafik und ruft dann vold mit dem Befehl cryptfs restart auf. vold setzt die Eigenschaft vold.decrypt auf trigger_reset_main , was dazu führt, dass init.rc class_reset main ausführt. Dadurch werden alle Dienste in der Hauptklasse gestoppt, wodurch die Bereitstellung von tmpfs /data aufgehoben werden kann.

  6. 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 Eigenschaft vold.post_fs_data_done auf 0 und setzt dann vold.decrypt auf trigger_post_fs_data . Dies führt dazu, dass init.rc seine post-fs-data Befehle ausführt. Sie erstellen alle erforderlichen Verzeichnisse oder Links und setzen dann vold.post_fs_data_done auf 1. Sobald vold die 1 in dieser Eigenschaft sieht, setzt es die Eigenschaft vold.decrypt auf trigger_restart_framework . Dies führt dazu, dass init.rc Dienste in der Klasse main erneut startet und zum ersten Mal seit dem Booten auch Dienste in der Klasse late_start startet.

  7. 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:

  1. Verschlüsseltes Gerät mit Passwort erkennen
  2. Mounten Sie tmpfs
  3. 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:

  1. Generieren Sie einen zufälligen 16-Byte-Festplattenverschlüsselungsschlüssel (DEK) und einen 16-Byte-Salt.
  2. Wenden Sie scrypt auf das Benutzerkennwort und den Salt an, um den 32-Byte-Zwischenschlüssel 1 (IK1) zu erzeugen.
  3. 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.
  4. Signieren Sie aufgefülltes IK1 mit HBK, um 256-Byte-IK2 zu erzeugen.
  5. Wenden Sie scrypt auf IK2 und Salt an (das gleiche Salt wie in Schritt 2), um 32-Byte-IK3 zu erzeugen.
  6. Verwenden Sie die ersten 16 Bytes von IK3 als KEK und die letzten 16 Bytes als IV.
  7. 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.

ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags

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