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
forceencrypt
fstab-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øjetvdc
s 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/data
er 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/data
er ikke krypteret, men skal være det, fordiforceencrypt
kræver det. afmontere/data
. - Start kryptering af
/data
vold.decrypt = "trigger_encryption"
udløserinit.rc
,hvilket fårvold
til at kryptere/data
uden adgangskode.(Ingen er indstillet, fordi dette skal være en ny enhed.) - Mount tmpfs
vold
monterer en tmpfs/data
(ved hjælp af tmpfs-indstillingerne fraro.crypto.tmpfs_options
) og indstiller egenskabenvold.encrypt_progress
til 0.vold
forbereder tmpfs/data
til opstart af et krypteret system og indstiller egenskabenvold.decrypt
til: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
/data
er krypteret, tages rammen nedvold
sættervold.decrypt
tiltrigger_default_encryption
, hvilket starter tjenestendefaultcrypto
. (Dette starter nedenstående flow til montering af en standardkrypteret brugerdata.)trigger_default_encryption
kontrollerer krypteringstypen for at se, om/data
er 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
/data
init
monterer derefter/data
på en tmpfs RAMDisk ved hjælp afparametre, som den henter fraro.crypto.tmpfs_options
, som er indstillet iinit.rc
. - Start framework
Sæt
vold
tiltrigger_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
vold
med kommandoencryptfs enablecrypto inplace
hvorpasswd
er brugerens låseskærmsadgangskode. - Nedtag rammen
vold
kontrollerer for fejl, returnerer -1, hvis den ikke kan kryptere, og udskriver en årsag i loggen. Hvis den kan kryptere, indstiller den egenskabenvold.decrypt
tiltrigger_shutdown_framework
. Dette fårinit.rc
til at stoppe tjenesterne i klassernelate_start
ogmain
. - Opret en kryptofod
- Opret en brødkrummefil
- Reboot
- Detekterer brødkrummefil
- Start kryptering
/data
vold
opretter 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.vold
opretter og skriver derefter krypto-metadataene ud. - Mens den krypterer, mount tmpfs
vold
monterer en tmpfs/data
(ved hjælp af tmpfs-indstillingerne fraro.crypto.tmpfs_options
) og sætter egenskabenvold.encrypt_progress
til 0.vold
forbereder tmpfs/data
til opstart af et krypteret system og sætter egenskabenvold.decrypt
til:trigger_restart_min_framework
- Fremkalder rammen for at vise fremskridt
trigger_restart_min_framework
forårsagerinit.rc
til at startemain
klassen af tjenester. Når rammen ser, atvold.encrypt_progress
er 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
/data
er krypteret, opdateres krypto footerNår
/data
er krypteret med succes, slettervold
flagENCRYPTION_IN_PROGRESS
i 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
vold
egenskabenvold.encrypt_progress
tilerror_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
/data
uden adgangskodeDetekterer, at Android-enheden er krypteret, fordi
/data
ikke kan monteres, og et af flageneencryptable
ellerforceencrypt
er indstillet.vold
indstillervold.decrypt
tiltrigger_default_encryption
, hvilket starter tjenestendefaultcrypto
.trigger_default_encryption
kontrollerer krypteringstypen for at se, om/data
er krypteret med eller uden adgangskode. - Dekrypterer /data
Opret
dm-crypt
-enheden over blokenheden, så enheden er klar til brug. - Mount /data
vold
monterer derefter den dekrypterede reelle/data
-partition og forbereder derefter den nye partition. Den indstiller egenskabenvold.post_fs_data_done
til 0 og indstiller dereftervold.decrypt
tiltrigger_post_fs_data
. Dette fårinit.rc
til at køre sinepost-fs-data
kommandoer. De vil oprette eventuelle nødvendige mappereller links og derefter sættevold.post_fs_data_done
til 1.Når
vold
ser 1 i denne egenskab, sætter den egenskabenvold.decrypt
til:trigger_restart_framework.
Dette fårinit.rc
til at starte tjenester i klassemain
igen og også til at starte tjenester i klasselate_start
for 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"
vold
indstillervold.decrypt
tiltrigger_restart_min_framework
, fordi/data
er krypteret med en adgangskode. - Mount tmpfs
init
indstiller fem egenskaber for at gemme de oprindelige monteringsindstillinger, der er givet for/data
med parametre, der er overført frainit.rc
.vold
bruger 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.decrypt
er 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 cryptocomplete
tilvold
.vold
returnerer 0, hvis krypteringen blev gennemført med succes, -1 ved intern fejl, eller-2, hvis krypteringen ikke blev gennemført med succes.vold
bestemmer dette ved at kigge i krypto metadata efterCRYPTO_ENCRYPTION_IN_PROGRESS
flaget i krypto metadata. Hvis det er indstillet, blev krypteringsprocessen afbrudt, og der er nousable data på enheden. Hvisvold
returnerer 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 cryptocomplete
er lykkedes, viser rammen en brugergrænseflade, der beder om diskadgangskoden. UI’en kontrollerer adgangskoden ved at sende kommandoencryptfs checkpw
tilvold
. Hvis adgangskoden er korrekt (hvilket bestemmes ved, at det lykkes at montere den dekrypterede/data
på et midlertidigt sted og derefter afmontere den), gemmervold
navnet på den dekrypterede blokenhed i egenskabenro.crypto.fs_crypto_blkdev
og 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
vold
med kommandoencryptfs restart
.vold
indstiller egenskabenvold.decrypt
tiltrigger_reset_main
, hvilket fårinit.rc
til at gøreclass_reset main
. Dette stopper alle tjenester i hovedklassen, hvilket gør det muligt at afmontere tmpfs/data
. - Mount
/data
vold
monterer 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_done
til 0 og sætter dereftervold.decrypt
tiltrigger_post_fs_data
. Dette fårinit.rc
til at køre sinepost-fs-data
kommandoer. De vil oprette alle nødvendige mapper eller links og derefter sættevold.post_fs_data_done
til 1. Nårvold
ser 1 i denne egenskab, sætter den egenskabenvold.decrypt
tiltrigger_restart_framework
. Dette fårinit.rc
til at starte tjenester i klassemain
igen og også til at starte tjenester i klasselate_start
for første gang siden opstarten. - Start full framework
Nu starter rammen alle sine tjenester ved hjælp af det dekrypterede
/data
filesystem, 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_encrypted
og 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. |