Vollständige Festplattenverschlüsselung

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

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

  1. Unverschlüsseltes Dateisystem mit forceencrypt Flag erkennen

    /data ist nicht verschlüsselt, muss es aber sein, weil forceencrypt dies vorschreibt. Unmounten /data .

  2. Beginnen Sie mit der Verschlüsselung /data

    vold.decrypt = "trigger_encryption" triggert init.rc , wodurch vold /data ohne Passwort verschlüsselt. (Keine ist gesetzt, da es sich um ein neues Gerät handeln soll.)

  3. Mounten Sie tmpfs

    vold ein tmpfs /data ein (unter Verwendung der tmpfs-Optionen von ro.crypto.tmpfs_options ) und setzt die Eigenschaft vold.encrypt_progress auf 0. vold bereitet die 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 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 .

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

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

  6. Mounten /data

    init mountet dann /data auf einer tmpfs-RAMDisk unter Verwendung von Parametern, die es von ro.crypto.tmpfs_options , das in init.rc ist.

  7. Rahmen starten

    Setzen vold 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 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.

  1. Passwort prüfen

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

  2. 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 Eigenschaft vold.decrypt auf trigger_shutdown_framework . Dies veranlasst init.rc , Dienste in den Klassen late_start und main zu stoppen.

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

  8. Hängen Sie während der Verschlüsselung tmpfs ein

    vold ein tmpfs /data ein (unter Verwendung der tmpfs-Optionen von ro.crypto.tmpfs_options ) und setzt die Eigenschaft vold.encrypt_progress auf 0. vold bereitet die tmpfs /data zum 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 bewirkt, dass init.rc die main von Diensten startet. Wenn das Framework sieht, dass vold.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 aktualisiert vold.encrypt_progress jedes Mal, wenn sie einen weiteren Prozentsatz der Partition verschlüsselt.

  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 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 Eigenschaft vold.encrypt_progress auf error_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 .

  1. Erkennen Sie verschlüsselte /data ohne Passwort

    Erkennen, 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 Dienst defaultcrypto wird. trigger_default_encryption überprü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 /Daten

    vold dann die entschlüsselte reale /data Partition ein und bereitet dann die neue Partition vor. Es setzt die Eigenschaft vold.post_fs_data_done auf 0 und dann vold.decrypt auf trigger_post_fs_data . Dies veranlasst init.rc , seine post-fs-data Befehle auszuführen. 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 bewirkt, dass init.rc zum ersten Mal seit dem Booten Dienste in der Klasse main erneut startet und auch Dienste in der Klasse late_start .

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

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

  2. Mounten Sie tmpfs

    init legt fünf Eigenschaften fest, um die anfänglichen Einhängeoptionen für /data mit Parametern zu speichern, die von init.rc . vold verwendet diese Eigenschaften, um die Krypto-Zuordnung 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 (ASCII 8-stellige Hexadezimalzahl mit vorangestelltem 0x)
  3. Starten Sie das Framework, um zur Eingabe des Kennworts aufzufordern

    Das Framework startet und sieht, dass vold.decrypt auf trigger_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 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 bestimmt dies, indem es in den Krypto-Metadaten nach dem Flag CRYPTO_ENCRYPTION_IN_PROGRESS sucht. Wenn es gesetzt ist, wurde der Verschlüsselungsprozess unterbrochen und es befinden sich keine nutzbaren Daten auf dem Gerät. Wenn vold 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.

  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 . 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. Rahmen stoppen

    Die Benutzeroberfläche zeigt eine Krypto-Boot-Grafik an und ruft dann vold mit dem Befehl cryptfs restart auf. vold setzt die Eigenschaft vold.decrypt auf trigger_reset_main , was bewirkt, dass init.rc class_reset main . Dies stoppt alle Dienste in der Hauptklasse, wodurch tmpfs /data ausgehängt werden kann.

  6. 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 Eigenschaft vold.post_fs_data_done auf 0 und dann vold.decrypt auf trigger_post_fs_data . Dies veranlasst init.rc , seine post-fs-data Befehle auszuführen. 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 bewirkt, dass init.rc zum ersten Mal seit dem Booten Dienste in der Klasse main erneut startet und auch Dienste in der Klasse late_start .

  7. Vollständiges Framework starten

    Jetzt bootet das Framework alle seine Dienste mit dem entschlüsselten /data Dateisystem, und das System ist einsatzbereit.

Versagen

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:

  1. Erkennen Sie verschlüsselte Geräte mit einem Passwort
  2. Mounten Sie tmpfs
  3. 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.

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

  1. Generieren Sie einen zufälligen 16-Byte-Festplattenverschlüsselungsschlüssel (DEK) und 16-Byte-Salz.
  2. Wenden Sie scrypt auf das Benutzerkennwort und das Salt an, um den 32-Byte-Zwischenschlüssel 1 (IK1) zu erzeugen.
  3. 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.
  4. Unterschreiben Sie aufgefülltes IK1 mit HBK, um 256-Byte-IK2 zu erzeugen.
  5. Wenden Sie scrypt auf IK2 und Salt (dasselbe Salt wie in Schritt 2) an, 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 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.

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