Hvorfor skal jeg ikke ' t bruke ECB-kryptering?
On februar 18, 2021 by adminJeg bruker Java til å generere krypterte strenger, og jeg får denne advarselen ved byggetid:
ECB-krypteringsmodus skal ikke brukes
Så jeg lurer på hvorfor jeg ikke skal bruke ECB og hva jeg kan bruke i stedet ?
Kommentarer
- Kommentarer er ikke til utvidet diskusjon. Denne samtalen er flyttet til chat .
- Jobber du med zoom?;)
Svar
Hvorfor skal jeg ikke bruke ECB-kryptering?
Hovedårsaken til ikke å bruke ECB-modus -kryptering er at den ikke er semantisk sikker — det vil si at bare å observere ECB-kryptert krypteringstekst kan lekke informasjon om ren tekst (selv utover lengden, som alle krypteringsskjemaer som godtar vilkårlig lange tekst, vil til en viss grad lekke).
Spesifikk Problemet med ECB-modus er at kryptering av den samme blokken (på 8 eller 16 byte, eller hvor stor blokkstørrelsen til den underliggende krypteringen er) av ren tekst ved bruk av ECB-modus alltid gir den samme blokken krypteringstekst. Dette kan tillate en angriper å:
- oppdage om to ECB-krypterte meldinger er identiske;
- oppdage om to ECB-krypterte meldinger har et felles prefiks;
- oppdage om to ECB-krypterte meldinger deler andre vanlige delstrenger, så lenge disse delstrengene er justert ved blokkgrensene; eller
- oppdag om (og hvor) en enkelt ECB-kryptert melding inneholder repeterende data (for eksempel lange løp med mellomrom eller nullbyte, gjentatte overskriftsfelt eller tilfeldige gjentatte fraser i tekst).
Det er en fin grafisk demonstrasjon av denne svakheten på Wikipedia, der det samme (rå, ukomprimerte) bildet er kryptert ved bruk av både ECB-modus og en semantisk sikker krypteringsmodus (slik som CBC, CTR, CFB eller OFB):
Selv om dette scenariet er noe kunstig (man vil vanligvis ikke kryptere rå bilder som dette), demonstrerer pent problemet med ECB-modus: repeterende områder i inngangsbildet resulterer i repeterende mønstre i den krypterte utgangen, slik at mange store funksjoner i bildet forblir gjenkjennelige til tross for krypteringen. I den virkelige verden angriper en kryptanalytiker basert kryptering ordningen ville være mer sannsynlig å se etter slike mønstre i en hex dump av krypteringsteksten, men prinsippet er det samme.
Et faktisk tilfelle av denne svakheten ved ECB-kryptering som bidrar til et reelt datakompromiss er gitt av Adobes passorddatabase-lekkasje 2013, som beskrevet i dette svaret . Her var et element som bidro til alvorlighetsgraden av lekkasjen at i stedet for hash dem ordentlig , hadde Adobe kryptert passordene ved hjelp av ECB-modus. Dette tillot angriperne å raskt finne passord som deles av flere kontoer, eller dele et felles prefiks med andre passord (som passord1 og passord2 ), og avslørte også den omtrentlige lengden på hver passord.
ECB-krypteringsmodus har også andre svakheter, for eksempel det faktum at den er veldig formbar : som hver block of plaintext er separat kryptert, en angriper kan enkelt generere nye gyldige ciphertexts ved å samle blokker fra tidligere observerte ciphertexts.
Smidbarheten er imidlertid bare et problem hvis ECB-kryptering brukes uten autentiseringskode for melding , og, i denne situasjonen, deles (til en viss grad) av alle andre ikke-autentiserte krypteringsmodi , som de nevnte CBC, CTR, CFB og OFB. Dermed kan det egentlig ikke betraktes som en spesifikk svakhet i ECB-modus, selv om det pleier å være et ekstra problem når noensinne brukes ECB-modus.
Hva skal jeg bruke i stedet?
Du bør bruke en hvilken som helst godkjent kryptering modus, for eksempel GCM , EAX eller OCB .
Personlig, for korte meldinger, er jeg ganske glad i SIV-modus ( RFC 5279 ), som gir et ekstra lag med motstand mot misbruk. (Mange andre krypteringsmodi vil bryte ganske dårlig hvis den samme IV / nonce ved et uhell brukes til å kryptere flere meldinger. SIV-modus beholder alle sine sikkerhetsegenskaper i denne situasjonen, bortsett fra å lekke om de krypterte meldingene er identiske.)
Du kan også bruke hvilken som helst tradisjonell semantisk sikker krypteringsmodus (for eksempel CBC eller CTR ), kombinert med en meldingsautentiseringskode (for eksempel HMAC ) ved hjelp av Krypter -da-MAC konstruksjon. (Det vil si at du først skal kryptere meldingen, deretter beregne en MAC av krypteringsteksten og legge den til krypteringsteksten.) Så lenge du sørger for å bekrefte MAC før du prøver å dekryptere meldingen, vil denne konstruksjonen beskytte deg mot de forskjellige sårbarhetene i disse modusene for aktive (valgt ciphertext) angrep.
For diskkryptering eller lignende applikasjoner som krever muligheten til å endre deler i krypteringsteksten uten å kryptere alle dataene på nytt, bør du bruke en krypteringsmodus designet for det formålet, for eksempel XTS . Merk at slike moduser generelt mangler motstand mot aktive angrep, og kan ha andre svakheter som bør forstås før du bruker dem. Hvis mulig, bør de kombineres med en eller annen form for integritetsbeskyttelse, for eksempel en MAC på et hash-tre .
Kommentarer
- Hva vil du foreslå i tilfeller der man ønsker å kunne lese / skrive blokker i et datalager i vilkårlig rekkefølge, helst mens man lager et all-ones-blokkart til et all- de blokkerer? Min tilbøyelighet ville være å kryptere ved å xore blokkdataene med en veldig enkel hash av blokknummeret, angre / gjenta xor-operasjonen hvis det gir en all-ones-blokk, ved hjelp av ECB på resultatet, og xoring med komplement av resultatet for å kryptere en all-ones-blokk [som komplement trenger bare å beregnes en gang for hver nøkkel]. Ville det virke som en god tilnærming?
- @supercat: At ' i utgangspunktet er diskkryptering , så du kan bruke moduser designet for det. Jeg tror XTS regnes som et godt valg, selv om det, som alle diskkrypteringsmodi, har sine begrensninger (som du bør forstå før du bruker det). Hvis mulig, bør det kombineres med en MAC av noe slag for å forsvare seg mot aktive angrep.
- @IlmariKaronen: Jeg tror å si " don ' t bruk ECB " er litt overkill. Jeg forstår risikoen, men mange ganger (med mindre dokumentet ditt – det du krypterer – er ikke ' t veldig hemmelig, og motstanderen ikke ' t har for mange evner osv.), bør du være ok.
- @giorgim: Det ' er egentlig ingen god grunn å bruke ECB (unntatt som en byggestein for andre moduser). Ganske mye ethvert kryptobibliotek gir minst CBC- eller CTR-modus, og hvis ikke, er de ' trivielle for å implementere deg selv. Slå en HMAC (eller CMAC) på toppen av det, og du ' er klar til å gå.
- @giorgim: Selv om du ikke gjør ' t har hvilken som helst MAC- eller AE-modus, og bruk av CBC er fortsatt strengt tatt bedre enn ECB. Hvis du har en MAC-funksjon, er CBC-da-MAC en perfekt god AE-modus.
Svar
Du bør ikke bruke ECB-modus fordi den vil kryptere identiske meldingsblokker (dvs. mengden data kryptert i hver påkalling av blokkrypteringen) til identiske krypteringstekstblokker. Dette er et problem fordi det vil avsløre om de samme meldingsblokkene er kryptert flere ganger. Wikipedia har en veldig fin illustrasjon av dette problemet .
Kommentarer
- Kommentarer er ikke for utvidet diskusjon; denne samtalen er flyttet til chat .
Svar
Som @Guut Boy nevnte det, er ikke ECB semantisk sikker, i den forstand at hvis en melding med identiske blokker er kryptert, så får en angriper en viss fordel ved å ha informasjon i klartekst, ved bare å observere CipherText.
Bruk helst CBC-modus for å kryptere lang melding. Denne modusen introduserer en tilleggsparameter kalt IV (Initial Value), du initialiserer med øktnummeret for å forhindre angrep i tilfelle kryptering av den samme meldingen to ganger.
Kommentarer
- IV står for initialiseringsvektor, ikke initialverdi.
- 1. Dette er ikke et godt råd. Bruke kryptering uten autentisering ser bort fra et tiår med råd fra kryptografer. Bedre ville være å bruke godkjent kryptering, slik Ilmari Karonen anbefaler. 2. Dette svaret ser ut til å bli overvåket av Ilmari Karonen ' s svar.
- I tillegg til det er faktum at IV må være uforutsigbar for en angriper (dvs. kan ikke skilles fra tilfeldig), og dette svaret sier at du bør bruke øktnummeret, som vanligvis ikke er tilfeldig i det hele tatt.
Legg igjen en kommentar