Kryptering af hele disken er en proces, hvor alle brugerdata på en Android-enhed krypteres ved hjælp af en krypteret nøgle. Når en enhed er krypteret, krypteres alle data, der er oprettet af brugeren, automatisk, før de overføres til disken, og alle læste data dekrypteres automatisk, før de returneres til den kaldende proces.
Fuld disk-kryptering blev introduceret i Android i 4.4, men Android 5.0 introducerede disse nye funktioner:
- Skabt hurtig kryptering, som kun krypterer de anvendte blokke på datapartitionen for at undgå, at første opstart tager lang tid. Kun ext4- og f2fs-filsystemerne understøtter i øjeblikket hurtig kryptering.
- Tilføjede
forceencryptfstab-flaget til at kryptere ved første opstart. - Fuldført understøttelse af mønstre og kryptering uden adgangskode.
- Tilføjede hardwareunderstøttet lagring af krypteringsnøglen ved hjælp af TEE-signeringsmuligheden (Trusted Execution Environment) (f.eks. i en TrustZone). Se Lagring af den krypterede nøgle for at få flere oplysninger.
Forsigtig: Enheder, der er opgraderet til Android 5.0 og derefter krypteret, kan returneres til en ukrypteret tilstand ved en fabriksdatareset. Nye Android 5.0-enheder, der er krypteret ved første opstart, kan ikke returneres til en ukrypteret tilstand.
- Sådan fungerer Android-kryptering af hele disken
- Flows
- Krypter en ny enhed med forceencrypt
- Krypter en eksisterende enhed
- Start af en krypteret enhed med standardkryptering
- Start af en krypteret enhed uden standardkryptering
- Svigt
- Lagring af den krypterede nøgle
- Ændring af adgangskode
- Krypteringsegenskaber
- Vold egenskaber
- init properties
- Init-handlinger
Sådan fungerer Android-kryptering af hele disken
Android-kryptering af hele disken er baseret på dm-crypt, som er en kernefunktion, der fungerer i blok-enhedslaget. Derfor fungerer kryptering med Embedded MultiMediaCard (eMMC) og lignende flash-enheder, der præsenterer sig for kernen som blok-enheder. Kryptering er ikke mulig med YAFFS, som taler direkte til en råNAND-flashchip.
Krypteringsalgoritmen er 128 Advanced Encryption Standard (AES) med CBC-kobling (cipher-block chaining) og ESSIV:SHA256. Hovednøglen krypteres med128-bit AES via kald til OpenSSL-biblioteket. Du skal bruge 128 bit eller mere til nøglen (256 er valgfrit).
Bemærk: OEM’er kan bruge 128-bit eller mere til at kryptere hovednøglen.
I Android 5.0-udgaven er der fire former for krypteringstilstande:
- default
- PIN
- password
- pattern
Den første opstart opretter enheden en tilfældigt genereret 128-bit hovednøgle og hasher den derefter med en standardadgangskode og et gemt salt. Standardadgangskoden er: “default_password “Den resulterende hash er dog også signeret via en TEE (f.eks. TrustZone), som bruger en hash af signaturen til at kryptere hovednøglen.
Du kan finde standardadgangskoden defineret i Android Open Source Project cryptfs.cpp-filen.
Når brugeren indstiller pinkoden/passet eller adgangskoden på enheden, er det kun 128-bit-nøglen, der krypteres og gemmes igen. (dvs. ændringer af brugerens PIN-kode/pas/mønster forårsager IKKE genkryptering af brugerdata.) Bemærk, at forvaltede enheder kan være underlagt PIN-kode-, mønster- eller adgangskodebegrænsninger.
Kryptering forvaltes af init og vold.init kalder vold, og vold indstiller egenskaber til at udløse hændelser i init. Andre dele af systemet ser også på egenskaberne for at udføre opgaver som f.eks. at rapportere status, bede om et adgangskode eller bede om fabriksnulstilling i tilfælde af en fatal fejl. For at påkaldekrypteringsfunktioner i vold bruger systemet kommandolinjeværktøjetvdcs cryptfs-kommandoer: checkpw,restart, enablecrypto, changepw,cryptocomplete, verifypw, setfield,getfield, mountdefaultencrypted, getpwtype,getpw og clearpw.
For at kryptere, dekryptere eller slette /data, må /data ikke være monteret. For at kunne vise nogen brugergrænseflade (UI) skal rammen dog starte, og rammen kræver, at /data kører. For at løse dette problem monteres et midlertidigt filsystem på /data, så Android kan anmode om adgangskoder, vise fremskridt eller foreslå en datawipe efter behov. Det medfører dog den begrænsning, at systemet for at skifte fra det midlertidige filsystem til det rigtige /data-filsystem skal stoppe alle processer med åbne filer på det midlertidige filsystem og genstarte disse processer på det rigtige /data-filsystem. For at gøre dette skal alle tjenester være i en af tre grupper: core, main oglate_start.
-
core: Lukkes aldrig ned efter start. -
main: Lukkes ned og genstartes derefter, efter at diskadgangskoden er indtastet. -
late_start: Startes ikke før efter, at/dataer blevet dekrypteret og monteret.
For at udløse disse handlinger indstilles vold.decrypt-egenskaben til forskellige strenge. for at dræbe og genstarte tjenester er init-kommandoerne:
-
class_reset: Stopper en tjeneste, men tillader, at den genstartes med class_start. -
class_start: Genstarter en tjeneste. -
class_stop: Stopper en tjeneste og tilføjer etSVC_DISABLED-flag. Stoppede tjenester reagerer ikke påclass_start.
Flows
Der er fire flows for en krypteret enhed. En enhed krypteres kun én gang og følger derefter et normalt opstartsflow.
- Krypter en tidligere ukrypteret enhed:
- Krypter en ny enhed med
forceencrypt: Obligatorisk kryptering ved første opstart (starter i Android L). - Krypter en eksisterende enhed: Brugerinitieret kryptering (Android K og tidligere).
- Krypter en ny enhed med
- Boot en krypteret enhed:
- Start en krypteret enhed uden adgangskode: Opstart af en krypteret enhed, der ikke har nogen indstillet adgangskode (relevant for enheder, der kører Android 5.0 og nyere).
- Start af en krypteret enhed med en adgangskode: Opstart af en krypteret enhed, der har en indstillet adgangskode.
Ud over disse strømme kan enheden også mislykkes med at kryptere /data Hver af strømmene forklares i detaljer nedenfor.
Krypter en ny enhed med forceencrypt
Dette er den normale første opstart for en Android 5.0-enhed.
- Opdag ukrypteret filsystem med
forceencrypt-flag/dataer ikke krypteret, men skal være det, fordiforceencryptkræver det. afmontere/data. - Start kryptering af
/datavold.decrypt = "trigger_encryption"udløserinit.rc,hvilket fårvoldtil at kryptere/datauden adgangskode.(Ingen er indstillet, fordi dette skal være en ny enhed.) - Mount tmpfs
voldmonterer en tmpfs/data(ved hjælp af tmpfs-indstillingerne fraro.crypto.tmpfs_options) og indstiller egenskabenvold.encrypt_progresstil 0.voldforbereder tmpfs/datatil opstart af et krypteret system og indstiller egenskabenvold.decrypttil:trigger_restart_min_framework - Fremkald rammer for at vise fremskridt
Da enheden stort set ingen data har at kryptere, vil fremskridtslinjen ofte faktisk ikke blive vist, fordi krypteringen sker så hurtigt. SeKrypter en eksisterende enhed for at få flere detaljer om fremskridtsbrugergrænsefladen.
- Når
/dataer krypteret, tages rammen nedvoldsættervold.decrypttiltrigger_default_encryption, hvilket starter tjenestendefaultcrypto. (Dette starter nedenstående flow til montering af en standardkrypteret brugerdata.)trigger_default_encryptionkontrollerer krypteringstypen for at se, om/dataer krypteret med eller uden adgangskode. Da Android 5.0-enheder krypteres ved første opstart, bør der ikke være indstillet nogen adgangskode; derfor dekrypterer vi og monterer/data. - Mount
/datainitmonterer derefter/datapå en tmpfs RAMDisk ved hjælp afparametre, som den henter fraro.crypto.tmpfs_options, som er indstillet iinit.rc. - Start framework
Sæt
voldtiltrigger_restart_framework, somfortsætter den sædvanlige opstartsproces.
Krypter en eksisterende enhed
Det er det, der sker, når du krypterer en ukrypteret Android K- eller tidligere Android-enhed, der er blevet migreret til L.
Denne proces er brugerinitieret og kaldes “inplace-kryptering” ikoden. Når en bruger vælger at kryptere en enhed, sørger brugergrænsefladen for, at batteriet er fuldt opladet, og at vekselstrømsadapteren er tilsluttet, så der er nok strøm til at afslutte krypteringsprocessen.
Varsel: Hvis enheden løber tør for strøm og lukker ned, før den er færdig med at kryptere, efterlades fildata i en delvist krypteret tilstand. Enheden skal fabriksnulstilles, og alle data går tabt.
For at aktivere inplace-kryptering starter vold en løkke for at læse hver sektor i den reelle blokenhed og derefter skrive den til kryptoblok-enheden. vold kontrollerer, om en sektor er i brug, før den læses og skrives, hvilket gør krypteringen meget hurtigere på en ny enhed, der kun har få eller ingen data.
Status for enhed: Indstil ro.crypto.state = "unencrypted"og udfør on nonencrypted init-triggeren for at fortsætte opstart.
- Kontroller adgangskode
UI kalder
voldmed kommandoencryptfs enablecrypto inplacehvorpasswder brugerens låseskærmsadgangskode. - Nedtag rammen
voldkontrollerer for fejl, returnerer -1, hvis den ikke kan kryptere, og udskriver en årsag i loggen. Hvis den kan kryptere, indstiller den egenskabenvold.decrypttiltrigger_shutdown_framework. Dette fårinit.rctil at stoppe tjenesterne i klassernelate_startogmain. - Opret en kryptofod
- Opret en brødkrummefil
- Reboot
- Detekterer brødkrummefil
- Start kryptering
/datavoldopretter derefter kryptotilknytningen, som opretter en virtuel kryptoblok enhed, der er knyttet til den rigtige blok enhed, men krypterer hver sektor, når den skrives, og dekrypterer hver sektor, når den læses.voldopretter og skriver derefter krypto-metadataene ud. - Mens den krypterer, mount tmpfs
voldmonterer en tmpfs/data(ved hjælp af tmpfs-indstillingerne fraro.crypto.tmpfs_options) og sætter egenskabenvold.encrypt_progresstil 0.voldforbereder tmpfs/datatil opstart af et krypteret system og sætter egenskabenvold.decrypttil:trigger_restart_min_framework - Fremkalder rammen for at vise fremskridt
trigger_restart_min_frameworkforårsagerinit.rctil at startemainklassen af tjenester. Når rammen ser, atvold.encrypt_progresser indstillet til 0, fremkalder den fremskridtsbarUI’en, som forespørger om denne egenskab hvert femte sekund og opdaterer en fremskridtslinje.Krypteringssløjfen opdaterervold.encrypt_progress, hver gang den krypterer en anden procentdel af partitionen. - Når
/dataer krypteret, opdateres krypto footerNår
/dataer krypteret med succes, slettervoldflagENCRYPTION_IN_PROGRESSi metadataene.Når enheden er succesfuldt låst op, bruges adgangskoden derefter til at kryptere hovednøglen, og krypto footer opdateres.
Hvis genstarten mislykkes af en eller anden grund, sætter
voldegenskabenvold.encrypt_progresstilerror_reboot_failed, og brugergrænsefladen bør vise en meddelelse, der beder brugeren om at trykke på en knap for at genstarte. Dette forventes ikke nogensinde at forekomme.
Start af en krypteret enhed med standardkryptering
Dette er, hvad der sker, når du starter en krypteret enhed op uden adgangskode.Fordi Android 5.0-enheder krypteres ved første opstart, bør der ikke være noget setpassword, og derfor er dette standardkrypteringstilstanden.
- Detekter krypteret
/datauden adgangskodeDetekterer, at Android-enheden er krypteret, fordi
/dataikke kan monteres, og et af flageneencryptableellerforceencrypter indstillet.voldindstillervold.decrypttiltrigger_default_encryption, hvilket starter tjenestendefaultcrypto.trigger_default_encryptionkontrollerer krypteringstypen for at se, om/dataer krypteret med eller uden adgangskode. - Dekrypterer /data
Opret
dm-crypt-enheden over blokenheden, så enheden er klar til brug. - Mount /data
voldmonterer derefter den dekrypterede reelle/data-partition og forbereder derefter den nye partition. Den indstiller egenskabenvold.post_fs_data_donetil 0 og indstiller dereftervold.decrypttiltrigger_post_fs_data. Dette fårinit.rctil at køre sinepost-fs-datakommandoer. De vil oprette eventuelle nødvendige mappereller links og derefter sættevold.post_fs_data_donetil 1.Når
voldser 1 i denne egenskab, sætter den egenskabenvold.decrypttil:trigger_restart_framework.Dette fårinit.rctil at starte tjenester i klassemainigen og også til at starte tjenester i klasselate_startfor første gang siden opstarten. - Start framework
Nu starter frameworket alle sine tjenester ved hjælp af den dekrypterede
/data, og systemet er klar til brug.
Start af en krypteret enhed uden standardkryptering
Dette er, hvad der sker, når du starter en krypteret enhed op, der har et setpassword. Enhedens adgangskode kan være en pinkode, et mønster eller en adgangskode.
- Registrer krypteret enhed med adgangskode
Detekterer, at Android-enheden er krypteret, fordi flaget
ro.crypto.state = "encrypted"voldindstillervold.decrypttiltrigger_restart_min_framework, fordi/dataer krypteret med en adgangskode. - Mount tmpfs
initindstiller fem egenskaber for at gemme de oprindelige monteringsindstillinger, der er givet for/datamed parametre, der er overført frainit.rc.voldbruger disse egenskaber til at opsætte kryptotilknytningen:-
ro.crypto.fs_type -
ro.crypto.fs_real_blkdev -
ro.crypto.fs_mnt_point -
ro.crypto.fs_options -
ro.crypto.fs_flags(ASCII 8-cifret hextal med 0x foran)
-
- Start rammen for at bede om adgangskode
Rammen starter op og ser, at
vold.decrypter indstillet tiltrigger_restart_min_framework. Dette fortæller rammen, at den starter op på en tmpfs/data-disk, og at den skal hente brugerens adgangskode.Først skal den dog sikre sig, at disken er krypteret korrekt. Den sender kommandoen
cryptfs cryptocompletetilvold.voldreturnerer 0, hvis krypteringen blev gennemført med succes, -1 ved intern fejl, eller-2, hvis krypteringen ikke blev gennemført med succes.voldbestemmer dette ved at kigge i krypto metadata efterCRYPTO_ENCRYPTION_IN_PROGRESSflaget i krypto metadata. Hvis det er indstillet, blev krypteringsprocessen afbrudt, og der er nousable data på enheden. Hvisvoldreturnerer en fejl, skal brugergrænsefladen vise en meddelelse til brugeren om at genstarte og fabriksnulstille enheden og give brugeren en knap at trykke på for at gøre det. - Dekrypter data med adgangskode
Når
cryptfs cryptocompleteer lykkedes, viser rammen en brugergrænseflade, der beder om diskadgangskoden. UI’en kontrollerer adgangskoden ved at sende kommandoencryptfs checkpwtilvold. Hvis adgangskoden er korrekt (hvilket bestemmes ved, at det lykkes at montere den dekrypterede/datapå et midlertidigt sted og derefter afmontere den), gemmervoldnavnet på den dekrypterede blokenhed i egenskabenro.crypto.fs_crypto_blkdevog returnerer status 0 til UI’en. Hvispasswordet er forkert, returnerer den -1 til UI. - Stop framework
UI’en opstiller en krypto opstartsgrafik og kalder derefter
voldmed kommandoencryptfs restart.voldindstiller egenskabenvold.decrypttiltrigger_reset_main, hvilket fårinit.rctil at gøreclass_reset main. Dette stopper alle tjenester i hovedklassen, hvilket gør det muligt at afmontere tmpfs/data. - Mount
/datavoldmonterer derefter den dekrypterede reelle/data-partition og forbereder den nye partition (som måske aldrig er blevet forberedt, hvis den blev krypteret med wipe-indstillingen, som ikke understøttes i førsteudgaven). Den sætter egenskabenvold.post_fs_data_donetil 0 og sætter dereftervold.decrypttiltrigger_post_fs_data. Dette fårinit.rctil at køre sinepost-fs-datakommandoer. De vil oprette alle nødvendige mapper eller links og derefter sættevold.post_fs_data_donetil 1. Nårvoldser 1 i denne egenskab, sætter den egenskabenvold.decrypttiltrigger_restart_framework. Dette fårinit.rctil at starte tjenester i klassemainigen og også til at starte tjenester i klasselate_startfor første gang siden opstarten. - Start full framework
Nu starter rammen alle sine tjenester ved hjælp af det dekrypterede
/datafilesystem, og systemet er klar til brug.
Svigt
En enhed, der ikke kan dekrypteres, kan være fejlbehæftet af flere årsager. Enheden starter med den normale række af trin for at starte op:
- Detekter krypteret enhed med en adgangskode
- Montér tmpfs
- Start ramme for at bede om adgangskode
Men efter at rammen er åbnet, kan enheden støde på nogle fejl:
- Password matches but cannot decrypt data
- Brugeren indtaster forkert password 30 gange
Hvis disse fejl ikke løses, skal brugeren opfordres til at slette på fabrikken:
Hvis vold registrerer en fejl under krypteringsprocessen, og hvis ingen data er blevet ødelagt endnu, og rammen er oppe, indstiller vold egenskaben vold.encrypt_progress til error_not_encrypted.Brugergrænsefladen beder brugeren om at genstarte og advarer brugeren om, at krypteringsprocessen aldrig er startet. Hvis fejlen opstår, efter at rammen er blevet revet ned, men før UI’en med statuslinjen er oppe, genstarter vold systemet. Hvis genstarten mislykkes, sætter den vold.encrypt_progress til error_shutting_down og returnerer -1; men der vil ikke være noget til at opfange fejlen. Dette forventes ikke at ske.
Hvis vold registrerer en fejl under krypteringsprocessen, sætter denvold.encrypt_progress til error_partially_encryptedog returnerer -1. Brugergrænsefladen skal derefter vise en meddelelse om, at krypteringen er mislykkedes, og give brugeren en knap til at nulstille enheden fra fabriksindstillingerne.
Lagring af den krypterede nøgle
Den krypterede nøgle gemmes i krypto metadata. Hardware backing er implementeret ved hjælp af Trusted Execution Environment’s (TEE) signeringsfunktion.Tidligere krypterede vi hovednøglen med en nøgle, der blev genereret ved at anvende scryptt på brugerens adgangskode og det lagrede salt. For at gøre nøglen modstandsdygtig over for off-box-angreb udvider vi denne algoritme ved at signere den resulterende nøgle med en lagret TEE-nøgle. Den resulterende signatur omdannes derefter til en nøgle af passende længde ved endnu en anvendelse af scrypt. Denne nøgle bruges derefter til at kryptere og dekryptere hovednøglen. Sådan lagres denne nøgle:
- Generer en tilfældig 16-byte disk-krypteringsnøgle (DEK) og 16-byte salt.
- Anvend scrypt på brugeradgangskoden og saltet for at fremstille 32-byte mellemliggende nøgle 1 (IK1).
- Pad IK1 med nul bytes til størrelsen af den hardwarebundne private nøgle (HBK).Specifikt padder vi som: 00 || IK1 || 00..00; en nulbyte, 32 IK1-byte, 223nulbyte.
- Sign paded IK1 med HBK for at producere 256-byte IK2.
- Anvend scrypt på IK2 og salt (samme salt som i trin 2) for at fremstille 32-byte IK3.
- Brug de første 16 bytes af IK3 som KEK og de sidste 16 bytes som IV.
- Krypter DEK med AES_CBC, med nøgle KEK og initialiseringsvektor IV.
Ændring af adgangskode
Når en bruger vælger at ændre eller fjerne sin adgangskode i indstillingerne, sender brugergrænsefladen kommandoen cryptfs changepw til vold, ogvold krypterer diskmasternøglen på ny med den nye adgangskode.
Krypteringsegenskaber
vold og init kommunikerer med hinanden ved at indstille egenskaber. Her er en liste over tilgængelige egenskaber for kryptering.
Vold egenskaber
| Egenskab | Beskrivelse | |
|---|---|---|
vold.decrypt trigger_encryption |
Krypter disken uden adgangskode. | |
vold.decrypt trigger_default_encryption |
Kontroller drevet for at se, om det er krypteret uden adgangskode. hvis det er, dekrypteres det, og det monteres, ellers sættes vold.decrypt til trigger_restart_min_framework. |
|
vold.decrypt trigger_reset_main |
Sæt af vold til at lukke brugergrænsefladen, der beder om diskens adgangskode. | |
vold.decrypt trigger_post_fs_data |
Sæt af vold til at klargøre /data med nødvendige mapper, m.m. |
|
vold.decrypt trigger_restart_framework |
Stillet af vold for at starte den rigtige ramme og alle tjenester. | |
vold.decrypt trigger_shutdown_framework |
Stillet af vold for at lukke den fulde ramme ned for at starte kryptering. | |
vold.decrypt trigger_restart_min_framework |
Sæt af vold for at starte en brugergrænseflade med statuslinje for kryptering eller for at anmode om adgangskode, afhængigt af værdien af ro.crypto.state. |
|
vold.encrypt_progress |
Når rammen starter op, hvis denne egenskab er indstillet, indtræder UI-tilstanden for fremskridtslinjen. | |
vold.encrypt_progress 0 to 100 |
UI-tilstanden for fremskridtslinjen skal vise den indstillede procentvise værdi. | |
vold.encrypt_progress error_partially_encrypted |
Forløbsbjælkens brugergrænseflade bør vise en meddelelse om, at krypteringen mislykkedes, og give brugeren mulighed for at foretage en fabriksnulstilling af enheden. | |
vold.encrypt_progress error_reboot_failed |
Forløbsbjælkens brugergrænseflade bør vise en meddelelse om, at krypteringen er afsluttet, og give brugeren en knap til at genstarte enheden. Denne fejl forventes ikke at opstå. | |
vold.encrypt_progress error_not_encrypted |
Progressbar UI bør vise en meddelelse om, at der er opstået en fejl, at der ikke er krypteret eller tabt data, og give brugeren en knap til at genstarte systemet. | |
vold.encrypt_progress error_shutting_down |
Progressbar UI kører ikke, så det er uklart, hvem der vil reagere på denne fejl. Og det burde alligevel aldrig ske. | |
vold.post_fs_data_done 0 |
Stillet af vold lige før indstilling af vold.decrypt til trigger_post_fs_data. |
|
vold.post_fs_data_done 1 |
Stillet af init.rc eller init.rc lige efter afslutning af opgave post-fs-data. |
init properties
| Property | Description |
|---|---|
ro.crypto.fs_crypto_blkdev |
Sæt af vold-kommando checkpw til senere brug af vold-kommando restart. |
ro.crypto.state unencrypted |
Stillet af init for at sige, at dette system kører med en ukrypteret /data ro.crypto.state encrypted. Indstillet af init for at sige, at dette system kører med en krypteret /data. |
|
|
Disse fem egenskaber indstilles af init, når den forsøger at montere /data med parametre, der er overført fra init.rc. vold bruger disse til at opsætte krypto-tilknytningen. |
ro.crypto.tmpfs_options |
Stilles af init.rc med de indstillinger, som init skal bruge, når tmpfs /data-filsystemet monteres. |