Hashingul se referă la procesul de generare a unei ieșiri de dimensiune fixă dintr-o intrare de dimensiune variabilă. Acest lucru se realizează prin utilizarea formulelor matematice cunoscute sub numele de funcții hash (implementate ca algoritmi de hashing).
Deși nu toate funcțiile hash implică utilizarea criptografiei, așa-numitele funcții hash criptografice stau la baza criptomonedelor. Datorită acestora, blockchainurile și alte sisteme distribuite sunt capabile să atingă niveluri semnificative de integritate și securitate a datelor.
Atât funcțiile hash convenționale, cât și cele criptografice sunt deterministe. Faptul că sunt deterministe înseamnă că atât timp cât intrarea nu se modifică, algoritmul de hashing va produce întotdeauna aceeași ieșire (cunoscută și sub numele de digest sau hash).
De obicei, algoritmii de hashing ai criptomonedelor sunt concepuți ca funcții unidirecționale, ceea ce înseamnă că nu pot fi inversați cu ușurință fără cantități mari de timp și resurse de calcul. Cu alte cuvinte, este destul de ușor să creezi ieșirea din intrare, dar relativ dificil să mergi în direcția opusă (pentru a genera intrarea numai din ieșire). În general, cu cât este mai dificil să găsești intrarea, cu atât algoritmul de hashing este considerat a fi mai sigur.
Cum funcționează o funcție hash?
Funcțiile hash diferite vor produce ieșiri de dimensiuni diferite, dar dimensiunile posibile de ieșire pentru fiecare algoritm de hash sunt întotdeauna constante. De exemplu, algoritmul SHA-256 poate produce numai ieșiri de 256 de biți, în timp ce SHA-1 va genera întotdeauna un digest de 160 de biți.
Pentru a ilustra, să rulăm cuvintele „Binance” și „binance” prin algoritmul de hashing SHA-256 (cel folosit în Bitcoin).
Rețineți că o modificare minoră (scrierea cu majusculă a primei litere) a dus la o valoare hash total diferită. Dar, deoarece folosim SHA-256, ieșirile vor avea întotdeauna o dimensiune fixă de 256 de biți (sau 64 de caractere) - indiferent de dimensiunea intrării. De asemenea, nu contează de câte ori rulăm cele două cuvinte prin algoritm, cele două ieșiri vor rămâne constante.
În schimb, dacă rulăm aceleași intrări prin algoritmul de hashing SHA-1, vom avea următoarele rezultate:
Acronimul SHA înseamnă Secure Hash Algorithms. Se referă la un set de funcții hash criptografice care includ algoritmii SHA-0 și SHA-1 împreună cu grupurile SHA-2 și SHA-3. SHA-256 face parte din grupul SHA-2, împreună cu SHA-512 și alte variante. În prezent, doar grupurile SHA-2 și SHA-3 sunt considerate sigure.
De ce contează acestea?
Funcțiile hash convenționale au o gamă largă de cazuri de utilizare, inclusiv căutări în baze de date, analize de fișiere mari și gestionarea datelor. Pe de altă parte, funcțiile hash criptografice sunt utilizate pe scară largă în aplicațiile de securitate a informațiilor, cum ar fi autentificarea mesajelor și amprentele digitale. Când vine vorba de Bitcoin, funcțiile hash criptografice sunt o parte esențială a procesului de minerit și joacă, de asemenea, un rol în generarea de noi adrese și chei.
Adevărata putere a hashingului vine atunci când aveți de-a face cu cantități enorme de informații. De exemplu, se poate rula un fișier mare sau un set de date printr-o funcție hash și apoi se poate folosi rezultatul acestuia pentru a verifica rapid acuratețea și integritatea datelor. Acest lucru este posibil datorită naturii deterministe a funcțiilor hash: intrarea va avea întotdeauna ca rezultat o ieșire simplificată, condensată (hash). O astfel de tehnică elimină nevoia de a stoca și „reține” cantități mari de date.
Hashingul este deosebit de util în contextul tehnologiei blockchain. Blockchainul Bitcoin are mai multe operațiuni care implică hashing, majoritatea în cadrul procesului de minerit. De fapt, aproape toate protocoalele de criptomonede se bazează pe hashing pentru a conecta și a condensa grupuri de tranzacții în blocuri și, de asemenea, pentru a produce linkuri criptografice între toate blocurile, creând efectiv un blockchain.
Funcții hash criptografice
Din nou, o funcție hash care implementează tehnici criptografice poate fi definită ca o funcție hash criptografică. În general, întreruperea unei funcții hash criptografice necesită o multitudine de încercări de forță brută. Pentru ca o persoană să „inverseze” o funcție hash criptografică, ar trebui să ghicească care a fost intrarea prin încercare și eroare, până când este produs rezultatul corespunzător. Cu toate acestea, există și posibilitatea ca intrări diferite să producă exact aceeași ieșire, caz în care are loc o „coliziune”.
Din punct de vedere tehnic, o funcție hash criptografică trebuie să urmeze trei proprietăți pentru a fi considerată cu adevărat sigură. Le putem descrie ca rezistență la coliziune, rezistență la preimagine și rezistență la a doua preimagine.
Înainte de a discuta fiecare proprietate, să rezumăm logica lor în trei propoziții scurte.
Rezistența la coliziune: imposibil de găsit oricare două intrări distincte care produc același hash ca ieșire.
Rezistența la preimagine: imposibil de „inversat” funcția hash (găsiți intrarea de la o ieșire dată).
Rezistența la a doua preimagine: imposibil de găsit orice a doua intrare care se ciocnește cu o intrare specificată.
Rezistenta la coliziune
După cum s-a menționat, o coliziune are loc atunci când intrări diferite produc exact același hash. Astfel, o funcție hash este considerată rezistentă la coliziune până în momentul în care cineva găsește o coliziune. Rețineți, coliziunile vor exista întotdeauna pentru orice funcție hash, deoarece intrările posibile sunt infinite, în timp ce ieșirile posibile sunt finite.
Cu alte cuvinte, o funcție hash este rezistentă la coliziuni atunci când posibilitatea de a găsi o coliziune este atât de mică, încât ar necesita milioane de ani de calcule. Deci, în ciuda faptului că nu există funcții hash fără coliziuni, unele dintre ele sunt suficient de puternice pentru a fi considerate rezistente (de exemplu, SHA-256).
Printre diferiții algoritmi SHA, grupurile SHA-0 și SHA-1 nu mai sunt sigure deoarece au fost găsite coliziuni. În prezent, grupurile SHA-2 și SHA-3 sunt considerate rezistente la coliziuni.
Rezistența la preimagine
Proprietatea de rezistență la preimagine este legată de conceptul de funcții unidirecționale. O funcție hash este considerată rezistentă la preimagine atunci când există o probabilitate foarte scăzută ca cineva să găsească intrarea care a generat o anumită ieșire.
Rețineți că această proprietate este diferită de cea anterioară, deoarece un atacator ar încerca să ghicească intrarea uitându-se la o anumită ieșire. O coliziune, pe de altă parte, are loc atunci când cineva găsește două intrări diferite care generează aceeași ieșire, dar nu contează ce intrări au fost utilizate.
Proprietatea de rezistență la preimagine este valoroasă pentru protejarea datelor, deoarece un simplu hash al unui mesaj poate dovedi autenticitatea acestuia, fără a fi necesar să dezvăluie informațiile. În practică, mulți furnizori de servicii și multe aplicații web stochează și folosesc hashuri generate din parole, mai degrabă decât parolele în text simplu.
Rezistență la a doua preimagine
Pentru a simplifica, putem spune că rezistența la a doua preimagine se află undeva între celelalte două proprietăți. Un atac de a doua preimagine are loc atunci când cineva poate să găsească o anumită intrare care generează aceeași ieșire a unei alte intrări pe care o cunoaște deja.
Cu alte cuvinte, un atac de a doua preimagine implică găsirea unei coliziuni, dar în loc să caute două intrări aleatorii care generează același hash, caută o intrare care generează același hash care a fost generat de o altă intrare specifică.
Prin urmare, orice funcție hash care este rezistentă la coliziuni este, de asemenea, rezistentă la atacurile de a doua preimagine, deoarece acestea din urmă vor implica întotdeauna o coliziune. Totuși, se poate efectua un atac de preimagine asupra unei funcții rezistente la coliziune, deoarece implică găsirea unei singure intrări de la o singură ieșire.
Minerit
Există mulți pași în mineritul Bitcoin care implică funcții hash, cum ar fi verificarea soldurilor, conectarea intrărilor și ieșirilor tranzacțiilor și tranzacții de hashing într-un bloc pentru a forma un Arbore Merkle. Dar unul dintre principalele motive pentru care blockchainul Bitcoin este sigur este faptul că minerii trebuie să efectueze o multitudine de operațiuni de hashing pentru a găsi în cele din urmă o soluție validă pentru următorul bloc.
Mai exact, un miner trebuie să încerce mai multe intrări diferite atunci când creează o valoare hash pentru blocul său candidat. În esență, aceștia își vor putea valida blocul numai dacă generează un hash de ieșire care începe cu un anumit număr de zerouri. Numărul de zerouri este cel care determină dificultatea mineritului și variază în funcție de rata de hash dedicată rețelei.
În acest caz, rata de hash reprezintă cât de multă putere de calcul este investită în mineritul Bitcoin. Dacă rata de hash a rețelei crește, protocolul Bitcoin va ajusta automat dificultatea de minerit, astfel încât timpul mediu necesar pentru mineritul unui bloc să rămână aproape de 10 minute. În schimb, dacă mai mulți mineri decid să oprească mineritul, determinând o scădere semnificativă a ratei de hash, dificultatea mineritului va fi ajustată, simplificând mineritul (până când timpul mediu pentru bloc revine la 10 minute).
Rețineți că minerii nu trebuie să găsească coliziuni, deoarece există mai multe hashuri pe care le pot genera ca rezultat valid (începând cu un anumit număr de zerouri). Deci există mai multe soluții posibile pentru un anumit bloc, iar minerii trebuie să găsească doar una dintre ele - în funcție de pragul determinat de dificultatea de minerit.
Deoarece mineritul Bitcoin este o sarcină costisitoare, minerii nu au niciun motiv să înșele sistemul, deoarece acest lucru ar duce la pierderi financiare semnificative. Cu cât se alătură mai mulți mineri unui blockchain, cu atât acesta devine mai mare și mai puternic.
Gânduri de încheiere
Nu există nicio îndoială că funcțiile hash sunt instrumente esențiale în informatică, mai ales atunci când se ocupă cu cantități uriașe de date. Atunci când sunt combinați cu criptografia, algoritmii de hashing pot fi destul de versatili, oferind securitate și autentificare în multe moduri diferite. Ca atare, funcțiile hash criptografice sunt vitale pentru aproape toate rețelele de criptomonede, așa că înțelegerea proprietăților și mecanismelor de lucru ale acestora este cu siguranță utilă pentru oricine este interesat de tehnologia blockchain.