Hvorfor skal jeg ikke ' t bruge ECB-kryptering?
On februar 18, 2021 by adminJeg bruger Java til at generere krypterede strenge, og jeg får denne advarsel ved byggetid:
ECB-krypteringstilstand bør ikke bruges
Så jeg spekulerer på, hvorfor jeg ikke skulle bruge ECB, og hvad jeg kan bruge i stedet ?
Kommentarer
- Kommentarer er ikke til udvidet diskussion; denne samtale er flyttet til chat .
- Arbejder du med zoom?;)
Svar
Hvorfor skal jeg ikke bruge ECB-kryptering?
Hovedårsagen til ikke at bruge ECB-tilstand -kryptering er, at den ikke er semantisk sikker — det vil sige, blot at observere ECB-krypteret ciphertext kan lække information om almindelig tekst (selv ud over dens længde, som alle krypteringsordninger, der accepterer vilkårligt lange almindelige tekster, lækker til en vis grad).
Specifikt Problemet med ECB-tilstand er, at kryptering af den samme blok (på 8 eller 16 bytes, eller hvor stor blokstørrelsen på den underliggende kryptering er) af almindelig tekst ved brug af ECB-tilstand altid giver den samme blok med krypteringstekst. Dette kan gøre det muligt for en hacker at:
- opdage, om to ECB-krypterede meddelelser er identiske;
- opdage, om to ECB-krypterede meddelelser deler et fælles præfiks;
- detektere, om to ECB-krypterede meddelelser deler andre almindelige understrenge, så længe disse understreger er justeret ved blokgrænser; eller
- registrer, om (og hvor) en enkelt ECB-krypteret meddelelse indeholder gentagne data (såsom lange kørsler af mellemrum eller nullbyte, gentagne headerfelter eller tilfældigt gentagne sætninger i tekst).
Der er en fin grafisk demonstration af denne svaghed på Wikipedia, hvor det samme (rå, ukomprimerede) billede krypteres ved hjælp af både ECB-tilstand og en semantisk sikker krypteringstilstand (såsom CBC, CTR, CFB eller OFB):
Selvom dette scenarie er noget kunstigt (man ville normalt ikke kryptere rå billeder som dette), demonstrerer pænt problemet med ECB-tilstand: gentagne områder i inputbilledet resulterer i gentagne mønstre i den krypterede output, så mange store funktioner i billedet forbliver genkendelige på trods af krypteringen. I den virkelige verden angriber en kryptanalytiker en ECB- baseret kryptering ordningen ville være mere tilbøjelige til at søge efter sådanne mønstre i en hex-dump af krypteringsteksten, men princippet er det samme.
Et faktisk tilfælde af denne svaghed ved ECB-kryptering, der bidrager til et datakompromis i den virkelige verden er givet af Adobes adgangskodedatabase-lækage 2013, som beskrevet i dette svar . Her var et element, der bidrog til sværhedsgraden af lækagen, at i stedet for hashing dem ordentligt , havde Adobe krypteret adgangskoderne ved hjælp af ECB-tilstand. Dette gjorde det muligt for angriberne hurtigt at finde adgangskoder, der deles af flere konti, eller dele et fælles præfiks med andre adgangskoder (som password1 og password2 ), og afslørede også den omtrentlige længde af hver adgangskode.
ECB-krypteringstilstand har også andre svagheder, såsom det faktum, at det er meget formbart : som hver blok af almindelig tekst er krypteret separat, en angriber kan let generere nye gyldige krypteringstekster ved at samle blokke fra tidligere observerede krypteringstekster.
Imidlertid er formbarheden kun et problem, hvis ECB-kryptering bruges uden en meddelelsesgodkendelseskode , og i denne situation deles (til en vis grad) af alle andre ikke-godkendte krypteringstilstande , ligesom den førnævnte CBC, CTR, CFB og OFB. Det kan således ikke rigtig betragtes som en specifik svaghed i ECB-tilstand, selvom det har tendens til at være et yderligere problem, når der bruges altid ECB-tilstand.
Hvad skal jeg bruge i stedet?
Du skal bruge enhver godkendt kryptering tilstand, såsom GCM , EAX eller OCB .
Personligt er jeg meget glad for SIV-tilstand ( RFC 5279 ), som giver et ekstra lag mod misbrug. (Mange andre krypteringstilstande vil bryde temmelig dårligt, hvis den samme IV / nonce ved et uheld bruges til at kryptere flere meddelelser. SIV-tilstand bevarer alle sine sikkerhedsegenskaber i denne situation bortset fra at lække, om de krypterede meddelelser er identiske.)
Du kan også bruge enhver traditionel semantisk sikker krypteringstilstand (såsom CBC eller CTR ) kombineret med en meddelelsesgodkendelseskode (såsom HMAC ) ved hjælp af Krypter -da-MAC konstruktion. (Det vil sige, du skal først kryptere beskeden, derefter beregne en MAC af krypteringsteksten og tilføje den til krypteringsteksten.) Så længe du sørger for at kontrollere MAC, før du forsøger at dekryptere meddelelsen, vil denne konstruktion beskytte dig mod de forskellige sårbarheder i disse tilstande for aktive (valgt ciphertext) angreb.
For diskkryptering eller lignende applikationer, der kræver evnen til at ændre dele i krypteringsteksten uden at kryptere alle data igen, skal du bruge en krypteringstilstand designet til dette formål, såsom XTS . Bemærk, at sådanne tilstande generelt mangler modstandsdygtighed over for aktive angreb og kan have andre svagheder, der skal forstås, før du bruger dem. Hvis det er muligt, skal de kombineres med en eller anden form for integritetsbeskyttelse, såsom en MAC på et hash-træ .
Kommentarer
- Hvad vil du foreslå i tilfælde, hvor man ønsker at være i stand til at læse / skrive blokke i et datalager i vilkårlig rækkefølge, fortrinsvis mens man laver et all-ones-blokkort til et dem blokerer? Min tilbøjelighed ville være at kryptere ved at xore blokdataene med en meget simpel hash af bloknummeret, fortryde / gentage xor-operationen, hvis det giver en all-ones-blok, ved hjælp af ECB på resultatet, og xoring med komplementet til resultatet at kryptere en all-ones-blok [det komplement behøver kun at blive beregnet en gang for hver nøgle]. Ser det ud som en god tilgang?
- @supercat: At ' s grundlæggende diskkryptering , så du kunne bruge tilstande designet til det. Jeg mener, at XTS betragtes som et godt valg, selvom det ligesom alle diskkrypteringstilstande har sine begrænsninger (som du bør forstå, før du bruger det). Hvis det er muligt, bør det kombineres med en slags MAC for at forsvare sig mod aktive angreb.
- @IlmariKaronen: Jeg tror at sige " don ' Brug ikke ECB " er lidt overdreven. Jeg forstår risiciene, men mange gange (medmindre din doktor – hvad du krypterer – er ikke ' t meget hemmelig, og modstanderen ikke ' t har for mange muligheder osv.), skal du være ok.
- @giorgim: Der ' er virkelig ingen god grund at bruge ECB (undtagen som en byggesten til andre tilstande). Næsten stort set ethvert kryptobibliotek giver mindst CBC- eller CTR-tilstand, og hvis ikke, er de ' trivielle til at implementere dig selv. Slå en HMAC (eller CMAC) oven på det, og du ' er klar til at gå.
- @giorgim: Selvom du ikke ' t har hvilken som helst MAC- eller AE-tilstand, der er brug af CBC er stadig strengt bedre end ECB. Hvis du har en MAC-funktion, er CBC-derefter-MAC en perfekt god AE-tilstand.
Svar
Du bør ikke bruge ECB-tilstand, fordi den krypterer identiske meddelelsesblokke (dvs. mængden af data krypteret i hver påkaldelse af blokciferen) til identiske ciphertext-blokke. Dette er et problem, fordi det afslører, om de samme meddelelsesblokke er krypteret flere gange. Wikipedia har en meget flot illustration af dette problem .
Kommentarer
- Kommentarer er ikke til udvidet diskussion; denne samtale er flyttet til chat .
Svar
Som @Guut Boy nævnte det, er ECB ikke semantisk sikker, i den forstand at hvis en meddelelse med identiske blokke er krypteret, så får en angriber en vis fordel ved at have information i almindelig tekst ved kun at observere CipherText.
Brug fortrinsvis CBC-tilstand til at kryptere lang besked. Denne tilstand introducerer en yderligere parameter kaldet IV (Initial Value), du initialiserer med sessionsnummeret for at forhindre angreb i tilfælde af kryptering af den samme besked to gange.
Kommentarer
- IV står for initialiseringsvektor, ikke initialværdi.
- 1. Dette er ikke et godt råd. Brug af kryptering uden godkendelse ser bort fra cirka ti år med rådgivning fra kryptografer. Bedre ville være at bruge godkendt kryptering, som Ilmari Karonen anbefaler. 2. Dette svar ser ud til at blive overtaget af Ilmari Karonen ' svar.
- Derudover er faktum, at IV skal være uforudsigelig for en angriber (dvs. der ikke kan skelnes fra tilfældig), og dette svar siger, at du skal bruge sessionsnummeret, som normalt slet ikke er tilfældigt.
Skriv et svar