Puncte:4

De ce nu este sigură o funcție hash prea rapidă?

drapel cn

Înțeleg de ce avem nevoie ca funcțiile hash să fie suficient de rapide pentru procesare, dar suficient de lente pentru securitate. Dar nu înțeleg de ce o funcție hash foarte rapidă poate provoca o coliziune. Bănuiala mea este că o funcție hash foarte rapidă produce un număr mic de biți ca ieșire, astfel încât aceasta înseamnă o probabilitate mai mare de coliziune. M-ar putea corecta cineva?

kelalaka avatar
drapel in
De unde ați găsit „o funcție hash foarte rapidă poate provoca o coliziune.”? Despre ce fel de funcție hash vorbești? Ce fel de aplicație considerați? Știți că algoritmii de hash de parole nu au nevoie de rezistență la coliziune?... Ce măsură folosiți prea repede?
Seif Ashraf avatar
drapel cn
verificați asta: https://youtu.be/b4b8ktEV4Bg?t=279
kelalaka avatar
drapel in
Văd, pe baza argumentelor videoclipului, [am scris un răspuns la ele](https://crypto.stackexchange.com/a/95430/18298)
Puncte:22
drapel ng

În majoritatea aplicațiilor, este de dorit ca o funcție de hash să fie rapidă și nu ar fi o problemă dacă ar fi ultra rapidă (să zicem, la fel de rapidă pe cât de rapidă poate ajunge la un procesor) dacă asta nu este în detrimentul securității. Aceasta include utilizarea în semnătură, umplutură de criptare, construcția de cifruri bloc.

În aplicarea face întinderea cheii, inclusiv controlul accesului prin parolă sau derivând o cheie de criptare simetrică dintr-o frază de acces, este de dorit să existe funcții hash lente. Mai precis, un parametru ar trebui să controleze durata, iar costul de calcul per hash nu ar trebui să fie mult mai mic pentru adversari decât pentru utilizatorii legitimi¹. În astfel de aplicații, când reușim să încetinim hash-ul cu un factor de $c$ pentru adversari, obținem echivalentul $\log_2(c)$ biți suplimentari pe entropie în introducerea parolei/frazei de acces. De exemplu, când creștem costul cu o mie (pentru $c\aproximativ 2^{10}$ ), în ceea ce privește atacurile de spargere a parolelor, obținem echivalentul de securitate al adăugării de trei cifre zecimale aleatorii la parolă, fără a fi nevoie să le amintim.

Această considerație a vitezei este în mare măsură diferită de rezistența la coliziuni (adică de imposibilitatea practică de a afișa două mesaje cu același hash). Pentru ca rezistența la ciocniri să mențină, este necesar (nu suficient)

  • Că hash-ul este suficient de larg, deoarece există atacuri generice, distribuite eficient², care găsesc coliziuni într-un $n$-bit hash cu aproximativ $2^{n/2+2}$ hashuri. Astfel, orice hash rapid cu un rezultat mai mic de 192 de biți (dați sau primiți 32) este susceptibil de coliziune (pentru adversarii cu mijloace comparabile cu cele folosite de unii mineri de bitcoin). Când facem hash-ul mai lent, asta crește costul de calcul pentru a găsi o coliziune. Creșterea costului cu un factor $c$ permite restrângerea hash-ului cu aproximativ $2\log_2(c)$ bit din punctul de vedere al rezistenței la coliziune (avertisment: pentru hashe-uri foarte rapide care se pot aplica numai pentru $c$ trecut de un mic prag). De exemplu, dacă în loc de SHA-224 am folosit PBKDF2-HMAC-SHA-256 cu ieșire pe 184 de biți și șase sute de mii de iterații (pentru $c\aproximativ 2^{20}$ ), am obține o securitate comparabilă împotriva rezistenței la coliziune.
  • Că hash-ul nu este atât de rapid, asta prin simplificarea excesivă a elementelor interne, permițând atacuri diferite, specifice. Ca o extremă, SAU exclusiv al blocurilor de intrare la fel de largi ca ieșirea este un hash extrem de rapid, dar trivial nu este rezistent la ciocniri. Există atacuri împotriva MD5, SHA(-0) și SHA-1, probabil pentru că designul lor pune prea mult accent pe viteză. Și există atacuri împotriva SHA-256 dacă reducem numărul de runde la 31 (de la 64).

¹ Cel mai bun mod de a realiza acest lucru este să facem hash greu de memorie, adică evaluarea sa ar trebui să necesite multe accesări la memorie într-o cantitate mare de memorie dedicată acelei utilizări pe parcursul întregii evaluări. Astfel de funcții includ și cele moderne Argon2, cripta, și într-o oarecare măsură cele învechite bcrypt, dar nu chiar rău PBKDF2 (ceea ce este dezastruos, deoarece amprenta RAM scăzută oferă un avantaj uriaș adversarilor cu ASIC-uri, FPGA-uri sau GPU-uri, în comparație cu majoritatea utilizatorilor care folosesc un procesor).

² A se vedea Paul C. van Oorschot și Michael J. Wiener Căutare de coliziuni paralele cu aplicații criptoanalitice, în Journal of Criptology, 1999.

³ A se vedea Florian Mendel, Tomislav Nad și Martin Schläffer Îmbunătățirea coliziunilor locale: noi atacuri asupra SHA-256 redus, în procedurile Eurocrypt 2013

drapel za
```Nu ar fi o problemă dacă ar fi foarte rapid.``` - [blake3 salută](https://github.com/BLAKE3-team/BLAKE3/blob/master/media/speed.svg)
kelalaka avatar
drapel in
@hanshenrik Blake3 este un hash paralel. O comparație reală poate fi făcută doar cu ParallelHash [care este derivat din SHA3](https://csrc.nist.gov/projects/hash-functions).
drapel za
@kelalaka blake3 acceptă paralelizarea da, dar acel benchmark este de la rularea blake3 cu un singur fir, fără paralelizare în acel benchmark! (dacă ar folosi paralelizarea, blake3 ar rula chiar mai repede decât ceea ce este afișat în graficul respectiv)
Puncte:9
drapel jp

Răspunsul acceptat în prezent este bun, dar aș dori să adaug ceva. „securitate” este un termen larg în acest context și ar trebui să vă întrebați de ce amenințare doriți să vă apărați. În majoritatea discuțiilor, „coliziunea” se referă la găsirea unei intrări diferite cu o ieșire identică.Dar pentru cazul parolei, „hash rapid” este problematic doar pentru forțarea brută. Cu un hash rapid, este ușor pentru un atacator să atace dicționarul multe intrări posibile, căutând o potrivire cu hash-ul.

Nu este un caz de „hash rapid == prea puțini biți de ieșire”, așa cum a cerut OP. Doar că, dacă hash-ul este prea rapid, este ușor să găsești și intrarea originală (nu o coliziune), ceea ce o face nesigură.

Maarten Bodewes avatar
drapel in
Nu sunt de acord cu asta. În de ex. hashing parole, tot ce vă interesează este viteza *diferența* dintre server/utilizatorul vizat și adversar. Cu toate acestea, acest lucru este rezolvat, asigurându-vă că utilizați o implementare rapidă și asigurându-vă că există un factor de lucru semnificativ / număr de iterații. Acest lucru, totuși, nu are nimic de-a face cu viteza funcției hash sigure criptografic utilizate. Această problemă ar putea fi rezolvată făcând diferența dintre funcția hash sigură criptografic și hashul parolei mai explicită.
Puncte:3
drapel id

Având în vedere o funcție hash care este reglabilă pentru „viteză”, (iterații, poate), creșterea vitezei cu care se hash nu crea mai multe ciocniri. Problema de securitate cu un hash care este prea rapid este că, având în vedere o perioadă de timp X, un hash care este mai rapid va genera o cantitate mai mare de ieșiri, astfel încât un atacator are șanse mai mari de găsirea o coliziune.

Puncte:2
drapel in

OP a primit ideea de la a postare pe YouTube care argumentează în jurul MD5.

Iată argumentul simplu dacă se uită cineva la videoclip.

Viteza nu înseamnă că o funcție hash este nesigură, designul o face sigură.

De-a lungul anilor, cercetătorul a găsit slăbiciuni în designul MD5 și s-au îmbunătățit în timp. Odată ce MD5 a fost lansat, în 1992, au început atacurile, iar în 2010 Xie și Dengguo Feng au anunțat prima coliziune MD5 cu un singur bloc (512 biți) publicată. Desigur, îmbunătățirea procesorului și a ciclurilor acestora ajută la atacul mai rapid, cu toate acestea, principala contribuție o reprezintă metodologiile de atac. Luați în considerare că atacul de coliziune generic (atacul de ziua de naștere) necesită $2^{64}$ Hash-uri MD5 cu o probabilitate de succes de 1/2. Chiar și astăzi, niciun procesor obișnuit nu poate face $2^{64}$ în un timp rezonabil. Pe de altă parte, avem acum o coliziune instantanee pentru MD5, vezi corkami.

Pe de altă parte, Blake2 este un funcție hash foarte rapidă, mai rapid decât MD5 și SHA-1 și nu are atacul de extensie de lungime deoarece folosește Structura HAIFA, remedieri ale designului MD. Este mai rapid decât MD5 și sigur cel puțin într-o trăsătură previzibilă. Dimensiunea sa de ieșire este suficient de sigură pentru atacuri paralele masive sau chiar pentru Algoritmul de căutare cuantică al lui Grover. Seria Blake are acum BLAKE3, este un hash paralel și foarte rapid.

Ceea ce este important în legătură cu viteza și relația ei cu securitatea este dimensiunea rezumatului. Atacurile generice pentru atacul pre-imagine, atacul secundar pre-imagine și coliziunea generică sunt $2^n$,$2^n$, și $2^{n/2}$, respectiv. Dacă aveți ieșirea pe 256 sau 512 biți, sunteți bine în privința atacurilor generice. Ține minte că spațiul scurt de intrare este o problemă pentru atacurile pre-imagine și se recomandă HMAC.


PS: hashing parole (nu este necesară rezistența la coliziune), unde vrem viteză controlabilă, duritatea memoriei, și cantitatea de fir al funcției de hash a parolei. Ar trebui să citiți întrebarea canonică de pe venerabilul nostru site, securitatea informatiei.. De asemenea, Hartie Argon2, câștigătorul concursului de hashing a parolelor din 2015, este o alegere bună de citit.


Notă finală: Ar trebui să definiți cu atenție problema lor, astfel încât să poată realiza un design sigur. Nu există securitate reală dacă nu îți cunoști riscurile.

Puncte:0
drapel my

Să luăm în considerare utilizarea unui hash pentru a proteja o parolă și să luăm câteva exemple.

  • Primul caz: avem o funcție hash care ia 1 secunda pentru a executa pe un computer obișnuit. Dacă atacatorul are acces la 1 milion de computere (de exemplu, printr-o rețea bot), poate face 1 milion de încercări pe secundă, 86 de miliarde de încercări pe zi. Dar o parolă de 8 caractere care utilizează cifrele superioare, inferioare și simboluri este de aproximativ 50 de biți de entropie, așa că la performanța actuală va dura în medie aproximativ 18 ani pentru a sparge acea parolă, chiar și cu acea rețea botnet masivă (desigur, în 18 ani lucrurile se vor accelera probabil destul de mult, așa că va fi mai scurt decât atât, dar totuși). În cel mai rău caz, va dura 36 de ani.

  • Al doilea caz: avem o funcție hash care ia 1 microsecundă a executa. Același atacator care folosește același botnet de un milion de computere poate face acum un milion de încercări pe secundă. Acum durează 1125 de secunde (mai puțin de 20 de minute) pentru a încerca fiecare dintre cele aproximativ 2^50 de parole posibile de 8 caractere. Deci, în medie, aproximativ jumătate din timp.

Dacă crezi că o rețea bot cu un milion de computere este o fantezie, mai gandeste-te.

Deci nu este o chestiune de a genera mai multe coliziuni (pentru orice funcție hash decentă, aceasta este direct legată de dimensiunea ieșirii, nu de viteza hash-ului), ci de a putea găsi coliziuni (sau de fapt, originalul intrare, dar nu știți neapărat asta), înfrângând scopul hashului.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.