Cum funcționează

Funcțiile hash: amprenta digitală a datelor

Ce este o funcție hash, de ce aceeași intrare dă mereu aceeași amprentă, cum verifici un fișier descărcat și de ce parolele se stochează ca hash cu sare.

De Redacția LumeaTehnologiei10 min de citit
Ochi albastru stilizat înconjurat de cercuri digitale, simbol al identificării unice

O funcție hash este o procedură matematică ce primește orice date, de la un singur cuvânt la un film întreg, și produce un rezultat scurt, de lungime fixă, numit hash, rezumat sau amprentă. Ca amprenta unui deget, rezultatul identifică datele fără să le conțină: aceleași date dau mereu aceeași amprentă, iar o modificare cât de mică dă o amprentă complet diferită.

Funcțiile hash sunt printre cele mai folosite unelte din informatică, deși rareori le vezi. Ele verifică dacă un fișier descărcat este intact, păstrează parolele pe servere fără ca acestea să fie stocate citibil, stau la baza semnăturilor digitale și leagă blocurile unui blockchain. Mai jos afli cum funcționează, ce proprietăți trebuie să aibă, care algoritmi mai sunt siguri și ce nu poate face o funcție hash.

Ce este o funcție hash

O funcție hash este o „mașină de tocat” deterministă: intră orice, iese un număr cu un număr fix de biți. Rezultatul este scris de obicei în baza 16 (hexazecimal), cu cifrele 0–9 și literele a–f, fiecare caracter reprezentând 4 biți.

Algoritmul SHA-256, de exemplu, produce mereu 256 de biți, adică 64 de caractere hexazecimale, indiferent dacă intrarea are un octet sau o sută de gigaocteți. Amprenta cuvântului „mar” și cea a cuvântului „măr” nu au nimic în comun vizibil, deși diferă o singură literă.

O analogie din bucătărie

Gândește-te la un smoothie. Dacă pui în blender exact aceleași fructe, în aceleași cantități, obții de fiecare dată același gust și aceeași culoare. Dacă adaugi o singură boabă de afine, culoarea se schimbă vizibil. Și, oricât te-ai strădui, nu poți reface din pahar fructele întregi. Funcțiile hash fac același lucru, dar cu precizie absolută: amprenta este identică bit cu bit pentru aceeași intrare.

Funcții hash obișnuite și funcții hash criptografice

Nu orice funcție hash are pretenții de securitate. Funcțiile hash obișnuite, folosite în programare pentru a găsi rapid un element într-o listă, trebuie doar să fie rapide și să împrăștie uniform valorile. Funcțiile hash criptografice trebuie, în plus, să reziste unui adversar care încearcă intenționat să găsească amprente identice sau să ghicească intrarea. Restul articolului se referă mai ales la acestea.

Proprietățile unei funcții hash criptografice

O funcție hash criptografică bună are cinci proprietăți esențiale, iar dacă oricare dintre ele cade, algoritmul este considerat compromis pentru utilizările de securitate.

ProprietateCe înseamnăDe ce contează
Determinismaceeași intrare dă mereu aceeași amprentăpermite verificarea ulterioară
Efect de avalanșăun bit schimbat modifică aproximativ jumătate din biții amprenteinicio modificare nu trece neobservată
Rezistență la preimaginedin amprentă nu se poate găsi intrareaprotejează parolele și datele ascunse
Rezistență la a doua preimaginepentru o intrare dată, nu se poate găsi alta cu aceeași amprentăun document nu poate fi înlocuit cu unul fals
Rezistență la coliziuninu se pot găsi două intrări oarecare cu aceeași amprentăsemnăturile digitale rămân de încredere

Coliziunile există, dar nu trebuie să poată fi găsite

Pentru că numărul de intrări posibile este infinit, iar numărul de amprente este finit, coliziunile există obligatoriu: undeva, două intrări diferite au aceeași amprentă. Este principiul cutiei: dacă ai mai mulți porumbei decât cuști, cel puțin o cușcă va avea doi porumbei. Cerința de securitate nu este ca coliziunile să nu existe, ci ca nimeni să nu le poată găsi cu un efort realist. Pentru o amprentă de 256 de biți, ai avea nevoie, în medie, de aproximativ 2 la puterea 128 de încercări, un număr de neatins.

Familii de algoritmi: care mai sunt sigure

Algoritmii hash îmbătrânesc: pe măsură ce cercetătorii găsesc scurtături matematice și calculatoarele devin mai puternice, unii devin nesiguri pentru securitate. Iată situația celor mai cunoscuți.

AlgoritmLungimea amprenteiStare pentru securitateUnde îl mai întâlnești
MD5128 de biți (32 de caractere hex)spart, coliziuni găsite ușorsume de control vechi, fără rol de securitate
SHA-1160 de biți (40 de caractere)spart, coliziuni demonstrate practicsisteme vechi, în retragere
SHA-256 / SHA-512 (familia SHA-2)256 / 512 bițisigurcertificate, semnături, blockchain, verificări de fișiere
SHA-3224–512 bițisigur, construcție diferităalternativă standardizată la SHA-2
BLAKE2 / BLAKE3variabilăsigur, foarte rapidprograme moderne, verificări rapide

Familiile SHA-2 și SHA-3 sunt standardizate de institutul american de standarde NIST și folosite pe scară largă în întreaga lume. MD5 și SHA-1 mai pot servi pentru a detecta erori accidentale de transmisie, dar nu trebuie folosite acolo unde un adversar ar avea interes să falsifice datele.

Important: Faptul că un algoritm vechi apare încă pe un site ca „sumă de control” nu înseamnă că este greșit pentru acel scop. Contează dacă amprenta trebuie să reziste doar la erori întâmplătoare sau și la falsificare intenționată.

Verificarea integrității fișierelor

Cea mai la îndemână utilizare a funcțiilor hash este verificarea că un fișier descărcat este exact cel publicat de autor. Mulți dezvoltatori de software afișează pe pagina de descărcare amprenta SHA-256 a fiecărui fișier.

Pașii verificării

  1. Descarcă fișierul de pe site-ul oficial al proiectului.
  2. Notează amprenta SHA-256 publicată pe aceeași pagină sau, mai bine, într-un fișier semnat digital.
  3. Calculează amprenta fișierului descărcat cu un utilitar din linia de comandă a sistemului tău de operare; toate sistemele moderne au o comandă dedicată pentru SHA-256.
  4. Compară cele două șiruri. Nu e nevoie să le citești pe tot: diferența apare de obicei din primele caractere, dar verifică măcar începutul și sfârșitul.
  5. Dacă diferă, nu deschide fișierul: e corupt sau a fost înlocuit.

Limita metodei

Dacă un atacator controlează site-ul de unde descarci, poate înlocui atât fișierul, cât și amprenta afișată. Amprenta te apără de descărcări corupte și de oglinzi compromise, dar pentru a fi sigur de autor ai nevoie de o semnătură digitală, explicată în ghidul despre criptografie.

Sfat: Când copiezi o amprentă pentru comparație, lipește-o în aceeași fereastră de text cu amprenta calculată, una sub alta. Ochii prind mult mai ușor o diferență când caracterele sunt aliniate.

Cum stochează site-urile parolele

Un site bine construit nu păstrează parola ta, ci doar o amprentă a ei, calculată cu o funcție special concepută pentru parole. La autentificare, site-ul calculează amprenta parolei pe care ai tastat-o și o compară cu cea stocată. Dacă baza de date este furată, hoții obțin amprente, nu parole.

Sarea: ingredientul care face diferența

Dacă două persoane au aceeași parolă, ar avea aceeași amprentă, iar atacatorii ar putea folosi tabele precalculate cu amprentele a milioane de parole frecvente (numite rainbow tables). Soluția este sarea (salt): un șir aleatoriu, unic pentru fiecare cont, adăugat la parolă înainte de calcul. Sarea nu e secretă, dar face ca fiecare amprentă să fie diferită și tabelele precalculate să devină inutile.

Funcții lente intenționat

Pentru parole, viteza mare este un defect: un atacator cu plăci grafice puternice poate încerca miliarde de amprente SHA-256 pe secundă. De aceea se folosesc funcții de derivare a cheilor, încetinite deliberat și, uneori, mari consumatoare de memorie, precum bcrypt, scrypt sau Argon2. O verificare durează o fracțiune de secundă pentru tine, dar înmulțită cu miliarde de încercări devine prohibitivă pentru atacator.

Metodă de stocareCe obține atacatorul la o scurgere de dateNivel de protecție
Parolă în clarparolele directniciunul
Hash rapid, fără sareparolele frecvente aproape instant, prin tabelefoarte slab
Hash rapid, cu saretrebuie să ghicească parolă cu parolă, dar foarte repedeslab spre mediu
Funcție lentă cu sareghicire foarte lentă, pe fiecare cont separatbun

Totuși, nicio funcție nu salvează o parolă de tipul „parola123”, ghicită din primele încercări. De aceea parolele lungi și unice rămân esențiale, cum explicăm în ghidul despre parole puternice și managerele de parole.

Programator care lucrează noaptea la mai multe monitoare cu linii de cod

Hash-urile în semnăturile digitale și în blockchain

Semnăturile digitale nu semnează documentul întreg, ci amprenta lui. Este mult mai eficient să semnezi 256 de biți decât sute de pagini, iar securitatea rămâne aceeași, cu condiția ca funcția hash să reziste la coliziuni. Dacă un atacator ar putea crea două documente cu aceeași amprentă, unul nevinovat și unul fraudulos, ar putea obține semnătura pe primul și ar folosi-o pentru al doilea. Exact acesta a fost motivul pentru care MD5 și SHA-1 au fost retrase din certificatele digitale.

În blockchain, fiecare bloc conține amprenta blocului anterior. Modificarea unei tranzacții vechi i-ar schimba amprenta, ceea ce ar rupe legătura cu blocul următor și cu toate cele de după. Funcțiile hash sunt folosite și în mecanismul de consens numit „dovadă de lucru”, în care participanții caută o amprentă care începe cu un anumit număr de zerouri. Detalii în ghidul despre blockchain.

Arborii de amprente

O tehnică ingenioasă este arborele Merkle: amprentele multor elemente sunt grupate două câte două, se calculează amprenta fiecărei perechi și așa mai departe, până rămâne o singură amprentă-rădăcină. Cu ea poți dovedi că un element face parte dintr-un set uriaș prezentând doar câteva amprente intermediare, nu întregul set. Arborii Merkle sunt folosiți în blockchain, în sistemele de control al versiunilor pentru cod și în sincronizarea eficientă a fișierelor.

Alte utilizări: deduplicare, tabele hash, detectarea modificărilor

Funcțiile hash apar și în locuri mai puțin vizibile, unde ajută la economisirea spațiului și a timpului.

  • Deduplicarea în stocare: serviciile de stocare pot calcula amprenta fiecărui bloc de date și păstrează o singură copie din blocurile identice. Despre unde ajung fizic fișierele găsești mai multe în articolul despre stocarea în cloud.
  • Tabelele hash: structuri de date care găsesc o valoare aproape instant, folosind amprenta cheii ca adresă. Stau la baza indexurilor din multe baze de date.
  • Detectarea modificărilor: programele de backup și de sincronizare compară amprentele fișierelor ca să trimită doar ce s-a schimbat.
  • Identificarea conținutului cunoscut: programele antivirus compară amprentele fișierelor cu liste de amprente ale programelor malițioase deja identificate.
  • Verificarea copiilor de probă: în expertizele informatice, amprenta unui disc copiat dovedește că dovada nu a fost modificată ulterior.

Există și amprente perceptuale, folosite pentru imagini și sunete, care funcționează invers: dau rezultate asemănătoare pentru conținut asemănător, ca să recunoască aceeași poză redimensionată sau recomprimată. Ele nu sunt funcții hash criptografice și au alt scop.

Ce nu poate face o funcție hash

O funcție hash nu este o metodă de criptare și nu ascunde automat datele. Confuzia este frecventă și duce la greșeli de proiectare.

  • Nu se poate „decripta”: amprenta nu conține datele, deci nu există cheie care să le refacă. Serviciile online care pretind că „decriptează” hash-uri doar caută amprenta în baze uriașe de valori deja calculate.
  • Nu protejează datele previzibile: dacă intrarea face parte dintr-un set mic, precum numerele de telefon sau codurile numerice personale, un atacator poate calcula amprentele tuturor valorilor posibile și le poate compara. O listă de numere de telefon „anonimizată” cu un hash simplu nu este, de fapt, anonimă.
  • Nu dovedește autorul: oricine poate calcula amprenta unui fișier. Pentru a dovedi cine l-a publicat e nevoie de o semnătură digitală.
  • Nu micșorează datele recuperabil: amprenta e scurtă, dar nu este o formă comprimată; pentru asta există tehnicile din ghidul despre compresia datelor.

Pentru a vedea cum se leagă funcțiile hash de restul mecanismelor, de la biți la aplicații, citește ghidul despre tehnologia digitală.

Pe scurt, despre amprenta datelor

Funcțiile hash transformă orice volum de date într-o amprentă scurtă, mereu aceeași pentru aceeași intrare și complet diferită la cea mai mică modificare. Ele nu ascund și nu comprimă datele, dar permit verificări extrem de rapide de integritate și stau la temelia parolelor stocate corect, a semnăturilor digitale și a registrelor distribuite.

De reținut:

  • amprenta are lungime fixă, indiferent de mărimea datelor;
  • MD5 și SHA-1 nu mai sunt sigure pentru securitate; SHA-256, SHA-3 și BLAKE sunt;
  • parolele se stochează cu sare și funcții lente, nu cu hash-uri rapide;
  • o amprentă publicată verifică integritatea, o semnătură verifică și autorul;
  • un hash simplu nu anonimizează datele previzibile.

Întrebări frecvente

Se poate afla parola dintr-un hash?

Nu direct, pentru că amprenta nu conține parola. Atacatorii pot însă ghici: calculează amprentele multor parole probabile și le compară, motiv pentru care parolele scurte sau des folosite sunt găsite rapid.

Ce diferență este între hash și criptare?

Criptarea este reversibilă cu cheia potrivită, iar hash-ul este o transformare într-un singur sens. Criptarea ascunde datele ca să poată fi citite mai târziu de cine are cheia; hash-ul creează doar o amprentă pentru comparații.

De ce două fișiere diferite nu au aceeași amprentă SHA-256?

Teoretic pot avea, dar probabilitatea este atât de mică încât nimeni nu a găsit vreodată o astfel de pereche. Pentru a găsi una intenționat ar fi nevoie de un efort de calcul imposibil cu tehnologia existentă.

Mai este bun MD5 pentru ceva?

Poate detecta erori accidentale, de exemplu un fișier corupt la copiere. Nu trebuie folosit acolo unde cineva ar avea interes să falsifice datele, pentru că se pot construi intenționat fișiere diferite cu aceeași amprentă MD5.

Ce este sarea în stocarea parolelor?

Sarea este un șir aleatoriu, unic pentru fiecare cont, adăugat parolei înainte de calcularea amprentei. Face ca două parole identice să aibă amprente diferite și anulează tabelele precalculate folosite de atacatori.

↑