Vad en hashfunktion gör
En hashfunktion tar emot data av godtycklig storlek och producerar ett resultat av fast längd. Resultatet kallas hashvärde, hashsumma eller fingeravtryck. Oavsett om indatan är ett enda ord eller en stor fil får hashvärdet samma längd, och det fungerar som ett kompakt avtryck av den ursprungliga datan.
Alla hashfunktioner är dock inte byggda för säkerhet. Enkla hashfunktioner används till exempel för att fördela data i en hashtabell, där målet bara är snabb uppslagning och en jämn spridning. En kryptografisk hashfunktion ställer betydligt hårdare krav. Den ska inte bara sprida data jämnt, utan också stå emot en motståndare som aktivt försöker lura den. Det är skillnaden mellan de två som den här artikeln handlar om.
Kärnegenskaperna hos en kryptografisk hashfunktion
En kryptografisk hashfunktion definieras av en uppsättning egenskaper. Tillsammans gör de att ett hashvärde kan användas som ett pålitligt fingeravtryck.
Deterministisk
Funktionen är deterministisk. Samma indata ger alltid exakt samma hashvärde. Utan denna egenskap skulle det vara meningslöst att jämföra hashvärden, eftersom samma data skulle kunna ge olika resultat vid olika tillfällen. Determinismen gör att två parter kan beräkna hashvärdet var för sig och ändå komma fram till samma värde om datan är identisk.
Snabb att beräkna
Funktionen ska vara snabb att beräkna i framriktningen. Att ta fram hashvärdet för en stor fil ska gå undan, annars blir den opraktisk i de system som behöver hantera mycket data. Snabbheten i framriktningen får dock inte innebära att det också går snabbt att gå baklänges, vilket nästa egenskap handlar om.
Motstånd mot urbild
Funktionen ska ge motstånd mot urbild. Givet ett hashvärde ska det vara praktiskt ogenomförbart att hitta någon indata som producerar just det värdet. Med andra ord går det inte att vända funktionen baklänges. Det är denna egenskap som gör att ett hashvärde kan publiceras öppet, eller att ett lösenord kan lagras som hashvärde, utan att den underliggande datan avslöjas.
Motstånd mot andra urbild
Funktionen ska ge motstånd mot andra urbild. Givet en bestämd indata, och därmed dess hashvärde, ska det vara praktiskt ogenomförbart att hitta en annan indata som råkar ge samma hashvärde. Den här egenskapen skyddar mot att någon byter ut en specifik fil mot en annan med samma fingeravtryck.
Kollisionsmotstånd
Funktionen ska ge kollisionsmotstånd. Det ska vara praktiskt ogenomförbart att hitta två olika indata som ger samma hashvärde, oavsett vilka. Skillnaden mot motstånd mot andra urbild är subtil men viktig: här får angriparen fritt välja båda indata, och behöver inte utgå från en given fil. Kollisionsmotstånd är ofta den svåraste egenskapen att upprätthålla, och det var precis den som föll för SHA-1 när en praktisk kollision demonstrerades 2017.
Lavineffekten
Funktionen ska uppvisa en lavineffekt. En minimal ändring i indatan, till exempel en enda ändrad bokstav, ska ge ett helt annorlunda hashvärde som inte liknar det gamla. Effekten gör att även den allra minsta manipulation i en fil syns tydligt i hashvärdet, och den bidrar till att resultatet ser slumpmässigt ut.
Hur de skiljer sig från icke-kryptografiska hashfunktioner
En icke-kryptografisk hashfunktion, som de som används i en hashtabell eller för en enkel kontrollsumma, är optimerad för hastighet och jämn fördelning. Den bryr sig inte om en aktiv motståndare. Det kan vara fullt godtagbart att två olika indata ibland ger samma resultat, eftersom systemet ändå hanterar sådana kollisioner, och det är ofta lätt att medvetet konstruera indata som krockar.
En kryptografisk hashfunktion antar i stället att någon aktivt försöker hitta kollisioner eller vända funktionen baklänges, och den är byggd för att stå emot det. Det är därför man aldrig ska använda en enkel kontrollsumma eller en hashtabellfunktion för säkerhetsändamål som lösenordslagring eller signaturer. De är gjorda för olika problem. En enkel kontrollsumma fångar slumpmässiga överföringsfel, men erbjuder inget skydd mot en motståndare som avsiktligt vill skapa en kollision.
Vanliga användningsområden
Kryptografiska hashfunktioner finns under ytan i en stor del av modern programvara.
Lösenordslagring med salt
En ansvarsfullt byggd tjänst lagrar aldrig lösenord i klartext. I stället sparar den ett hashvärde av lösenordet. För att skydda mot förberäknade tabeller läggs ett unikt slumpvärde, ett så kallat salt, till varje lösenord innan det hashas. Saltet gör att två användare med samma lösenord ändå får olika hashvärden, och att en angripare inte kan återanvända arbete mellan konton. För just lösenord används dessutom ofta funktioner som medvetet är långsamma, för att göra storskaliga gissningsattacker dyrare. Om databasen läcker blir det betydligt svårare för en angripare att återskapa de ursprungliga lösenorden.
Kontroll av integritet
Hashvärden används flitigt för att kontrollera att data inte har ändrats. En utgivare publicerar hashvärdet av en fil, och mottagaren beräknar värdet på sin egen kopia och jämför. Stämmer de överens är filen med mycket stor sannolikhet oförändrad. Det fångar både slumpmässiga överföringsfel och avsiktlig manipulation, förutsatt att hashfunktionen fortfarande är säker.
Digitala signaturer
I en digital signatur signeras inte hela meddelandet direkt, utan ett hashvärde av meddelandet. Hashfunktionen komprimerar meddelandet till ett fingeravtryck av fast längd, och det är fingeravtrycket som signeras med en privat nyckel. Hela konstruktionen vilar på att hashfunktionen är kollisionsbeständig, eftersom en kollision annars skulle göra det möjligt att flytta en giltig signatur till ett annat meddelande.
Blockkedjor
I en blockkedja knyts blocken samman med hjälp av hashvärden. Varje block innehåller hashvärdet av det föregående blocket, vilket skapar en kedja. En ändring i ett gammalt block skulle ändra dess hashvärde och därmed bryta alla efterföljande länkar, vilket gör manipulation av historiken lätt att upptäcka.
Att välja en säker hashfunktion
Att en hashfunktion en gång ansågs säker betyder inte att den förblir det. SHA-1 är det tydligaste exemplet: den användes brett i många år, men teoretiska svagheter ledde till slut fram till en praktisk kollision, och funktionen anses inte längre säker för ändamål som kräver kollisionsmotstånd. I dag är SHA-2-familjen, däribland SHA-256, det vanliga valet, och SHA-3 finns som ett alternativ med en annan underliggande konstruktion. Den som bygger system bör följa aktuella rekommendationer och byta funktion i god tid, snarare än att vänta tills en svaghet redan har utnyttjats.




