Spørsmål:
Oppbevarer noen ikke salter?
jazzpi
2016-07-15 14:33:58 UTC
view on stackexchange narkive permalink

Vi snakket om passordhashing og salting i timen i dag. Professoren vår hadde en veldig annen forståelse av bruken av salter fra min og sa at du kanskje ikke lagrer saltet i det hele tatt, og bare sjekker hvert påloggingsforsøk med alle mulige salter og godkjenner hvis en stemmer overens.

Jeg ser egentlig ikke noe poeng overhodet i dette siden tjenesten min nå er mye mer sårbar for brute force-angrep (send ett passord, server sjekker mange), men jeg antar at det er litt sikrere for rene ordbokangrep mot det hashede passordet.

Så er det noen brukstilfeller der folk faktisk ville gjort dette?

Med tanke på lengden på saltet, kan dette resultere i en veldig langvarig (upraktisk) påloggingsoperasjon hvis du må prøve alle mulige saltverdier.Dette vil resultere i bruk av et mindre saltområde for brukervennlighet.Jeg tror det kan føre til dårligere sikkerhet enn å bruke en gyldig saltverdi og lagre den.Se også https://stackoverflow.com/questions/184112/what-is-the-optimal-length-for-user-password-salt for diskusjon om ideell saltlengde, noe som antyder mellom 16 og 256 bits.
Helt sikkert.Vi brukte et 12-biters salt, så bare 4096 prøver, men lengre salter betyr ikke bare lengre påloggingstid, men også dårligere sikkerhet ettersom serveren prøver å autentisere deg med 2 ^ n passord i stedet for bare ett.
Akkurat hva er denne fyren professor i?Tannpleie?
Merk at en god kryptografisk hash er * treg * av design, så rekkevidden av mulige saltverdier blir for stor veldig snart.
Dette er grunnen til at folk bør lære av Stack Exchange i stedet for professorer.:-)
Hvis påloggingsprosessen din innebærer brute tvang ... gjør du ** det galt **.Den eneste forskjellen mellom å ikke bruke salt (forferdelig idé) og prøve alt saltet (forferdelig idé) er at man kommer til å bli mye mer beregningsdyktig (forbanna brukerne).
AFAIK lagring av salt er en dårlig idé hvis databasen din er på et fuktig sted - fører til korrosjon (se eksempel på korrodert tabell i Second Life [her] (https://slm-assets0.secondlife.com/assets/1123356/lysboks / 65b45b42685a44ca64e556f353d48e4e.jpg? 1277194741)).
Jeg antok at dette var på Cooking.SE da jeg så det i HNQ før jeg la merke til det lille "InfoSec" -ikonet: D
@oɔɯǝɹ: En generell kryptografisk hashfunksjon skal være _fast_ av design.Derfor bør ikke generelle hashfunksjoner brukes til passordhashing!
AiliiovuncCMT Haha, jeg også.
Professoren din bør lese: http://stackoverflow.com/questions/1645161/salt-generation-and-open-source-software/1645190#1645190
@CaffeineAddiction: "Den eneste forskjellen mellom å ikke bruke salt (forferdelig idé) og prøve alt saltet (forferdelig idé) er at man kommer til å bli mye mer beregningsdyktig (forbanna brukerne)." Å prøve alle saltene er faktisk enda verre, fordi du nå (i tilfelle av jazzpi) er 4096 ganger så sannsynlig å støte på en hash-kollisjon.Å ha et ekstremt sikkert passord er irrelevant hvis samme hash genereres av et ordbokord med et annet salt.Glem brute-force basert på kjente data;Dette gjør faktisk søknaden din mindre sikker uten kjente data i det hele tatt.
litt av emnet anbefaling.Først må du bekrefte at det du skrev her, faktisk er det professoren sa.Hvis det er det, foreslår jeg at du nærmer deg dekanen på skolen din og ser om overføring / refusjon.Denne personen er ikke kvalifisert til å undervise i denne klassen.
Kan professoren din ganske enkelt ha uttalt at det er mulig å ikke lagre salt, men ikke sagt at det er en god idé?
@Shadur Sannsynligvis komedie.
Er det mulig det er noe forvirring her med å bruke pepper?- dvs. et salt som applikasjonen kjenner til, men som ikke er lagret med passordene i databasen?
@Jedi, gutt Jeg tok virkelig lang tid å få det.:) Jeg overså det helt først.
Professoren din høres ut som om hun ikke har peiling på hva de snakker om.Det hadde vært morsomt hvis du hadde spurt om hva han syntes om å legge til koffein før du hash.
Ni svar:
Gudradain
2016-07-15 17:29:34 UTC
view on stackexchange narkive permalink

Å ikke lagre saltet er dårlig råd.

Hovedformålet med et salt er at hvert brukerpassord må angripes individuelt.

Hvis du ikke lagrer saltet, , som du sa, må du prøve hver eneste saltkombinasjon for å validere passordet. Hvis du trenger å sjekke hver eneste saltkombinasjon, betyr dette at saltet ikke kan være for langt (du nevnte 12 biter i en kommentar). Hvis saltet ikke er langt, betyr det at saltet blir gjentatt for mange brukere. Hvis det gjentas for mange brukere, betyr det at angriperen vil kunne angripe mange brukere samtidig, noe som vil spare angriperens tid.

Ved å gjøre det, beseirer du nesten helt hensikten med å bruke en salt.

ville det ikke også åpne for muligheten for flere kollisjoner og mye mer falske positive?
@CaffeineAddiction Kanskje.For eksempel kan følgende skje: hash (feil salt + feil passord) = hash (riktig salt + riktig passord).Men det er ikke en praktisk måte å angripe på, da det er ganske vanskelig å skape kollisjon i hash-funksjonen.
@CaffeineAddiction: ikke sannsynlig.Forutsatt at SHA-256 og et 32-biters salt har oddsen for en kollisjon med eksisterende hash (aka, 2. forhåndsbilde) gått fra 2 ^ -256 til 2 ^ -224.Større, men likevel uendelig liten i den store ordningen.
@David hvordan?hash-funksjoner kan modelleres som tilfeldige orakler hvor to innganger fører til uavhengige utganger, så jeg tror ikke sannsynligheten endres i det hele tatt (med mindre du putter inngangen din til en fast lengde)
@Thomas: ja, men hvis systemet prøver 2 ^ 32 salter, forblir sannsynligheten for hver kollisjon den samme, men den totale sannsynligheten for * enhver * kollisjon bør reduseres med 2 ^ 32.
@Thomas Du har en hash generert fra ` `.Hver gang brukeren skriver inn passordet sitt, sjekker serveren passordet ditt kombinert med 2 ^ 32 mulige salter.Hvis du for eksempel brukte en 32-biters hash, ville det bety at ditt virkelige passord ville fungere, men det ville også være en utmerket sjanse for at hasjen ville matche en av de 2 ^ 32 som serveren prøvde hvis du skrev inn _any_ password.
@David Du har glemt leksjonen om bursdagsparadokset.Tilfeldige prosesser kolliderer mye oftere enn det.Oddsen går faktisk fra 2 ^ -256 til 2 ^ -193.Og det er med en enkelt bruker.Det fortsetter å klatre ganske raskt når du legger til brukere.Ender likevel ganske liten.
Husk at falske positive også vinner for angriperen.Hvis de finner et annet passord som fungerer med et annet salt, kan de bruke det.Siden alle salter er prøvd, kan de fremdeles autentisere.
@AaronDufour, bursdagsparadokset gjelder bare når du leter etter kollisjoner i datasettet.Dette er egentlig mer et preimage-angrep - de ønsker å matche en fast verdi.
amccormack
2016-07-15 19:14:41 UTC
view on stackexchange narkive permalink

Et "hemmelig" salt er kjent som en pepper.

Fra Wikipedia:

En pepper kan legges til et passord i tillegg til en saltverdi. En pepper utfører en lignende rolle som et salt, men mens et salt ofte lagres ved siden av verdien som blir hash, for at noe skal defineres som en pepper, bør det oppfylle et av følgende kriterier som definerer det en mer nøye skjult 'hemmelighet' enn saltverdien:

  • Pepperen holdes atskilt fra verdien som skal hashes
  • Pepperen genereres tilfeldig for hver verdi som skal hasles (innenfor et begrenset sett med verdier), og lagres aldri. Når data testes mot en hash-verdi for en kamp, ​​gjøres dette ved å gjenta gjennom settet med verdier som er gyldige for paprikaen, og hver og en blir lagt til i dataene som skal testes (vanligvis ved å suffiksere dem til dataene), før den kryptografiske hashfunksjonen kjøres på den kombinerte verdien.

Fordelen med en pepper er at en angriper nå må gjette opp til antall mulige permutasjoner av en pepperverdi for hver enkelt tekstoppføring.

Paprika øker angrepslengden for en bestemt hash, mens et salt ikke gjør det.

Husk at et salt er en effektiv demping for forhåndsberegnet hasj, og det gir en angriper bruker lang tid på å angripe et sett med hashes. Imidlertid, hvis bare en hash er bekymringsfull, og ingen forhåndsberegnet hasj skal brukes, øker ikke salt angrepslengden. En paprika tvinger imidlertid angriperen til å bruke flere gjetninger for hvert enkeltpassord, selv for en enkelt hash.

På denne måten ligner en pepper på nøkkelstrekning.

De fleste implementeringer foretrekker nøkkelstrekking fremfor paprika.

Min personlige observasjon er at de fleste implementeringer foretrekker nøkkelstrekking fremfor paprika. Jeg har ikke en referanse til dette, så leserne kan gi støtte eller avvikende referanser i kommentarene. Folk pleier å foretrekke nøkkelstrekking fordi det har en kjent og forventet ytelseskostnad og sikkerhetsfordel. For å beregne den Nte runden av en hash, må N-hash beregnes. Med en pepper kan imidlertid bare forventet antall forsøk beregnes. Vurder en 1 byte pepper, angriperen trenger 256 gjetninger for å gjette alle mulige kombinasjoner, men forventet verdi er 128, og angriperen kan (i gjennomsnitt 1/256 ganger) gjette verdien på første forsøk.

Peppers og Key Stretching kan virke mot hverandre.

Key stretching er effektiv fordi du kan angi antall runder basert på hvor lang tid du vil beregne en hash til ta. Si at du vil at en enkelt sjekk skal ta et halvt sekund på gjeldende maskinvare, du bare øker rundene til det skjer.

Med en pepper, fordi du trenger å gjette flere verdier for hvert passord, må størrelsen på en pepper være omvendt relatert til antall runder for å holde beregningstiden konstant.

Praktiske råd om hasjimplementeringer

Det beste rådet for implementering av passord / hash er å bruke kjente metoder og testede biblioteker. Du bør bruke bcrypt eller pbkdf2 med et unikt salt og mange runder. Disse algoritmene har en tendens til å ha kjente implementeringer på mange språk og rammer. Hvis du tilfeldigvis finner et velkjent og testet bibliotek som inneholder paprika, i tillegg til salter og strekk i nøklene, kan det lønne deg å bruke den, men den ekstra fordelen oppveier ofte ytelseskostnadene.

ville det ikke også åpne for muligheten for flere kollisjoner og mye mer falske positive?
@CaffeineAddiction Jeg må innrømme at jeg ikke kjenner matematikken bak disse hashingalgoritmene godt nok til å bevise at bruk av pepper ville øke eller redusere kollisjoner.Det er et godt spørsmål, og du kan få et bedre svar på [crypto.se] (http://crypto.stackexchange.com/).Min tanke er at det sannsynligvis ikke ville øke kollisjonene til noen betydelig mengde hvis du 1) brukte en tilstrekkelig stor hashingalgoritme som SHA-256 eller høyere og 2) brukte en mindre pepperstørrelse (mindre enn 2 byte).
Paprika er fortsatt lagret, men (ikke i vanlig visning, men lagret)
@WoJ Det andre punktet i wikipedia-artikkelen påpeker at paprika ikke kan lagres.Jeg prøvde å finne en bedre referanse enn wikipedia som beskriver en pepper, men klarte ikke å finne en.Hvis du vet om en referanse for å foreslå at paprika er lagret, vil jeg gjerne se på den.
@amccormack: Jeg leste ikke Wikipedia-artikkelen, beklager.Når det er sagt, har jeg aldri sett en slik implementering av en pepper (etter å ha vært vitne til en begrenset mengde av dem).Dette ville være et mareritt å sjekke om hashingalgoritmen er riktig (langsom, multirunde).
@Woj, Jeg er enig, det vil gjøre det til et mareritt å teste og sannsynligvis føre til at implementøren reduserer antall runder for en hvilken som helst nøkkelstrekning.Å lagre saltet (eller beregne det deterministisk) vil redusere de negative effektene på nøkkelstrekning, og kan redusere noen tilfeller der bare hash + saltverdiene lekker.
Hvordan jeg alltid har hørt "pepper" definert er et salt som lagres per applikasjon i koden, i stedet for per bruker i DB.
Verdt å merke seg at en pepper fortsatt er lagret, bare ikke nødvendigvis i databasen.OP ser ut til å snakke om et tilfelle der saltet ikke lagres i det hele tatt, og applikasjonen i det vesentlige tvinger saltet hver gang en pålogging blir forsøkt ...
@Ajedi32 Takk for at du påpekte dette.Andre har også påpekt det, men jeg kan ikke finne en endelig kilde som gjør dette kravet.Hvis du kunne vise meg til en, vil jeg sette pris på det.
@amccormack Jeg er ikke sikker på en endelig kilde, men stort sett hver artikkel eller innlegg jeg har lest om paprika ser ut til å dele denne definisjonen.http://security.stackexchange.com/q/3272/29865 http://stackoverflow.com/q/16891729/1157054 https://blog.filippo.io/salt-and-pepper/ Og dessuten lagrer ikkepepper ville være ganske ubrukelig - det ville i utgangspunktet bare være en veldig hacky måte å øke arbeidsfaktoren til hash-funksjonen din.
Referanser angående definisjonen av ordet "pepper" er diskutert på crypto.SE: [Er det en eksisterende autoritativ definisjon av det kryptografiske begrepet "pepper"?] (Https://crypto.stackexchange.com/q/24698/23581), [Definisjon av "pepper" i hashfunksjoner] (https://crypto.stackexchange.com/q/20578/23581).Jeg setter pris på svaret gitt i sistnevnte, der paprika for det meste er definert som en supplerende hemmelighet ukjent for angriperen, og man ville egentlig ikke brydd seg om denne hemmeligheten er hardkodet / kakulert / etc.så lenge det forblir ukjent for angriperen.
@Ajedi32, da jeg spurte det spørsmålet, ble begrepet "pepper" ikke brukt mye i det hele tatt, men jeg oppfant ikke begrepet, jeg leste det et sted i papir noen år tidligere.
Jeg trodde en pepper var et salt per applikasjon som ble lagret utenfor databasen.
En interessant ting for paprika er at testing av verdiene for en pepper kan gjøres parallelt, men å bruke flere runder med hasj må gjøres sekvensielt.
bør også nevne scrypt (https://en.wikipedia.org/wiki/Scrypt) som et rimelig alternativ.
* "det kan være verdt å bruke den, men den ekstra fordelen oppveier ofte ytelseskostnadene." * Er ordet ** "men" ** en skrivefeil i den setningen, eller misforstår jeg noe?Det ser ut til at det skal stå "fordi".
Bryan Field
2016-07-15 18:37:58 UTC
view on stackexchange narkive permalink

Bakgrunn: Du bør bruke en langsom passordhash. (dvs. bcrypt) Med 'treg' mener jeg beregningsdyr, tar mer enn 100 ms (på maskinvaren) med DoS-beskyttelse * for å teste et enkelt passord. Dette er for å øke prosessorkraften som trengs (på angriperens maskinvare) for å finne passordet med brute force, hvis hasjen blir stjålet.

Per bruker unikt salt anbefales på det sterkeste. (i tilfelle bcrypt genereres det automatisk) Salt skal være svært unikt (dvs. langt & tilfeldig), men ikke hemmelig . Å bruke unikt salt betyr at en angriper må kjøre en egen brute force Job for hver bruker .

Hvis det ikke var noe salt, kunne angriperen umiddelbart bruke en Rainbow Table og ingen brute force i det hele tatt.

Hvis du bare bruker et "delt salt", kan en angriper knekke passord for alle brukere med en single brute tving Job. (ikke så raskt som et regnbuebord, men likevel mye lettere enn en egen brute force Job for hver enkelt)


Svar: Hvis du ikke skulle "lagre" salt ('brute force the hash at runtime' som professoren din antyder)

  • de mulige saltene må være veldig få
  • hashen må være ganske mye raskere

Dette ville fullstendig beseire formålet med Salt, og ødelegger sterkt fordelen med en langsom hash. Det er en stor designfeil fra professoren din. I utgangspunktet rullerer han sitt eget passordlagringsskjema, der han skal bruke den velprøvde bcrypt -algoritmen (eller scrypt eller PBKDF2) slik det var ment å bli brukt .


* Som @Navin kommenterte, ville dette være en potensiell DoS-angrepsvektor. En løsning er å begrense antall timeforsøk per IP og per brukernavn. Det er også mulig at du reduserer tregheten til hasjen din til bare å ta 10 ms. Dette er ikke så godt som 100 ms fra et "stjålet hash" -perspektiv, men fortsatt mye bedre enn "mikrosekunder".

"Hvis det ikke var salt, kunne angriperen tvinge hashen til alle brukere i en enkelt brute force Job. (Sparer mye tid på denne måten)" Eller bare velg fra databasen for hver bruker med MD5-hash `5f4dcc3b5aa765d61d8327deb882cf99`, som tilsvarer passordet "passord".Det er også en måte å beskytte brukerne mot seg selv.
Bruk aldri MD5 til å lagre passord!Bruk en Slow Hash i stedet.Men ja, jeg ser poenget ditt.Jeg har oppdatert svaret på referanse til Rainbow Tables som du refererer til.
Ekte.I den virkelige verden bør du bruke et riktig passordhash-bibliotek på hvilket språk du jobber med, som vanligvis inkluderer saltet i hashstrengen, samt å beskytte mot tidsangrep, noe som gjør hele diskusjonen.Men ja, MD5 er ikke for passord.
Steve Sether
2016-07-15 18:37:46 UTC
view on stackexchange narkive permalink

Professoren din stemmer ikke. Poenget med et salt er å øke entropien til de hashede passordene for å forhindre enhver form for pre-beregningsangrep på dem, samt forhindre at det samme passordet fra forskjellige brukere har samme hashverdien.

Å kunne prøve alle mulige saltverdier betyr at du må ha en veldig liten mengde entropi i saltet, noe som betyr at en forhåndsberegning via regnbuetabeller er mulig.

Cort Ammon
2016-07-16 03:07:46 UTC
view on stackexchange narkive permalink

Du kan bruke saltet på denne måten. Det ville være en slags hasj-stretching prosess. Vanligvis strekker du en hasj ved å gjenta algoritmen flere tusen ganger, noe som reduserer angripere og brukere 1000 ganger, men brukere har vanligvis ikke noe imot nedgangen. Å bruke et salt på denne måten vil ha en effekt av å utføre en hash-strekkingsalgoritme ved å måtte gjenta den for mange ukjente hasjer.

Dette er imidlertid en ekstremt uvanlig tilnærming. De tradisjonelle måtene å gjøre salt på, gjør det saltene skal gjøre langt bedre (gjør det slik at ingen kan forhåndsberegne en passordtabell). De tradisjonelle måtene å gjøre hasj-stretching gjør det som hasj-stretching skal gjøre langt bedre (gjør det slik at det tar lengre tid for angripere å beregne passord). Å bruke et salt på denne måten er en slags musking av de to sammen. Resultatet er en slags slags arbeid, men de renere tilnærmingene gjør begge løsningene langt bedre enn den stygge misforståelsen av teknikker.

supercat
2016-07-15 20:52:19 UTC
view on stackexchange narkive permalink

I stedet for å tenke på salt i termer av tøffing, liker jeg å tenke på det når det gjelder å si at det gjør det umulig å fortelle noe om et passord, inkludert dets forhold til andre passord, ved å se på det. Hvis systemet ikke bruker salting, vil det å se på to brukeres hashed-passord indikere om deres virkelige passord samsvarte. Hvis et system saltes bare med brukernavn, men ikke noe tilfeldig, tidsspesifikt eller systemspesifikt, vil det å se på brukerens hashpassord på to maskiner som bruker samme tilnærming, indikere om brukerens passord på de to maskinene samsvarer. Hvis systemet saltes ved hjelp av system-ID og brukernavn, men ikke noe tilfeldig eller tidsspesifikt, kan noen med tilgang til to forskjellige passordhasher av samme bruker fortelle om de tilknyttede passordene stemmer overens.

Effekten av tilfeldig salting er å gjøre det slik at det ikke er sannsynlig at to hashes med samme passord vil matche, selv om de involverer samme bruker på samme system. Mens man kunne oppnå en lignende effekt uten å lagre saltene hvis påloggingsforsøk skulle tvinge dem, vil en slik tilnærming begrense den praktiske lengden på salt man kan bruke, og dermed øke sannsynligheten for at passord som brukes i to sammenhenger samme salt og dermed være gjenkjennelig som samsvarende.

Jason Goemaat
2016-07-18 07:24:21 UTC
view on stackexchange narkive permalink

Hva gir salting deg? Angripere har forhåndsberegnede databaser med hashverdier for passord, vanlige og ikke. Hvis de fanger databasen din og har hash av passordene for hver bruker, er det enkelt å sjekke hashene deres mot disse verdiene uten salt.

Med et tilfeldig salt som lagres sammen med passordet, er dette sinnsykt rask metode er ikke lenger mulig. Men hvis angriperen har salt så vel som hasj, er det fortsatt mulig å bruke ordbokangrep for svake passord eller brute-forcing for korte. Alt angriperen trenger å gjøre er å bruke saltet og prøve forskjellige passord ved hjelp av en ordbok eller brute-force-angrep.

La oss si at når passordet endres, har du det med en tilfeldig 12-biters verdi som ikke er lagres ikke sammen med saltet. Så hver gang du sjekker passordet, må du prøve alle 4096 verdiene. På datamaskinen min tar dette omtrent 3,5 ms, så 284 passord kan sjekkes hvert sekund. Litt mer CPU-bruk på serveren når noen logger på, men for noen som prøver ordbok eller brute-force-angrep, gjorde du jobben deres mye vanskeligere, selv om de har hasj og salt.

Ville du ikke gjøre jobben deres mye enklere, men hvis de * ikke * hadde hasj og salt?Siden nå sjekker serveren 4096 verdier hvis jeg bare overfører en, og gir dermed mye mer falske positive.Dette var begrunnelsen som profen min brukte, men det virker ikke veldig nyttig for meg, så jeg vil gjerne se noen som faktisk bruker denne tilnærmingen i ekte kode.
Hvis de ikke har hasjen, er det ikke noe poeng, er det?Salting beskytter mot mennesker som har hasj.Hvis bruk av et 12-bits nummer blir populært, kan angripere opprette databaser med forhåndsberegnede hashes for hvert av disse tallene og vanlige / uvanlige passord for å gjøre jobben enklere.Selv om du genererer 4096 tilfeldige salter og bruker dem på nytt i stedet for et enkelt 12-biters tall, kan de fokusere på en saltverdi og muligens kompromittere mange brukere hvis du har millioner.
Ja, salting beskytter mot mennesker som har hasj.Normalt gjør det deg ikke * mer sårbar * mot mennesker som ikke har hasj, men det gjør det med denne varianten.
Hvordan gjør det deg * mer * sårbar?
For hvis du sender ett passord til serveren, må det sjekke det med alle 4096 mulige salter, og dermed gi deg et mye høyere potensial for falske positive.
Høres ut som du snakker om en kollisjon i hashing-algoritmen med å prøve tilfeldige passord.Hvis du har en 256-biters hash, er disse 4096 forsøkene nesten meningsløse når du prøver å produsere en kollisjon.Årsaken til at du kan tøffe kraften _ når du har hasjen, er fordi du kan kjøre millioner eller milliarder sjekker hvert sekund på din (e) lokale datamaskin (er).Hvis nettstedet ditt tillater folk å prøve millioner av passord uten å låse dem ut, (A) gjør du det galt, og (B) de må ha en helerask forbindelse til serverne dine og (C) du bør legge merke til at serverens CPU-er erfestet.
Kaz
2016-07-16 04:08:03 UTC
view on stackexchange narkive permalink

Det ser ut til å være noen fordeler med ideen om ikke å lagre noe kontrollert antall biter av saltet, som er uavhengig konfigurert og uavhengig av saltstørrelsen.

Anta at vi har 32-bits salter. Vi kunne velge å lagre bare 22 bits, og brute-force gjennom de resterende 10 når vi autentiserer. Effekten av dette er som om flere runder ble lagt til hashing-funksjonen. Ikke så mange som legitim autentisering påvirkes, men nok til å øke vanskeligheten med brute-force cracking.

Neste år blir maskiner raskere. Så vi sveiper gjennom passorddatabasen og slår av litt fra hvert salt: nå lagrer vi bare 21 biter, og må brute kraft gjennom 11.

Det er som om vi doblet hasjstyrken, men uten forstyrrelse av å erstatte algoritmen og få brukerne til å hash passordene sine på nytt (som er opp til den vanlige policyen for utløp av passord).

Denne "progressive salt-kassering" -tilnærmingen kan forlenge levetiden for hashing-funksjoner.

Imidlertid reduserer denne typen tilnærminger den legitime autentiseringen og brute force-angrepet med en like faktor, så i beste fall gir de et mindre sikkerhetslag. Vårt fokus bør plasseres i forbedringer som bare gir en konstant mengde ekstra tid til legitim bruk, samtidig som vanskeligheten med å knekke multipliseres. En forbedring som har denne egenskapen øker selvfølgelig mengden entropi i passordfrasen! Hver bit av entropi som legges til passordet, tilfører de legitime brukerne en konstant kostnad, men dobler den brutale kraften. Et passord med lengden N tar O (N) til hash (og type), men O (2 ** N) for brute force. Å legge til 12 biter entropi i et passord slår å skjule 12 biter salt.

"Denne" progressive saltkasserende "tilnærmingen kan forlenge levetiden for hashfunksjoner."Det er hashing-funksjoner med konfigurerbar hash-størrelse (et eksempel er Keccak), og å bruke dem som den underliggende primitive til en KDF virker som en mye bedre idé for meg.Du kan fortsatt bruke denne teknikken for å forlenge levetiden for updaterte passordhasher (med en oppdatering vil den nye hashen ha den sist konfigurerte hashstørrelsen), men om det er en god idé er også tvilsomt.Du ser brukerens vanlige passord på hver pålogging (unntatt f.eks. SRP), slik at du kan oppdatere hash.
@Rhymoid Du trenger skrivetillatelse til oppføringen av passorddatabasen for å oppdatere hashen på autentiseringstidspunktet (når passordet kort er kjent for systemet).For eksempel, på klassisk Unix, kunne alle lese `/ etc / passwd` og bruke hashene for autentisering, men bare et` setuid`-verktøy som `/ bin / passwd` kunne oppdatere dem.(Generelt sett kan vi se for oss et system der oppdatering av en autentiseringsdatabaseoppføring er et eget privilegium fra å bruke den til autentisering, selv om begge er spesielle privilegier som bare tildeles visse programmer.)
coteyr
2016-07-21 18:54:13 UTC
view on stackexchange narkive permalink

Ut i naturen har vi en brukertabell. En brukertabell er vanligvis

  ID | brukernavn | salt | kryptert_passord | horridly_insecure_reset_key ===================================================== ============================ 1 | bruker1 | foo | 09b6d39aa22fcb8698687e1af09a3af9 | NULL2 | bruker2 | bar | 6c07c60f4b02c644ea1037575eb40005 | NULL3 | bruker3 | baz | 09b6d39aa22fcb8698687e1af09a3af9 | reset  

Da vil en autentiseringsmetode se ut som

  def authenticate (user, password) u = User.find (user: user) return u. encrypted_password == kryptere (passord + u.salt) slutt  

Ved å ha salt per bruker sørger det for at selv om passordet for bruker1 er kjent, kan du ikke finne ut passordet for bruker2 eller bruker3 uten salt.

Du sørger også for at du ikke kan finne ut saltet ved å ha et sett med krypterte passord og prøve noen få krypterte passord.

I utgangspunktet, alle angrep mot en brukeren må startes fra bunnen av.

Selv om en angriper har en liste over brukere og salter, må de fremdeles knekke mot hver bruker for å se om de har et passord. Hvis du hadde en saltsamling, eller ett statisk salt, kunne jeg vite at bruker1s passord er passord og så bare finne alle de krypterte passordene som samsvarer. Så denne måten reduserer dem i det minste litt mer.

Nå når vi ser på salter, vil vi redusere saltbruk. To identiske salter vil gjøre det lettere for angripere. Hvis to personer deler det samme saltet og det samme passordet, bryter den ene brukeren den andre.

Så la oss si at vi bare bruker disse tre saltene. Og vi har 3000 brukere. det betyr at 1000 mennesker har samme salt. Hvis 1% av dem har passordet "passord", kan disse menneskene knekkes samtidig. 10 kontoer blir hacket samtidig. Fordi vi kjenner de tre saltene. Det er en veldig enkel strekning for å få angrepet 30 personer samtidig.

Nå, hvis hvert salt er unikt. Og vi vet at bruker1 passord er passord, det gjør ikke noe bra for deg. Du har fortsatt bare knekt 1 bruker. Du må fremdeles gjøre "gjør passord + salt = kryptert passord" for alle andre 2999 brukere.

En veldig viktig merknad.

Sikkerhet gjennom uklarhet er ikke sikkerhet. Det betyr ikke at du bør legge ut brukerbordet ditt på google fordi det er dumt. Men når du måler sikkerhet, bør du anta at angriperen har alt. Du kan ikke si, "Men de vet ikke applikasjonssaltet, fordi de ikke har kildekoden". Fordi de kunne. Betyr ikke å gi bort saltene dine, det betyr bare at det ikke er reell sikkerhet. Anta at de har brukernavnet og saltet, og prøv å gjøre det vanskeligere for dem å få passordet.

SUPER VIKTIG MERKNAD

kode og tabell som brukes her er omtrent 9 000 ganger for enkle til reell bruk. Passordet er ikke kryptert, saltene er for korte, metoden er litt forenklet, kort sagt å gjøre noe som dette i produksjonen er ikke noe som skal betraktes som sikkert. Jeg valgte disse sakene der for demonstrasjonspoenget, ikke fordi de er sikre.



Denne spørsmålet ble automatisk oversatt fra engelsk.Det opprinnelige innholdet er tilgjengelig på stackexchange, som vi takker for cc by-sa 3.0-lisensen den distribueres under.
Loading...