Care este ' diferența dintre PBKDF și SHA și de ce să le folosim împreună?

Am citit puțin despre hashing în ultima vreme și conform AgileBits , folosesc „ SHA512 în PBKDF2 ” în noul lor fișier seif.

Am căutat în Wikipedia ambele nume și știu că PBKDF2 este o funcție de derivare a cheii, iar SHA este o criptografică funcția hash, dar nu pot să înțeleg cu adevărat diferența și de ce sunt folosite ambele împreună cu unul în celălalt.

Poate cineva să explice acest lucru unei persoane fără experiență în criptografie? (Puteți presupune că știu doar despre matematică, dacă este necesar).

Comentarii

  • PBKDF2 este mult mai lent decât SHA, deci este mai bine potrivite pentru parole hashing, deoarece durează mult mai mult pentru a face un dicționar sau un atac de forță brută.
  • @puzzlepalace deci fac practic același lucru și folosesc compoziția PBKDF2 (SHA (parolă)), deci durează mai mult timp pentru atacatori?
  • Ei bine, în majoritatea cazurilor, PBKDF2 folosește un primitiv numit HMAC ca o funcție psuedo-aleatorie, care la rândul său folosește o funcție hash criptografică în ‘ internele sale, în acest caz SHA512. Deci, compoziția arată într-adevăr mai mult ca PBKDF2(HMAC_SHA512, password, ...).
  • PBKDF2 este mașina, HMAC este motorul, SHA512 este pistonul
  • Acesta din urmă o parte din răspunsul meu la o întrebare anterioară abordează, de asemenea, acest lucru.

Răspuns

SHA-512 este un hash securizat criptografic , PBKDF2 este ceea ce numim o funcție de derivare a cheii bazată pe parolă. Dacă secretul rezultat nu este folosit ca cheie, dar ca valoare hash, acesta se numește și parola hash . Hash-urile de parolă diferă de hashurile securizate în sensul că conțin o sare și un număr de factori de lucru / iterație.

Atât hashurile criptografice, cât și hash-urile de parolă sunt funcții unidirecționale concepute pentru a crea o ieșire scurtă intrare dată. În cazul hashului parolei, intrarea ar fi parola și sare. Mărimea sării și numărul de iterații sunt în mod obișnuit considerați parametri de configurație; ambele, desigur, influențează ieșirea hash-ului de parolă.

Hash-urile de parolă sunt, în general, construite deasupra funcțiilor Pseudo Random sau PRF-uri. O formă obișnuită de PRF este un cod de autentificare a mesajelor bazat pe HMAC sau Hash, care la rândul său folosește un hash intern. Când sunt utilizate PRF-uri bazate pe hash, cum ar fi HMAC, atunci tipul / dimensiunea hash-ului utilizat este deseori configurabil. Cu toate acestea, hashurile de parolă nu trebuie să fie construite folosind hash-uri. Orice alt PRF, cum ar fi cele bazate pe cifre simetrice, poate face. bcrypt, de exemplu, este construit deasupra Blowfish, un cifru bloc.

Hash-urile de parolă au nevoie de sare, astfel încât parolele identice să nu fie mapate cu același hash. perechi hash) de la a fi utile. În plus, acestea conțin un număr de factori de lucru / iterație, astfel încât un atacator trebuie să efectueze mai multă muncă pentru a calcula hashul fiecărei parole posibile. Acest lucru este necesar deoarece majoritatea parolelor nu sunt suficient de aleatorii. Fără factorul de lucru, atacatorul ar putea testa multe cantități de parole posibile folosind forța brută sau un atac de dicționar.

Comentarii

  • mult mai multe informații aici … ‘ nu se potrivește totuși în spațiul de răspuns.

Răspuns

Pentru a parafraza răspunsul meu la o întrebare anterioară , PBKDF2 este un algoritm generic de nivel înalt care apelează intern o funcție pseudorandom (PRF) pentru a-și procesa intrarea. Specificația PBKDF2 nu impune un anumit PRF, astfel încât implementatorii sunt liberi să aleagă orice PRF doresc (atâta timp cât îndeplinește definiția unui PRF sigur și pot accepta intrarea pe care PBKDF2 o oferă).

Așa cum se întâmplă, de departe cea mai comună alegere a PRF pentru PBKDF2 este HMAC , care este o altă construcție de nivel înalt care utilizează intern o funcție hash criptografică . Din nou, specificațiile HMAC nu impun nicio funcție hash specială, * astfel încât implementatorii sunt liberi să aleagă orice hash doresc. Probabil cea mai obișnuită alegere de astăzi este una dintre SHA-2 familia de hash-uri, care includ SHA-256 și SHA-512.

Deci, „SHA512 în PBKDF2” înseamnă cu siguranță că utilizează PBKDF2 cu HMAC ca PRF și cu SHA-512 ca hash din HMAC. **

Ceea ce poate fi confuz este că, la un aruncă o privire, acest PBKDF2-cu-HMAC-cu-SHA512 poate arăta că face ceva foarte similar cu SHA-512 simplu: ambele iau o parolă arbitrară ca intrare și o transformă într-un șir de biți pseudorandom din care parola originală nu poate să fie ușor de reconstituit.Cu toate acestea, există de fapt mai multe diferențe, cele mai importante fiind că:

  • SHA-512 este rapid. Foarte rapid. PBKDF2 este deliberat lent de calculat, iar lentoarea acestuia poate fi controlată prin ajustarea parametrului numărului de iterații.

  • Ca o consecință directă a vitezei sale, SHA -512 singur este vulnerabil la atacurile de ghicire a parolei cu forță brută folosind software cum ar fi hashcat , care generează pur și simplu o mulțime de parole și le hash până când găsesc una care produce un hash potrivit . Un singur procesor modern poate hash ușor milioane de parole pe secundă, iar GPU-urile sunt chiar mai rapide.

În plus, există câteva alte diferențe minore în ceea ce privește notarea:


*) Definiția HMAC originală și dovezile de securitate presupun efectiv că funcția hash utilizată este de o anumită tip cunoscut sub numele de funcție de hash Merkle – Damgård . După cum se întâmplă, toate cele mai populare funcții hash criptografice din ultimele decenii, inclusiv familia SHA-2, au fost de acest tip, astfel încât această limitare nu a fost o problemă prea mare în practică. Acest lucru se poate schimba treptat odată cu standardizarea SHA-3 (alias Keccak), care nu este nu un hash Merkle-Damgård, ci în mod convenabil, vine cu propria sa cerere de securitate pentru HMAC-SHA3 .

**) Aceasta este o amendă și alegerea tradițională, în măsura în care merge. Nu este la fel de rezistent la atacuri bazate pe GPU și alte atacuri paralele ca KDF-uri mai moderne, cum ar fi scrypt sau Argon2 ar fi, dar este încă mult mai bun decât hash-ul vechi neterat simplu. Acestea fiind spuse, pentru a-i evalua în mod corespunzător securitatea, ar trebui, de asemenea, să cunoaștem numărul de iterații utilizat pentru PBKDF2. Din păcate, multe implementări PBKDF2 tind să folosească vechiul „minim recomandat” de 1000 de iterații, care este puțin mai mult decât o viteză în zilele noastre. Personal, pe un procesor modern, aș prefera ceva mai apropiat de 1.000.000 sau 1.000.000.000 de iterații .

Comentarii

  • Întrebare: PBKDF2 este folosit doar pentru a încetini numărul de presupuneri (dacă este forță brută)? Există mai multe informații de care să ții cont?
  • @NaveenNiraula : În afară de încetinirea ghicirii forței brute, PBKDF2 are scopul secundar de a converti parolele de lungime și format arbitrar în șiruri de biți uniform pseudorandom. Dar doar hashul simplu ar putea realiza acest lucru. De asemenea, parametrul sare permite derivarea mai multor chei distincte din același parolă și previne unele atacuri folosind dicționare precomputate, cum ar fi ” tabele curcubeu „. Dar din nou, dacă nu ați făcut ‘ nu aveți nevoie de protecția de ghicire a forței brute a PBKDF2, puteți folosi HMAC simplu pentru asta sau chiar concatenați sarea cu parola înainte de a utiliza hashing acesta.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *