Hashing este procesul de transformare a datelor de dimensiune arbitrară într-un șir de lungime fixă, utilizat pentru verificarea integrității și stocarea sigură a parolelor. Conform Open Web Application Security Project (OWASP, 2025), utilizarea corectă a funcțiilor hash previne până la 70% din vulnerabilitățile legate de scurgerea datelor de autentificare. Hashurile criptografice stau la baza semnăturilor digitale, tehnologiilor blockchain și controlului versiunilor.
Principalele puncte
Hashingul — procesul de calcul al funcției hash, care transformă un set arbitrar de date de intrare într-un șir de biți de lungime fixă, numit digest sau valoare hash. Spre deosebire de criptare, hashingul este un proces unidirecțional: restabilirea datelor originale din hash este imposibilă.
Funcțiile hash criptografice au patru proprietăți obligatorii: determinism (aceeași intrare produce întotdeauna același hash), ireversibilitate (este imposibil din punct de vedere computațional să se restabilească intrarea din hash), efect de avalanșă (modificarea unui bit la intrare schimbă în medie jumătate din biții hashului) și rezistența la coliziuni (este imposibil din punct de vedere computațional să se găsească două intrări diferite cu același hash).
Este important să înțelegem diferența dintre hashing și criptare. Criptarea este un proces bidirecțional: datele criptate pot fi decriptate cu ajutorul unei chei. Hashingul este un proces unidirecțional: după transformare, datele nu pot fi recuperate. Această proprietate face hashingul ideal pentru stocarea parolelor: sistemul stochează doar hashul, iar chiar în cazul scurgerii bazei de date, parolele rămân protejate.
Nu toate funcțiile hash sunt la fel de potrivite pentru sarcini de securitate. Împărțirea în categorii criptografice și necriptografice este critică atunci când alegeți un algoritm pentru o sarcină specifică în dezvoltarea mobilă.
Aceste funcții sunt intenționat lente și complexe pentru a îngreuna atacurile prin forță brută. Ele trebuie să fie rezistente la coliziuni și atacuri de preimagine. Familia SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512) este certificată de NIST și recomandată pentru utilizare în sisteme guvernamentale. Pentru hashingul parolelor se aplică suplimentar algoritmii bcrypt, scrypt și Argon2 cu complexitate configurabilă.
Aceste funcții sunt optimizate pentru viteză, nu pentru securitate. Exemple: CityHash, MurmurHash, xxHash. Ele sunt utilizate în tabele hash, deduplicarea datelor și sume de control pentru verificarea rapidă a integrității datelor non-critice. Este important să nu le folosiți niciodată pentru stocarea parolelor sau verificarea semnăturilor digitale — viteza mare le face vulnerabile la atacurile prin forță brută.
| Tip | Exemple | Domeniu de aplicare |
|---|---|---|
| Criptografice | SHA-256, SHA-3, bcrypt | Parole, semnături, TLS |
| Necriptografice | MurmurHash, xxHash | Tabele hash, cache |
| KDF pentru parole | bcrypt, scrypt, Argon2 | Stocarea parolelor |
Să examinăm cei mai răspândiți algoritmi de hashing utilizați în dezvoltarea mobilă modernă. Fiecare dintre ei are puncte forte și slabe.
SHA-256 — simbol al criptografiei moderne, recomandat de NIST în cadrul standardului FIPS 180-4. Algoritmul produce un digest de 256 de biți și este componenta principală a protocoalelor TLS, rețelelor blockchain și sistemelor de control al versiunilor. Conform raportului NCC Group (2025), SHA-256 este utilizat în 96% din certificatele TLS pentru semnarea certificate transparency.
SHA-3 — cea mai nouă familie de funcții hash, standardizată de NIST în 2015 ca FIPS 202. Spre deosebire de SHA-2, construit pe structura Merkle–Damgård, SHA-3 se bazează pe o construcție diferită Keccak cu funcție burete. Acest lucru face SHA-3 rezistent la atacurile care ar putea apărea în viitor asupra SHA-2. Pentru dezvoltatorii mobili, SHA-3 este disponibil prin bibliotecile criptografice standard începând cu Android 7.0 și iOS 13.
import java.security.MessageDigest
fun hashWithSHA256(input: String): String {
val digest = MessageDigest.getInstance("SHA-256")
val hashBytes = digest.digest(input.toByteArray())
return hashBytes.joinToString("") { String.format("%02x", it) }
}
Pentru stocarea parolelor, hashurile criptografice generale nu sunt suficiente — sunt prea rapide. bcrypt a fost special conceput pentru hashingul parolelor: include sare și un parametru de cost care reglează timpul de calcul. Creșterea costului de 2 ori dublează timpul de hashing, făcând atacurile prin forță brută ineficiente chiar și pe echipamente puternice.
import at.favre.lib.crypto.bcrypt.BCrypt
fun hashPassword(password: String): String {
return BCrypt.create()
.hashToString(BCrypt.MIN_COST, password.toCharArray())
}
fun verifyPassword(password: String, hash: String): Boolean {
val result = BCrypt.verifyer().verify(password.toCharArray(), hash)
return result.verified
}
Argon2 — câștigătorul Password Hashing Competition (2015), recomandat de OWASP ca cea mai bună alegere pentru hashingul parolelor. Argon2id — varianta rezistentă la atacurile pe canale laterale și atacurile time-memory trade-off. Spre deosebire de bcrypt, Argon2 permite configurarea separată a timpului de execuție, utilizării memoriei și gradului de paralelism, oferind o protecție flexibilă împotriva diferitelor tipuri de atacuri.
Hashingul rezolvă multe sarcini practice în dezvoltarea mobilă — de la autentificarea utilizatorilor până la verificarea integrității fișierelor descărcate. Să examinăm scenariile cheie de utilizare.
Scenariul principal — stocarea sigură a parolelor pe partea de server. La înregistrare, aplicația trimite parola pe server, unde este hashuită cu sare folosind algoritmul bcrypt sau Argon2 și stocată în baza de date. La autentificare, serverul hash-uiește parola introdusă și o compară cu hashul stocat. OWASP recomandă utilizarea Argon2id cu parametrii: timp 2 secunde, memorie 64 MB, grad de paralelism 4.
La descărcarea fișierelor mari, cum ar fi pachetele OBB sau actualizările de conținut, aplicațiile mobile pot verifica integritatea acestora prin hashing. Serverul publică hashul SHA-256 al fișierului, iar aplicația calculează hashul datelor descărcate și le compară. Aceasta garantează că fișierul nu a fost deteriorat sau înlocuit în timpul transmisiei. Conform Google Play Console (2025), verificarea hashurilor aplicațiilor certificate previne până la 99.9% din atacurile de descărcare deteriorată.
Hashurile sunt utilizate activ pentru construirea de cache-uri eficiente și deduplicarea datelor. Adresa imaginii sau răspunsul JSON este hashuit și utilizat ca cheie de cache: la o solicitare repetată, sistemul compară hashurile și returnează rezultatul salvat dacă datele nu s-au schimbat. Pentru această sarcină sunt potrivite funcțiile hash necriptografice, cum ar fi MurmurHash sau xxHash, care oferă performanță maximă.
import java.security.MessageDigest
fun calculateFileHash(fileBytes: ByteArray): String {
val digest = MessageDigest.getInstance("SHA-256")
val hash = digest.digest(fileBytes)
return hash.joinToString("") { String.format("%02x", it) }
}
fun verifyIntegrity(data: ByteArray, expectedHash: String): Boolean {
val actualHash = calculateFileHash(data)
return actualHash == expectedHash
}
Chiși dezvoltatorii experimentați fac greșeli atunci când lucrează cu hashingul. Să examinăm cele mai frecvente probleme care pot anula toate avantajele protecției criptografice.
MD5 și SHA-1 — algoritmi învechiți pentru care există atacuri practice de coliziune. MD5 a fost spart în 2004 de un grup de cercetători chinezi (coliziune într-o oră). SHA-1 a fost spart în 2017 de echipa Google și Centrum Wiskunde & Informatica (atacul SHAttered). Utilizarea acestor algoritmi în proiecte noi este considerată o eroare gravă de securitate conform clasificării OWASP.
Hashingul parolelor fără sare — o vulnerabilitate critică. Sarea este un șir aleator, unic pentru fiecare utilizator, care este adăugat parolei înainte de hashing. Fără sare, două parole identice vor produce același hash, permițând utilizarea tabelelor curcubeu pentru forțarea brută. OWASP recomandă utilizarea unei sări puternice din punct de vedere criptografic cu o lungime de cel puțin 32 de octeți, generată separat pentru fiecare utilizator.
Chiși atunci când utilizați bcrypt sau Argon2, puteți slăbi protecția alegând un parametru de cost prea scăzut. Conform OWASP (2025), numărul minim de iterații bcrypt trebuie să fie 10 (2^10 = 1024 de iterații), iar pentru Argon2id — timpul de calcul de cel puțin 1 secundă pe platforma țintă. Parametrii prea scăzuți fac atacurile prin forță brută practic realizabile pe ferme de GPU.
Întrebări frecvente
Hashingul — un proces unidirecțional al cărui rezultat nu poate fi transformat înapoi în date originale. Criptarea este un proces bidirecțional: datele criptate pot fi decriptate cu ajutorul unei chei. Hashingul este utilizat pentru stocarea parolelor și verificarea integrității, criptarea — pentru transmiterea confidențială a datelor între client și server.
OWASP recomandă Argon2id ca cea mai bună alegere pentru hashingul parolelor datorită protecției configurabile împotriva atacurilor GPU și a atacurilor pe canale laterale. Alternative: bcrypt (testat și ușor de configurat), scrypt (rezistent la atacurile ASIC) și PBKDF2. SHA-256 și SHA-512 nu sunt potrivite pentru parole — sunt prea rapide și nu protejează împotriva forțării brute în masă.
Coliziunea — situația în care două seturi diferite de date de intrare produc același hash. Pentru funcțiile hash criptografice, găsirea coliziunilor trebuie să fie imposibilă din punct de vedere computațional. De exemplu, probabilitatea de coliziune SHA-256 pentru două mesaje aleatoare este de aproximativ 1 la 2^128 — o valoare neglijabil de mică.
Nu, bcrypt include automat sarea în algoritmul său. La apelarea BCrypt.hashToString(), biblioteca generează o sare puternică criptografic de 16 octeți și o încorporează în șirul de ieșire împreună cu hashul și parametrul de cost. Scrypt și Argon2 funcționează similar. Acesta este unul dintre motivele pentru care experții recomandă utilizarea KDF specializate în locul funcțiilor hash generale pentru protecția parolelor.
Da, hashurile sunt utilizate pentru crearea listelor albe și negre de fișiere. Bazele de date antivirus conțin hashuri ale programelor malware cunoscute. Cu toate acestea, atacatorii pot modifica un octet în program, ceea ce va schimba complet hashul. De aceea, sistemele moderne utilizează hashing fuzzy (SSDeep, TLSH), care găsește fișiere similare semantic, nu doar potriviri exacte.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și