Hvor usikker er AES-128-CTR for å kryptere alle slags data ved hjelp av filformatet Ethereum keystore?
On november 18, 2020 by adminJeg bruker filformatet Ethereum keystore for å kryptere andre data som en ren tekst eller JSON.
Her er et eksempel på pseudokode for implementeringen:
MY_PASSWORD = "VeryDifficultPasword432131!@!#%" MY_TEXT = "This is my secret text" iv = randomBytes(16) kdfparams = { dklen: 32, n: 262144, r: 1, p: 8, salt: randomBytes(32) } key = scrypt(MY_PASSWORD, kdfparams) ciphertext = encryptCipheriv("aes-128-ctr", MY_TEXT, key, iv) mac = sha3(key[16:32], ciphertext)
Med denne koden kan jeg generere keystore-filen som ser slik ut:
{ "crypto" : { "cipher" : "aes-128-ctr", "cipherparams" : { "iv" : "83dbcc02d8ccb40e466191a123791e0e" }, "ciphertext" : "d172bf743a674da9cdad04534d56926ef8358534d458fffccd4e6ad2fbde479c", "kdf" : "scrypt", "kdfparams" : { "dklen" : 32, "n" : 262144, "r" : 1, "p" : 8, "salt" : "ab0c7876052600dd703518d6fc3fe8984592145b591fc8fb5c6d43190334ba19" }, "mac": "102aedfe8c308c735a76295f9908d9b7de40fb1c07f2f71e05de7a0b2f323a12" } }
Dette er standardfilen som lagrer millioner av dollar i Ethers.
Spørsmål:
- Er dette sikkert?
- Hvis ikke, hvorfor?
- Hvis ja, er også sikker kryptering av ren tekst eller JSON (ikke heksadesimalt format)?
- Er sikker å angi en mindre
kdfparams.n
?
Edit: For å avklare hvorfor jeg spør dette er fordi en annen person sa dette:
Dette er ikke sikkert i det hele tatt. Denne implementeringen inneholder mange grunnleggende feil. Et eksempel er å bruke en usikker tilfeldig tallgenerator, som ødelegger sikkerheten for krypteringen. Et annet bruker AES- 128-CTR uten autentisering.
Kommentarer
- Først definerer du » sikker » . Men etter en rimelig definisjon av det, med et passord i samme liga som ‘ 1234 ‘, og ren tekst som stor og overflødig, ingenting som er brukbar er sikker.
- Sikker når det gjelder veldig veldig vanskelig å bryte selv om det er en god kryptograf et me rediger for å avklare at det ville være et veldig sterkt passord.
- Nå definerer du » break » . Finner det det originale passordet? Gjetter du ren tekst fra en krypteringstekst? Gjetter noen av klarteksten fra mange krypteringstekniske deler som noen? Gjetter en klartekst fra mange krypteringstekster og alle andre klartekster? Kan vi få hjelp fra en kjørbar som kjører på samme maskin (og hvis ja, nøyaktig hvilken CPU med hvilken mikrokodeplaster? Brukes AES-NI?). Kan vi bruke EMI som sidekanal? En nøkkellogger, maskinvare eller sotfare? Faktisk, hva ‘ er implementeringen av randomBytes, som har innflytelse?
- Du kan ikke svare på dette spørsmålet ved å se på psuedocode. Den faktiske implementeringen kan inneholde alle slags sårbarheter og sidekanaler . Sikkerhet er heller ikke en binær, det ‘ er et spørsmål om hvor langt du ‘ er villig til å gå for å beskytte mot stadig mer eksotiske angrep .
- @ fgrieu beklager, det eneste spørsmålet jeg kan svare på er: nodejs.org / api / … @EllaRose Jeg antar at bibliotekene jeg bruker ikke har sårbarheter. Så min pseudokode ovenfor er bare en implementering av disse biblioteksfunksjonene, for eksempel randomBytes.
Svar
Det verste rent kryptografisk svakhet er passordet (1). De verste (og mye verre) praktiske svakhetene er sannsynligvis i implementeringen (6) (7), og de (4) (5) som kryptografer avviser som utenfor krypteringsområdet (spørsmålet er bare uttalt mål).
Kandidater for svakheter, fra kryptografisk (men fortsatt å vurdere) til implementering:
- Passordet: det er vanskelig å huske et passord med over 48 biter entropi ( at «omtrent tilsvarer et 16-sifret nummer, som 3141592653589793 eller 2718281828459045, og mer enn forutsatt av den obligatoriske XKCD ). Ved å bruke N = 262144 = 2 18 , r = 1, p = 8 = 2 3 , kjøper du minst 18 + 3 + 1 = 22 bits (se dette ) sammenlignet med en rett SHA-256 hash etterfulgt av AES-128, antar jeg omtrent 32 bits sterkere, og dermed kan nøkkelen være omtrent 80-bit bra, som er ikke helt ubrytelig av brute force, men fortsatt ganske sikker.
- AES-128: dette har en 128-bit nøkkel, ingen kjent rent kryptanalytisk angrip bedre enn brute force, og er dermed mye bedre enn passordet.
- CTR-modus: med AESs 128-biters blokk, ville den eneste måten key-stream gjenbruk kunne sparke inn være et dårlig tilfeldig tall generator for IV (se 6)
- Størrelsen på ren tekst kan enkelt utledes fra størrelsen på krypteringsteksten. Dette er eksplisitt ikke en teoretisk svakhet ved kryptering, siden lengden er ekskludert fra hva en kryptering skal skjule om klartekst. Det kan imidlertid være en praktisk svakhet. Si analyse av krypteringstekst konkluderer med at det er 17267095423 oktetter; og det eksisterer, et sted i påtalemyndigheten viser en fil med nøyaktig den størrelsen, som beviselig går foran søk og beslag av krypteringstekst, og som bare frihetsberøvelse er ulovlig.
- Manglende påvisning av (forsettlig eller utilsiktet) krypteringstekstendring, tilsvarende forutsigbar endring i klartekst: igjen er dette eksplisitt ikke en teoretisk svakhet ved kryptering, men kan tillate noen angrep hvis motstanderen kan endre krypteringstekst (eksempel: hvis klartekst er en kjørbar eller PDF med en kjent brøkdel, kan det tillate å endre hva den kjørbare filen gjør med noe, eller gjøre PDF-skjermen som om hva som helst). Autentisert kryptering ( AES-GCM ..) løser det.
- Tilfeldig tallgenerator: hvis dette er dårlig, eller verre blir mer eller mindre fast (obligatorisk XKCD og Dilbert som vender seg til virkeligheten altfor ofte), som vil gjøre det mulig å gjenopprette klartekst i mange scenarier, inkludert gjentatte ganger å kryptere forskjellige engelske tekst- eller e-postadresser med samme passord.
- En sidekanal, det er bredt snakke uforutsett eller ubegrenset lekkasje av informasjon i implementerings- eller brukssammenheng. Det er så mange:
- Gjenoppretting av passord fra passordinnehaveren ved å utnytte en prosessuell klang (passord på en postnote, hovedpassordliste), gummislange kryptanalyse (obligatorisk XKCD ), juridiske varianter (som involverer bruk av uttrykk på forakt for retten ), bestikkelser, kjemisk impregnering ..
- Gjenoppretting av passord med shoulder surfing , key logger (programvare eller maskinvare), kamera, mikrofon (en god lydopptak av lyden av taster når du skriver inn et passord lekker mye informasjon om passordet, spesielt når det er korrelert med kjent tastaturoppføring av samme operatør under samme forhold) ..
- Rett kompromiss med ren tekst som vist på skjermen (med TEMPEST varianter av det), skrives ut mens de sendes til en skriver eller fjerntilgang via et nettverk, eller bare «midlertidig» lagres ..
- Rett kompromiss med operativsystemet til maskinen ine gjør kryptering eller dekryptering (å få midlertidig root-tilgang er nok, betyr i 7.7 er spill for angriperen.).
- Kryptanalytisk sidekanal på avstand, inkludert DPA og den elektromagnetiske varianten DEMA, og hypotetisk timing hvis maskinen gjør kryptering / dekryptering får tilgang til et nettverk og ikke bruker AES-instruksjoner .
- Kryptanalytisk sidekanal fra en prosess som kjører på samme maskinvare (inkludert en annen VM), inkludert cache-basert målretting for AES når du ikke bruker AES instruksjoner, eller mer generelle (Meltdown, Spectre) som er raseri i disse dager.
- Utnyttelse av forskjellige programvarefeil; det er enormt.
Kommentarer
- Det vil være mer nyttig hvis jeg har passordet før kryptering? Som å bruke sha eller md5?
key = scrypt(sha(MY_PASSWORD), kdfparams)
- @EnZo: Hashing-passord før inntasting i scrypt endrer ikke mye vanskeligheten ved å angripe passordet ( For å forbedre det trenger man et bedre passord, en bedre parametrisering for scrypt, eller et bedre passordbasert nøkkelavledningsskjema (Argon? Balloon?)
Svar
Det viktigste sikkerhetselementet som kan angripes i ordningen ovenfor er – selvfølgelig – passordet. Nå er saltet viktig for å unngå regnbuebordangrep, men ellers legger ikke til så mye sikkerhet. Hvis salt og passord er rimelig unike, er nøkkelen også unik. I så fall er IV ikke det viktig.
Så selv om det er dårlig å bruke en usikker tilfeldig tallgenerator, vil den sannsynligvis ikke ha så mye innflytelse på den praktiske sikkerheten. , indikerer det at dårlig praksis faktisk ble distribuert. Hva om passordfrasen ble generert ved hjelp av den samme usikre tilfeldige generatoren? Hva om andre implementeringsfeil dukker opp?
Bruk av ikke-autentisert krypteringstekst er mer et problem, da det ville tillate motstanderen å endre klartekst for hver bit. Motstanderen kan ganske enkelt invertere en hvilken som helst krypteringstekstbit, og klartekstbiten på samme posisjon vil også snu. Dette vil bety at du vil få en feil eller et problem når du bruker lommeboken. Konfidensialiteten til lommebokens innhold går sannsynligvis ikke tapt, men bruk av autentisert kryptering er absolutt beste praksis.
Kommentarer
- Takk! Kan du forklare knapt hvordan oppnå autentisert ciphertext med denne modusen? Jeg skal redigere th eksemplene ovenfor fordi jeg tror er relatert til den opprinnelige mac-egenskapen som jeg fjernet fra den originale keystore-filen.
- CTR-modus er den underliggende modusen for CCM, GCM, EAX, SIV og en hel haug med andre autentiserte cifre. Imidlertid kan en kombinasjon av CTR-modus med en (H) MAC absolutt også være sikker.Begge produserer en autentiseringsmerke med omtrent samme størrelse / sikkerhet. CCM og EAX er litt mer enn spesifikke kombinasjoner av CTR og en MAC der samme nøkkel kan brukes til kryptering og MAC.
- Merk at jeg ‘ ve svarte på dette spørsmålet etter beste evne ved å bruke generell kunnskap om krypter (ikke så mye Ethereum). Ella Rose har rett i at vi ikke kan konkludere med sikkerheten til systemet fra informasjonen som er gitt oss i spørsmålet. Så jeg ‘ har bare fokusert på bruk av CTR.
- Vel, det tilfeldige ser ut til å stole – til slutt – på systemet tilfeldig. Ofte er system tilfeldige kilder relativt sikre, og begrepet CSPRNG er faktisk nevnt av kilden. Så påstanden om at det ikke er tilfeldig er galt, med mindre systemet tilfeldig ikke er godt implementert eller sådd.
- Å lage en MAC fra SHA-3 direkte anbefales ikke, KMAC burde vært brukt i stedet (det sannsynligvis ble ganske enkelt ikke ‘ t spesifisert ennå på den tiden). Men jeg kan ikke tenke meg noen situasjon der bruk av sammenkobling av nøkkel og krypteringstekst noen gang vil utgjøre et problem.
Legg igjen en kommentar