Password Cracking - cum se face?

Varianta super scurtă:

  1. Nu folosi md5. Niciodată.
  • indiferent ce folosești, folosește un salt key.

Ca utilizator:

  • parolă cât mai lungă;
  • parolă unică pentru fiecare serviciu/site/cont.
6 Likes

MD5 really? what is this, the 2000s? Now you can get fired for even suggesting storing passwords in MD5 and friends. Bcrypt/scrypt and friends would smoke even a cluster of GPUs.

A salt key is not necessary for bcrypt and co.

2 Likes

Zilele trecute citeam un articol care prevestea (ușor apocaliptic, evident, că altfel nu se poate :smiley:) că odată cu apariția calculatoarelor cuantice, parolele vor putea fi sparte în decurs de câteva secunde, indiferent de complexitatea lor (chiar se dădea exemplu https; cu criptarea actuală s-ar putea face sniffing în timp real)

Bine, probabil vor mai trece niște ani pâna când chestia asta va fi reală, dar… e interesant, mai ales în contextul în care se migrează totul masiv cloud…


O să rămâi surprins (sau NU O SĂ-ȚI VINĂ SĂ CREZI!!!) cât de delăsători pot fi unii programatori. :slight_smile:

// todo: sanitize fields
-------
// todo: hash passwords
1 Like
// todo: sanitize fields
-------
// todo: hash passwords

2 Likes

Eh, deci site-urile alea care te fortau sa ti faci o parola de minim “x” caractere, minim o litera mare etc ne voiau binele, iar noi le criticam :smiley:

1 Like

N-am nici o problema cu sugerarea folsirii de astfel de caractere, dar cu ce ar fi mai puternica parola guN0aiele decat Labradord3occident?

Adica, ok, parola are mai putin de 8 caractere, inteleg, dar sa nu ne bage pe gat sa folosim o parola care sa aiba o litera mare, o litera mica, o cifra, un caracter special, o oaie, 3 verze si sangele a 7 maicute? Am mers prea departe cu gluma? Lafel de departe ca si ei cu parolele.

Solutia? Daca parola are intre 8 si 12 (inclusiv) caractere, trebuie sa indeplineasca (minim) 3 din cele 4 criterii (litera mica, litera mare, cifra, caracter special), intre 13 si 20 sa indeplineasca (minim) 2 din cele 4 criterii, iar mai mare de 20 sa respecte minim un criteriu (adica sa nu se faca alte verificari in afara lungimii). Daca tii morţiş, poti sa elimini ultimele doua verificari, iar tot ce e mai mare de 13 caractere sa indeplineasca minim 2 din cele 4 criterii.

Esti mai paranoic? (Cu sau fara motiv, din cate stiu eu acest comentariu ar putea fi citit de cineva care lucreaza cu date sensibile.) Faci verificarea parolei server-side si o verifici sa aiba mai mult de 7 caractere, apoi verifici daca este una din cele mai populare parole (sunt liste pe net suficiente) si daca atunci cand elimini toate cuvintele din dictionar rezultatul nu este gol (un string cu lungimea 0), apoi, cu un switch sau elseif/else if verifici fiecare criteriu in parte.

Daca ma gandesc mai bine, ar fi util ca un microservice, cu API public sau privat… (I’ll be back when it’s done… if I’ll ever finish it.)

Cred ca asta este un thread mai bun, decat sa compun altul nou, in plus aici ai si filmuletul cu ceva info interesante.

Interpretare a postului Funny dev related stuff - the chill corner si a celor de dupa.
De curand, o echipa Google Security & Co a anuntat ca a gasit o metoda de a produce coliziuni in sha1 http://shattered.io/
In md5 este descoperita o metoda inca din 2004 https://en.wikipedia.org/wiki/MD5
Atat functia md5 cat si sha1 sunt functii hash dar nu bijective, asta inseamna ca ele nu au o inversa (d-aia nu folosest la criptare), Nu sunt bijective pentru ca ele nu sunt injective, adica exista x si y, x =/= y astfel incat md5(x) = = md5(y), atunci cand gasim x si y am gasit o coliziune. Acest efect este oarecum logic deoarece md5 are valori intr-o multime de 128 biti, iar sha1 in 160 biti.
Cele 2 functii erau folosite pentru a tine parolele hash-uite si pentru a autentifica mesaje/fisiere.
Daca “Security through obscurity.” ar fi fost un principiu bun, nu se mai organizau concursuri pentru gasirea algoritmului functiei sha-3 https://en.wikipedia.org/wiki/NIST_hash_function_competition
Deci md5(md5(md5…())) de n ori o sa aiba 128 biti, nu este mai sigur ca un singur md5 daca poti gasi coliziunea la fel nici concatenarea lor. Asta atat pentru parole cat si pentru mesaje. Adica serios, chiar crezi ca cineva care incearca sa-ti sparga parolele nu isi da seama ca tu ai concatenat 2 functii, chiar fara sa-ti vada codul? Si oricum pot fi folosite alte atacuri pentru asta.

Pana acum era stiut faptul ca sha1 nu este o solutie buna pentru parole, dar mai era folosit pentru autentificarea fisierelor. Shattered spune ca nu mai este bun nici pentru fisiere.

Pentru viitor iti recomand sa folosesti Libsodium in PHP https://paragonie.com/book/pecl-libsodium/read/00-intro.md#installing-libsodium - hash, crypt, rng… Nu cred ca o sa gasesti md5 sau sha1 acolo.

1 Like

Stii ce-ar fi haios? Sa maschezi un md5 drept sha-1. Pentru diferenta in biti, poti face md5 la codul md5 obtinut anterior, si aceluia iar md5, si tot asa pana obtii sha-1, sha-256 sau ce altceva mai ai nevoie. I mean, cine s-ar astepta la asta, am I right?

Security through obscurity.

TXT:
parola mea sigura

SHA-256:
B89531D2074B0A9A2830B9B057961268325E030CE764983AB76F6738881F6B96

SHA-1:
14DF82C7E46E92B07866363EEBEB02403280CE1F

MD5:
AACAA24CBF2784574326FE483B404308

MD5 of MD5:
EA86097E1CE1EF1108DFEA9451BF95C3

MD5 as SHA-1 (MDSHA-1?):
AACAA24CBF2784574326FE483B404308EA86097E

MD5 as SHA-256 (MD5SHA-256?):
AACAA24CBF2784574326FE483B404308EA86097E1CE1EF1108DFEA9451BF95C3

Stii ce-ar fi haios? Sa ne dai si noua ce fumezi inainte sa postezi.
Ghici ce-ti da md5(md5(ceva)). Ce fel de functie matematica este md5?

2 Likes

My bad, am uitat sa mentionez ca era vorba despre parole. Dar am dat exemplul cu text, care este formatul default al unei parole.

Ideea era sa maschezi un algoritm de criptare drept altul. Astfel ca daca cineva are un tabel cu toate valorile sha-1, sa nu il poata folosi sa iti “sparga” parola.

Let me explain. Ai parola X. md5(X) = Y; sha-1(X) = Z; md5sha-1(K) = Z
Dar sha-1 si mdsha-1 dau un string de aceeasi lungime, Astfel ca daca hackerul nu stie cum anume ai obtinut acel hash, si vazand ca toate hashurile sunt diferite (deci nu pui acelasi cod dupa md5, in md5sha-1), va crede ca ai folosit functia (default) sha-1, si nu functia (custom) md5sha-1.

md5sha-1 ar arata ceva de genul:

function md5sha-1($txt){
  $result = md5($txt);
  $result = $result . substr(md5($result), 0, 8);
  return $result;
}

Iar md5(md5)-ul este pentru a genera un random code care sa fie unic pentru fiecare text introdus, in caz ca nu vreau sa extrag parola din db si apoi sa ii compar primele 24 caractere cu md5-ul, ci las compararea pe seama sql-ului.

Daca mai ai intrebari, te rog nu ezita sa le pui.
Ah, si ca sa-ti raspund, nu fumez, nu trag pe nas, nu bag in vena.

1 Like

Nu mai bine folosești un sha2 (sau orice alt algoritm) + salt?

Cryptographic Hash + salt nu mai e considerat o idee buna pentru parole. Lasa sistemul vulnerabil la atacuri tip dictionar pentru a sparge o singura parola - atacatorul poate incerca multe parole pana o gaseste pe cea buna deoarece (1) spatiul parolelor este destul de mic si (2) sa calculezi SHA2 + salt e foarte rapid.
Ce e recomandat acum e bcrypt, scrypt sau PBKFD2, cunoscute si ca password hashes sau key derivation functions. Merg pe acelasi principiu ca hash-urile doar ca dureaza o groaza - zeci de ms, poate chiar sute. Nu o sa puna un load foarte mare pe sistem, deoarece nu se verifica hash-uri d’astea foarte des, dar fac treaba atacatorului extrem de grea.

2 Likes