Ce este hashing-ul? – Descriere și cele mai importante calități

a hashelés kriptopénz hírek mycryptoption

În primul rând, hashing-ul generează o valoare (sau valori) dintr-un șir de caractere sau texte, cu ajutorul unei funcții matematice. În al doilea rând, hashing-ul este un mijloc de asigurare a securității pe parcursul procesului de transmitere a mesajului, atunci când mesajul este adresat doar unui anumit destinatar. O formulă generează hash-ul, care ajută ca transmisia să fie sigură, protejată împotriva manipulării.

Este important să știm cum funcționează hashing-ul blockchain. În vederea acesteia, va trebui să înțelegem un principiu de bază care contribuie la crearea blockchain. Tehnologia blockchain este una dintre cele mai inovative și definitorii descoperiri ale secolului trecut. Văzând influența pe care a exercitat-o în ultimii ani și impactul care este așteptat în viitor, cu siguranță nu este exagerat să afirmăm acest lucru.

În termeni simpli

Mai simplu spus, hashing înseamnă a lua un șir de intrare oricât de lung, care ne va da o ieșire de lungime fixă. În contextul criptomonedelor ca Bitcoin de exemplu, considerăm tranzacțiile ca fiind intrări, care după ce trec printr-un algoritm de hashing (Bitcoin utilizează SHA-256) ne oferă o ieșire de lungime fixă.

Să vedem cum funcționează procesul. Ca exemplu vom lua SHA-256 (Secure Hashing Algorithm 256). În cazul SHA-256, indiferent de cât de lungă sau scurtă este intrarea, ieșirea va avea întotdeauna o lungime fixă de 256 biți. Acest lucru devine critic atunci când avem de-a face cu o cantitate imensă de date și tranzacții. Deci, în principiu, în locul memorării datelor de intrare ce pot fi uriașe, putem reține doar hash-ul pentru a-l putea urmări. Înainte de-a trece mai departe, trebuie să verificăm diferitele caracteristici ale funcțiilor hash și modul în care sunt integrate în blockchain.

Funcții hash criptografice

hashing

Funcția de hash criptografic reprezintă o clasă specială a funcțiilor hash, ce are diverse calități care o recomandă pentru domeniul criptografiei. Există câteva proprietăți pe care trebuie să le posede o funcție de hash criptografic pentru a putea fi considerată sigură:

1. Calitate: Determinism

Asta înseamnă că indiferent de câte ori vei analiza o intrare prin funcția hash, vei obține mereu acelașoi rezultat. Are o importanță deosebită deoarece dacă ai obține hash-uri diferite de fiecare dată, intrarea ar putea fi imposibilă de urmărit.

2. Calitate: Calcul rapid

Funcția hash trebuie să fie capabilă să ne furnizeze rapid hash-ul de intrare. Dacă procesul nu este destul de rapid, pur și simplu sistemul nu va fi eficient.

3. Calitate: Rezistența pre-image

Starea de rezistență pre-image este cea în care într-un H (A) dat nu putem stabili A-ul, unde A este intrarea și H (A) hash-ul de ieșire. Să presupunem că aruncăm un zar, iar ieșirea va fi hash-ul numărului pe care îl arată zarul. Cum vom putea determina care a fost numărul inițal? Tot ce trebuie să facem este să aflăm hash-ul numerelor de la 1 la 6 și să le comparăm. Fiindcă funcțiile hash sunt deterministe, hash-ul unei intrări anume va fi întotdeauna același; astfel, trebuie doar să comparăm hash-urile și să aflăm intrarea inițială.

Totuși, acest lucru funcționează doar în cazul în care cantitatea de date furnizate este mică. Ce se întâmplă dacă există o mare cantitate de date? Să presupunem că avem de-a face cu un hash de 128 biți. Singura metodă prin care putem afla intrarea inițială este „metoda forței brute” (brute-force method). Aceasta înseamnă că trebuie să alegem o intrare aleatorie, să-i aplicăm hash-ul și apoi să comparăm ieșirea cu hash-ul țintă, repetând procesul până găsim o potrivire.

Ce se întâmplă dacă utilizăm această metodă?

În cel mai bun caz, vei găsi răspunsul încă de la prima încercare. Ar trebui să fii însă cel mai norocos om de pe planetă ca acest lucru să se întâmple. Șansele ca să reușești din prima sunt infime.

În cazul cel mai rău, vei afla răspunsul după 2 ^ 128 – 1 ocazii. În principiu, asta înseamnă că răspunsul se află sfârșitul tuturor datelor.

Conform unui scenariu mediu, îl vei găsi undeva pe la mijloc, cam după 2 ^ 128/2 = 2 ^ 127 ocazii. În vederea punerii în perspectivă, 2 ^ 127 = 1,7 X 10 ^ 38. Cu alte cuvinte, este un număr uriaș. Așadar, chiar dacă putem sparge rezistența pre-image prin metoda forței brute, necesită atât de mult timp încât nu merită să încercăm.

4. Calitate: Micile schimbări ale datelor de intrare modifică hash-ul

Chiar dacă efectuăm doar mici modificări asupra intrării, schimbările reflectate în hash vor fi uriașe. Este o funcție critică fiindcă această proprietate a hashing-ului duce la una dintre cele mai importante calități ale blockchain, imuabilitatea.

5. Calitate: Rezistență la coliziuni

Luând două intrări diferite A și B, unde H (A) și H (B) sunt hash-urile care le corespund, este imposibil ca H (A) să fie egal cu H (B). Asta înseamnă că în cea mai mare parte, fiecare intrare va avea propriul hash unic. De ce spunem „în mare parte”? Să vedem un concept interesant, care se numește “The Birthday Paradox” (paradoxul zilei de naștere).

Ce este paradoxul zilei de naștere?

Dacă întâlnești un străin pe stradă, există șanse foarte mici ca amândoi să fiți născuți în aceeași zi. De fapt, dacă presupunem că toate zilele din an au aceeași probabilitate de a avea o zi de naștere, șansele ca cealaltă persoană să-și împartă cu tine ziua sa de naștere sunt de 1/365, deci 0,27%. Cu alte cuvinte, foarte mică.

Dar după ce adunăm 20-30 de persoane într-o cameră, șansa ca doi dintre ei să fie născuți în aceeași zi crește considerabil. De fapt, în acest scenariu există 50% șanse ca doi oameni să împartă aceeași zi de naștere.

Cum se întâmplă asta? Simplu, se datorează unei reguli simple referitoare la probabilitate, care este următoarea. Să presupunem că există N posibilități ca un eveniment să aibă loc; în acest caz, avem nevoie de rădăcină pătrată de N elemente aleatorii pentru ca potrivirea să aibă o șansă de 50%.

Astfel, dacă aplicăm această teorie pentru zilele de naștere, avem 365 de posibilități diferite; deci avem nevoie numai de Sqrt(365), egală cu ~ 23 ~, oameni aleși la întâmplare cu 50% șanse ca doi dintre aceștia să îmaprtă aceeași zi de naștere.

Cum aplicăm asta în hashing?

Să presupunem că avem un hash de 128 biți care dispune de 2 ^ 128 posibilități diferite. Utilizând paradoxul zilei de naștere, avem o șansă de 50% să spargem rezistența la coliziune în cazul SQRT(2 ^ 128) = 2 ^ 64. După cum vezi, este mult mai ușor să spargem rezistența la coliziune decât pe cea pre-image. Nicio funcție hash nu este lipsită de coliziuni, dar în general necesită foarte mult timp până o găsim. Deci dacă utilizăm o funcție precum SHA-256, putem presupune sigur: dacă H (A) = H (B), atunci A = B.

6. Calitate: E prietenoasă față de puzzle

Este o calitate remarcabilă, iar impactul pe care l-a avut asupra criptomonedelor este uriaș. Așadar, pentru fiecare ieșire Y, dacă k este ales dintr-o distribuție cu o entropie min-max, este imposibil de găsit o intrare x unde H (k | x) = Y. Ce înseamnă „entropia mică-mare”? Înseamnă că distribuția din care a fost aleasă valoarea este atât de distribuită încât alegerea unei valori aleatorii va avea o probabilitate neglijabilă. Fundamental, dacă ți se spune să alegi un număr între 1 și 5, aceasta este o distribuție minimă de entropie. Însă dacă trebuie să alegem un număr între 1 și un milion, aceasta este o distribuție maximă de entropie.

Ce înseamnă „k | x”? „|” indică concatenarea, care înseamnă adunarea laolaltă a două șiruri. De exemplu, dacă legăm „SUPER” de „EROU”, va rezulta „SUPEREROU”. Să presupunem că valoarea ieșirii este „Y”. Dacă alegem aleatorie „k” dintr-o distribuție largă, este imposibil să găsim o valoare X unde hash-ul concatenării k și x să ne dea ieșirea Y. De fapt, întregul proces al minatului funcționează astfel.

Exemple de funcții hash criptografice

MD 5: produce un hash de 128 biți. Rezistența la coliziune a fost ruptă după ~ 2 ^ 21 hash-uri.

SHA 1: produce un hash de 160 biți. Rezistența la coliziune s-a rupt după ~ 2 ^ 61 hash-uri.

SHA 256: produce un hash de 256 biți. Folosit în prezent de Bitcoin.

Keccak-256: produce un hash de 256 biți pe care-l folosește în prezent Ethereum.

Structura de date este un mod special de stocare a datelor. Există două proprietăți ale structurii de date care sunt esențiale dacă dorești să înțelegi cum funcționează blockchain-ul. Acestea sunt următoarele:

  • Pointeri (indicatori) – variabile în programare care stochează adresa altei variabile. De obicei, variabilele normale ale limbajelor de programare stochează datele. De exemplu, dacă int a = 10, înseamnă că avem o variabilă „a” care stochează valori întregi. În acest caz, această valoare este 10. Aceasta este o variabilă normală. Însă pointerii, în loc să stocheze valorile, vor stoca adresele altor variabile. Acesta este motivul pentru care se numesc pointeri, deoarece indică literalmente locația altor variabile.
  • Liste conectate (linked lists) – unul dintre cele mai importante elemente din structura de date. Lista conectată este o secvență de blocuri, fiecare conținând date care sunt legate de următorul bloc printr-un pointer. Variabila pointer conține adresa următorului nod, iar în acest fel se realizează conexiunea.
Un lucru important de notat este că pointerul din interiorul fiecărui bloc conține adresa următorului bloc.

În acest fel este realizat pointing-ul. Poate te întrebi ce înseamnă asta pentru primul bloc din listă? Unde rămâne pointerul primului bloc? Primul bloc se cheamă „genesis” (genesis block), iar pointerul său se află în sistem. Probabil ați ghicit deja, este exact pe ce se bazează structura blockchain.

Blockchain-ul este o listă conectată ce conține date și un pointer hash care indică blocul său anterior, creând astfel lanțul. Ce este un pointer hash (indicator hash)? Este asemenea unui pointer, dar în loc să conțină doar adresa blocului precedent, conține și hash-ul datelor din blocul precedent. Acest mic detaliu face ca blockchain-urile să fie atât de sigure și fiabile.

Imaginează-ți pentru o clipă: hackerul atacă blocul 3 și încearcă să modifice datele. Din cauza calităților funcțiilor hash, o ușoară modificare a datelor va schimba drastic hash-ul. Asta înseamnă că micile modificări operate în blocul 3 vor schimba datele și hash-ul blocului 2, ceea ce generează schimbări în blocul 1 și tot așa mai departe. Acest lucru schimbă în totalitate lanțul, ceea ce este imposibil. În acest fel ating blockchain-urile imuabilitatea. În concluzie, hashing-ul nu este un proces complicat; trebuie să cunoști doar pașii pe care-i presupune.

Mai multe articole