Hashing är processen att generera utdata med fast storlek från indata av variabel storlek. Detta görs genom användningen av matematiska formler som kallas hashfunktioner (implementerade som hashingalgoritmer).
Även om inte alla hashfunktioner involverar användningen av kryptografi, är de så kallade kryptografiska hashfunktionerna kärnan i kryptovalutor. Tack vare dem kan blockkedjor och andra distribuerade system uppnå betydande nivåer av dataintegritet och säkerhet.
Både konventionella och kryptografiska hashfunktioner är deterministiska. Att vara deterministisk innebär att så länge indata inte ändras kommer hashingalgoritmen alltid att producera samma utdata (även kallat systematisering eller hash).
Vanligtvis är hashingalgoritmerna för kryptovalutor utformade som envägsfunktioner, vilket innebär att de inte bara kan återställas utan stora mängder datortid och resurser. Med andra ord är det ganska enkelt att skapa utdata från indata, men relativt svårt att gå i motsatt riktning (för att generera indata från enbart utdata). Generellt sett gäller att ju svårare det är att hitta indata, desto säkrare anses hashingalgoritmen vara.
Hur fungerar en hashfunktion?
Olika hashfunktioner producerar utdata av olika storlekar, men de möjliga utdatastorlekarna för varje hashingalgoritm är alltid konstanta. Till exempel kan SHA-256-algoritmen bara producera utdata på 256 bitar, medan SHA-1 alltid genererar en 160-bitars systematisering.
För att ta ett exempel kan vi låta köra orden "Binance" och "binance" genom SHA-256-hashalgoritmen (den som används i Bitcoin).
Observera att en mindre ändring (som att göra den första bokstaven liten eller stor) resulterade i ett helt annat hashvärde. Men eftersom vi använder SHA-256 kommer utdata alltid att ha en fast storlek på 256 bitar (eller 64 tecken) – oavsett storleken på indata. Det spelar ingen roll hur många gånger vi kör de två orden genom algoritmen, för dessa två utdata förblir konstanta.
Omvänt gäller att om vi kör samma indata genom SHA-1-hashalgoritmen, skulle vi få följande resultat:
Förkortningen SHA står för Secure Hash Algorithms. Den är en uppsättning kryptografiska hashfunktioner som inkluderar algoritmerna SHA-0 och SHA-1, tillsammans med grupperna SHA-2 och SHA-3. SHA-256 är en del av SHA-2-gruppen, tillsammans med SHA-512 och andra varianter. För närvarande anses endast grupperna SHA-2 och SHA-3 vara säkra.
Varför är de så viktiga?
Konventionella hashfunktioner har ett brett spektrum av användningsområden, inklusive databassökningar, stora filanalyser och datahantering. Å andra sidan används kryptografiska hashfunktioner i stor utsträckning i informationssäkerhetsapplikationer, såsom meddelandeautentisering och digitala fingeravtryck. När det gäller Bitcoin är kryptografiska hashfunktioner en viktig del av miningprocessen och spelar också en roll i genereringen av nya adresser och nycklar.
Den verkliga kraften i hashing blir uppenbar när man hanterar enorma mängder information. Till exempel kan man köra en stor fil eller uppsättning data genom en hashfunktion, och sedan använda dess utdata för att snabbt verifiera noggrannheten och integriteten hos dessa data. Detta är möjligt tack vare hashfunktionernas deterministiska natur: indata kommer alltid att resultera i en förenklad, kondenserad utdata (hash). Denna teknik tar bort behovet av att lagra och "komma ihåg" stora mängder data.
Hashing är särskilt användbart när det gäller blockkedjeteknik. Bitcoins blockkedja har flera operationer som involverar hashing, och de flesta av dem är inom utvinningsprocessen. Faktum är att nästan alla kryptovalutaprotokoll förlitar sig på hashing för att länka och kondensera grupper av transaktioner till block, och även för att producera kryptografiska länkar mellan varje block, vilket effektivt skapar en blockkedja.
Kryptografiska hashfunktioner
Som sagt kan en hashfunktion som distribuerar kryptografiska tekniker definieras som en kryptografisk hashfunktion. I allmänhet krävs det mängder av så kallade brute-force-försök innan man kan hacka en kryptografisk hashfunktion. För att en person ska kunna "återställa" en kryptografisk hashfunktion måste denne gissa indata genom att försöka igen och igen tills motsvarande utdata produceras. Det finns emellertid också en möjlighet att olika indata producerar exakt samma utdata, och då inträffar en "kollision".
Tekniskt sett måste en kryptografisk hashfunktion ha tre egenskaper för att anses vara effektiv och säker. Vi kan beskriva dem som kollisionsresistens, förbildsresistens och en andra förbildsresistens.
Innan vi går igenom varje egenskap kan vi sammanfatta deras logik i tre korta meningar.
Kollisionsresistens: omöjligt att hitta två distinkta indata som producerar samma hash som utdata.
Förbildsresistens: omöjligt att "återställa" hashfunktionen (hitta indata från given utdata).
En andra förbildsresistens: omöjligt att hitta några andra indata som kolliderar med angiven indata.
Kollisionsresistens
Som nämnts tidigare inträffar en kollision när olika indata producerar exakt samma hash. Därför anses en hashfunktion vara kollisionsresistens tills det ögonblicket då någon hittar en kollision. Observera att kollisioner alltid kommer att finnas för alla hashfunktioner, eftersom antalet möjliga indata är oändligt, medan antalet möjliga utdata inte är det.
En hashfunktion är med andra ord kollisionsresistens när möjligheten att hitta en kollision är så låg att det skulle kräva miljontals år av beräkningar. Så även om det inte finns några helt kollisionsfria hashfunktioner, är vissa tillräckligt starka för att betraktas som resistenta (till exempel SHA-256).
Bland de olika SHA-algoritmerna är grupperna SHA-0- och SHA-1 inte längre säkra, eftersom kollisioner har hittats. För närvarande anses grupperna SHA-2 och SHA-3 vara resistenta mot kollisioner.
Förbildsresistens
Att vara förbildsresistent är relaterat till begreppet envägsfunktioner. En hashfunktion anses vara förbildsresistent när det finns en mycket låg sannolikhet att någon hittar indata som genererade en viss utdata.
Observera att den här egenskapen skiljer sig från den föregående, eftersom en hackare skulle försöka gissa indata genom att titta på specifika utdata. En kollision inträffar å andra sidan när någon hittar två olika indata som genererar samma utdata, men det spelar ingen roll vilka indata som användes.
Egenskapen förbildsresistens är värdefull för att skydda data, eftersom en enkel hash av ett meddelande kan bevisa dess äkthet utan att behöva avslöja informationen. I praktiken lagrar och använder många tjänsteleverantörer och webbapplikationer hashvärden som genereras från lösenord, snarare än själva lösenorden.
En andra förbildsresistens
För att förenkla det kan vi säga att den andra förbildsresistensen ligger någonstans mellan de andra två egenskaperna. En andra förbildsattack inträffar när någon kan hitta specifika indata som genererar samma utdata från andra indata som de redan känner till.
Med andra ord innebär en andra förbildsattack att hitta en kollision, men istället för att söka efter två slumpmässiga indata som genererar samma hash, söker de efter indata som genererar samma hash som genererades av annan specifik indata.
Därför är alla hashfunktioner som är resistenta mot kollisioner också resistenta mot andra förbildsattacker, eftersom den senare alltid kommer att innebära en kollision. Man kan dock fortfarande utföra en förbildsattack på en kollisionsbeständig funktion eftersom det innebär att man hittar en enda indata från en enda utdata.
Utvinning
Det finns många steg i Bitcoin-utvinning som involverar hashfunktioner, som att kontrollera saldon, länka transaktioners indata och utdata och hashing-transaktioner inom ett block för att bilda ett Merkle-träd. Men en av de främsta anledningarna till att Bitcoins blockkedja är säker är det faktum att miners måste utföra en mängd hashingoperationer för att så småningom hitta en giltig lösning för nästa block.
Mer specifikt måste en miner prova flera olika indata när denne skapar ett hashvärde för sitt kandidatblock. I huvudsak kommer man bara att kunna validera sitt block om man genererar en utdatahash som börjar med ett visst antal nollor. Antalet nollor är det som bestämmer utvinningens svårighetsgrad och det varierar beroende på hashhastigheten som dedikeras åt nätverket.
I det här fallet representerar hashhastigheten hur mycket datorkraft som investeras i Bitcoin-utvinningen. Om nätverkets hashhastighet ökar kommer Bitcoin-protokollet automatiskt att justera utvinningens svårighetsgrad så att den genomsnittliga tiden som behövs för att bryta ett block förblir nära 10 minuter. Om däremot flera miners bestämmer sig för att sluta utvinna, vilket gör att hashhastigheten sjunker avsevärt, kommer utvinningens svårighetsgrad att justeras, vilket gör det lättare att utvinna (tills den genomsnittliga blocktiden kommer tillbaka till 10 minuter).
Observera att miners inte behöver hitta kollisioner, eftersom det finns flera hashvärden som de kan generera som giltiga utdata (som börjar med ett visst antal nollor). Så det finns flera möjliga lösningar för ett visst block, och miners behöver bara hitta en av dem – enligt tröskeln som bestäms av utvinningens svårighetsgrad.
Eftersom Bitcoin-utvinning är en kostnadsintensiv uppgift har miners ingen anledning att fuska i systemet, eftersom det skulle leda till betydande ekonomiska förluster. Ju fler miners som går med i en blockkedja, desto större och starkare blir den.
Sammanfattningsvis
Det råder inga tvivel om att hashfunktioner är viktiga verktyg inom datavetenskap, särskilt när det handlar om enorma mängder data. I kombination med kryptografi kan hashingalgoritmer vara ganska mångsidiga och erbjuda både säkerhet och autentisering på många olika sätt. Därför är kryptografiska hashfunktioner avgörande för nästan alla kryptovalutanätverk, så att förstå deras egenskaper och arbetsmekanismer är verkligen till hjälp för alla som är intresserade av blockkedjeteknik.