Hva er en 'Hash'?
June 03, 2015Så hva er en 'hash', eller hva betyr det å 'hashe'? - Dette er begrep som ofte dukker opp når det er snakk om koder og kryptering. For å forstå hvordan Bitcoin og Blockchain fungerer er det nødvendig å vite bittelitt om 'hashing'. Jeg skal prøve å forklare det helt enkelt...
Ordet å 'hashe' kommer av et gammel-engelsk ord for å hakke noe opp i småbiter. På norsk syns jeg ordet høres ut som å hesje. Jeg har derfor dannet meg et bilde av hvordan en hesjer høy. Høyet ligger først i en bestemt formasjon på bakken, så hesjes deler av det opp etter en helt eksakt metode. Metoden beholder ikke informasjon om hvor på bakken høyet lå da det ble løftet opp, og heller ikke alt høyet. Det blir derfor umulig etterpå å vite hvordan høystråene på bakken lå før de ble hesjet opp. For mennesker er det umulig å hesje helt likt hver gang, og å sammenligne høyets eksakte posisjon etterpå for å sammenligne med en annen ferdig hesj. En datamaskin er veldig flink til være nøyaktig og gjøre ting klin likt hver gang. Uansett, nok hesje-metaforer for nå!
'Hashing' er en nyttig metode som koder en melding ugjenkallelig; den er ikke laget for å dekodes. Mesteparten av informasjonen går faktisk tapt. Hva er poenget med å kode noe som for alltid forblir kryptisk og uleselig? Vel, det er nyttig innen flere områder... Det gir oss noe kompakt som vi kan sammenligne med, uten å avsløre det hemmelige innholdet. 'Hashing' med avtalt metode gir forutsigbart resultat. Samme input gir alltid samme output. En datamaskin 'hasher' alltid 100% likt, og en gitt data vil alltid generere den samme 'hashen'. Derfor genererer 'hashing' i praksis en innholdssignatur eller et 'fingeravtrykk' av den opprinnelige dataen.
I en 'hashe' -metode tilstrebes det at alle mulige kombinasjoner av data gir unike resultat. I praksis forekommer det ekstremt sjeldne kollisjoner. Det vil si at to helt forskjellige data tilfeldigvis gir samme 'hash'. En robust 'hashe' -metode må håndtere dette via en elegant unntakshåndtering.
En annen fordel med 'hasher' er at de alltid er like lange, dvs at de har like mange tegn. Lengden på 'hashen' vil være lik om den hemmelige dataen inneholder kun ett tegn, eller den har flere hundre sider med tegn. Den siste fordelen jeg vil nevne er: to nesten like datamengder vil generere totalt forskjellige 'hasher'. Dersom det bare skiller ett tegn mellom to store datamengder vil 'hashene' deres ikke ligne på hverandre.
Dette gjør 'hasher' enkle å sammenligne, og de gir fra seg svært lite informasjon utover å kunne gjenkjenne eksakte matcher med andre 'hasher'. 'Hashing' blir brukt til å sammenligne noe uten å kjenne innholdet.
Et bruksområde for 'hashing' er for å sjekke om en filoverføring over internett gikk etter planen. Her blir en 'hash' av filen sendt i lag med filen sin. Mottageren 'hasher' så også selv filen, etter å ha mottatt den. Dette skjer med samme avtalte 'hashe' -metode. Mottagerens 'hash' sammenlignes så med den sendte 'hashen'. Hvis de to stemmer overens så er filen blitt verifisert, og en kan anta at den har forblitt uberørt og hel på veien. De mest kjente 'hashe'- metodene til dette formålet er Checksum, CRC, SFV og MD5.
Her kan dere leke litt med MD5-hashing:
MD5-generator
En annen svært utbredt 'hashe' -anvendelse er lagring av passord. Netttjenester som Facebook og Google lagrer ikke ditt hemmelige passord. De lagrer bare 'hashen' av passordet. Hver gang brukeren så skal logge seg på, blir passordet 'hashet' igjen på samme måte, og de to 'hashene' sammenlignes. Dette er tilstrekkelig for å verifisere at brukeren har riktig passord. Utbredte 'hashe'- metoder i dag til dette formålet er SHA256, SHA512, bcrypt og scrypt.
Blockchain, som Bitcoin er bygget på, bruker forresten nevnte SHA256 for å linke sammen transaksjonene og blokkene. Denne 'hashe' -metoden genererer en 'hash' som har 256 bits, dvs lengde på 256 binære nummer. 'Hashen' fra den forrige blokken i Blockchain inngår i hver ny blokk, som et 'fingeravtrykk' fra den forrige blokken. Dette gjør blokkene avhengige av hverandre, og hindrer at en kan manipulere en tidligere blokk uten å bli detektert og kastet ut.