Argon2 |
---|
Argon2 este o funcție de derivare cheie dezvoltată de Alex Biryukov , Daniel Dinu și Dmitry Khovratovich de la Universitatea din Luxemburg în 2015 [1] .
Acesta este un algoritm modern simplu care vizează o rată mare de umplere a memoriei și utilizarea eficientă a mai multor unități de calcul [2] . Algoritmul este lansat sub o licență Creative Commons .
În 2013, a fost anunțată competiția de hashing parole pentru a crea o nouă funcție de hashing a parolei. Cerințele pentru noul algoritm au fost cantitatea de memorie utilizată, numărul de treceri prin blocuri de memorie și rezistența la criptoanaliza.
În 2015, Argon2 a fost declarat câștigătorul competiției [1] . De atunci, algoritmul a suferit 4 modificări majore. Unele dintre descrierile algoritmilor pentru generarea unor blocuri și greșeli de scriere au fost corectate, au fost adăugați parametri recomandați [1] [3] .
Argon2 folosește parametri de bază și avansați pentru hashing:
Principal:
Adiţional:
Există două versiuni ale algoritmului:
Argon2 funcționează după următorul principiu:
, , unde
— funcție de indexare , — matrice de memorie, — funcție de compresie, — mesaj (parolă), — funcție hash Blake2b .
Funcțiile de indexare depind de versiunea algoritmului Argon2:
In cazul functionarii secventiale, functia de compresie se aplica o singura data. Pentru versiunea Argon2d, la pasul -, blocul cu indicele determinat de blocul anterior este alimentat la intrarea funcției . Pentru versiunea Argon2i, valoarea generatorului de numere aleatoare este luată ( în modul contor).
În cazul unui mod paralel (algoritmul este paralelizat în fire ), datele sunt distribuite peste blocurile matricei , unde primele blocuri sunt rezultatul hashingului datelor de intrare, iar următoarele sunt setate de funcția de compresie. pentru blocurile anterioare și blocul de referință :
, unde este numărul de blocuri de memorie cu o dimensiune de 1024 de octeți, este o funcție hash care ia ca intrare o reprezentare pe 32 de biți a parametrilor de intrare, a cărei ieșire este o valoare de 64 de biți, este o funcție hash de lungime variabilă de la , este cantitatea de memorie, este numărul de iterații.
În cele din urmă:
În continuare, se determină indicele liniei de unde provine blocul. Când , valoarea este luată ca număr de linie curent . Apoi se determină un set de indici după 2 reguli:
Ca rezultat, numărul blocului este calculat din , care este luat ca referință:
Blake2b este o versiune pe 64 de biți a funcției BLAKE , deci este construită astfel:
În general , valoarea de ieșire a funcției este construită pe primii 32 de biți ai blocurilor - și ultimul bloc :
Bazat pe caracteristica de compresie Blake2b. Primește două blocuri de 8192 de biți ca intrare și produce un bloc de 1024 de biți. Mai întâi se adaugă două blocuri ( ), apoi matricea este procesată rând cu rând ( ), apoi matricea rezultată este procesată coloană cu coloană ( ), iar rezultatul este [6] .
Protecție la coliziune : funcția Blake2b în sine este considerată sigură din punct de vedere criptografic. De asemenea, referindu-se la regulile de indexare, autorii algoritmului au demonstrat absența coliziunilor în cadrul blocurilor de date și probabilitatea scăzută de apariție a acestora la aplicarea funcției de compresie.
Atacul de găsire a preimaginei : lăsați atacatorul să ridiceastfel încât, apoi pentru a continua acest atac, trebuie să ridice preimaginea:, ceea ce este imposibil. Același raționament este potrivit pentru atacul găsirii celei de-a doua preimagine.
Atacuri de sincronizare: Dacă utilizatorul trebuie să se adapteze la un atac de sincronizare , atunci versiunea Argon2i ar trebui să fie utilizată deoarece folosește memorie independentă [7] .
Dan Bonet , Henry Corrigan-Gibbs și Stuart Schechter au arătat vulnerabilitatea Argon2i versiunea 1.2 în munca lor. Pentru versiunea cu o singură trecere, atacul lor a redus consumul de memorie cu un factor de 4 fără a încetini execuția. Pentru versiunea multi-pass - de 2,72 ori. Mai târziu, în versiunea 1.3, operația de suprascriere a fost înlocuită cu XOR [8] .
Joel Alwen și Jeremiah Blocki au dovedit în munca lor că algoritmul lor de atac AB16 este eficient nu numai pentru Argon2i-A (din prima versiune a specificației), ci și pentru Argon2i-B (din cea mai recentă versiune 1.3). Ei au arătat că atacarea Argon2 cu 1 GB de RAM reduce timpul de calcul la jumătate. Pentru o protecție eficientă, trebuie specificate mai mult de 10 treceri. Dar, cu abordarea recomandată pentru alegerea parametrilor algoritmului, în practică, adesea poate fi selectată doar 1 trecere. Dezvoltatorii Argon2 susțin că prin aplicarea atacului AB16 asupra Argon2i-B la , timpul este redus de cel mult 2 ori până la 32 GB de memorie și recomandă utilizarea numărului de treceri care depășește logaritmul binar al dimensiunii[ clarifica ] memorie folosită [9] .
Acest atac este unul dintre cele mai eficiente pentru Argon2d. Reduce timpul de procesare de 1,33 ori. Pentru Argon2i la , coeficientul este 3 [10] .
Condiția principală pentru atacul prezentat este accesul atacatorului la memoria internă a mașinii țintă, fie după terminarea schemei de hashing, fie la un moment dat când parola în sine este încă prezentă în memorie. Datorită rescrierii informațiilor folosind funcția , Argon2i și Argon2d sunt rezistente la aceste atacuri [11] .
Argon2 este optimizat pentru arhitectura x86 și poate fi implementat pe Linux , OS X , Windows .
Argon2d este destinat sistemelor în care un atacator nu accesează în mod regulat memoria sistemului sau procesorul. De exemplu, pentru servere backend și criptomineri . Când utilizați un nucleu pe un procesor de 2 GHz și 250 MB de RAM cu Argon2d (p=2), criptominingul durează 0,1 s, iar când utilizați 4 nuclee și 4 GB de memorie (p=8) , autentificarea pe serverul backend durează 0, 5 s .
Argon2i este mai potrivit pentru serverele frontend și pentru criptarea hard diskului . Generarea cheii pentru criptare pe un procesor de 2 GHz folosind 2 nuclee și 6 GB de memorie RAM cu Argon2i (p=4) durează 3 s, în timp ce autentificarea pe serverul frontend folosind 2 nuclee și 1 GB de memorie cu Argon2i (p=4) , durează 0,5 s [12] .
Funcții hash | |
---|---|
scop general | |
Criptografic | |
Funcții de generare a cheilor | |
Numărul de verificare ( comparație ) | |
Hashes |
|