Puncte:1

Cum funcția password_verify() primește sarea din parola stocată în DB?

drapel sg

Creez un formular simplu de înregistrare și conectare folosind PHP. La înregistrare, creez hash folosind funcția password_hash() și apoi îl stochez în DB. La momentul conectării, inițial ceea ce am făcut a fost creat un nou hash folosind din nou funcția password_hash() și apoi l-am comparat cu hash-ul Parola stocat.

Acest lucru a eșuat tot timpul deoarece, după cum am înțeles acum, o sare nouă este folosită de fiecare dată când creați un hash de parolă folosind funcția password_hash(). După ce am cercetat, am știut că ar trebui să folosești funcția PHP password_verify(<plain_text_password>,<password_fetched_from_DB>).

Ceea ce nu înțeleg este cum de funcția password_verify cunoaște valoarea de sare care a fost folosită mai devreme la momentul înscrierii? Dacă sarea nu este cunoscută, atunci password_verify ar trebui să eșueze, de asemenea, ca și funcția password_hash atunci când este utilizată pentru comparație.

Am citit mai departe despre asta și ceea ce am știut este că atunci când funcția password_hash() este folosită pentru a crea hash-ul, stochează și valoarea de sare în interiorul hash-ului? De exemplu, dacă hash creat este abcde12345, atunci ar putea 12345 să fie valoarea sării?

Dacă acest lucru este adevărat, atunci, privind un hash, putem spune că „această” parte a hashului este de fapt valoarea sării? Valoarea sării este întotdeauna plasată la o anumită poziție în hash? Aș aprecia dacă cineva poate împărtăși un exemplu.

kelalaka avatar
drapel in
Ați citit complet [site-ul PHP](https://www.php.net/manual/en/function.password-hash.php)? În secțiunea Valori de returnare sau a se vedea, de asemenea, veți observa [password_verify()](https://www.php.net/manual/en/function.password-verify.php) mulțumesc are introducerea parolei curente și hash-ul stocat și returnează T/F!
Puncte:2
drapel si

Ieșirea oricărei funcții obișnuite de hashing a parolei constă în setările de dificultate, salt și rezumatul parolei, codificate într-un anumit format pe care funcția de hashing a parolei îl specifică. Funcția de verificare se așteaptă la același format și pur și simplu citește sarea din el. Acest site are o explicație bună pentru funcțiile hash Argon2. De exemplu, pentru argon2id (opțiune recomandată pentru PHP password_hash) cu parola 12345, salt qwertyuiop, 1 iterație, 1024 memorie, lungime hash 32, paralelism 1, rezultatul este $argon2id$v=19$m=1024,t=1,p=1$cXdlcnR5dWlvcA$dSEO3lF0tmBRi3/HZFZqPJGv38CW35xf9Fcs+8ti0yk

Puteți vedea diferiții parametri, separați prin $ semne.

Z3R0 avatar
drapel jp
Salut am o intrebare despre sare.Sarea este stocată și cu hashul parolei sau este în text clar? De exemplu, dacă am hash-ul 1234.abcde și 1234 este sarea returnată de password_hash(), este și hash-ul sau este în text clar? Deci, atunci când vreau să verific hash-ul, adaug 1234 la parolă în text clar și re-execut funcția de hashing.
SAI Peregrinus avatar
drapel si
Sarea este (desigur) în text clar: nu este un secret (prin definiția unei „sări”). În exemplul de hash folosind Argon2, este „cXdlcnR5dWlvcA”, care este codificat în BASE64, dar cu siguranță nu este criptat. Codificarea este necesară pentru a converti octeți arbitrari (care pot include 0 octeți) într-un „șir” de caractere ASCII imprimabile care nu poate include 0 octeți.
Puncte:1
drapel in

Da, sarea și hașul sunt stocate împreună, iar hașul este întotdeauna stocat într-un loc cunoscut - trebuie doar să căutați formatul anumitor algoritm de hashing folosit pentru a găsi detaliile.

Sarea nu se dorește a fi mai secretă decât hașul, așa că nu este nicio problemă să le depozitezi împreună.Utilizarea sării nu are scopul de a face imposibil un atac cu forță brută dacă un atacator a reușit să obțină o copie a bazei de date a parolelor, dar ceea ce face este să prevină utilizarea tabelelor de hash precalculate, cunoscute sub numele de tabele curcubeu, și să prevină spargerea aceleiași parole pentru mulți utilizatori simultan.

Aceste atacuri nu funcționează cu un sistem de parole sărate, deoarece toți cei care aleg „p455w0rd” ca parolă o vor avea hashing cu o sare diferită, așa că atacatorul trebuie să o spargă separat pentru fiecare dintre ele. Totuși, nu va dura mult cu o parolă atât de proastă, dar mult mai mult decât ar fi fără sare.

Z3R0 avatar
drapel jp
Salut am o intrebare despre sare. Sarea este stocată și cu hashul parolei sau este în text clar? De exemplu, dacă am hash-ul 1234.abcde și 1234 este sarea returnată de password_hash(), este și hash-ul sau este în text clar? Deci, atunci când vreau să verific hash-ul, adaug 1234 la parolă în text clar și re-execut funcția de hashing.
drapel in
Sarea este stocată în text clar, nu este hashing. Este codificat cu o schemă care, prin proiectare, este ușor de inversat pentru oricine, similar cu, de ex. codificare base64, deoarece orice binar trebuie să fie codificat pentru a fi salvat ca text simplu. Puteți vedea detaliile în cazul bcrypt la https://en.wikipedia.org/wiki/Bcrypt#Description
Z3R0 avatar
drapel jp
Chiar vă mulțumesc

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.