Vad en digital signatur löser

En digital signatur svarar på två frågor som är centrala för förtroende online. Kommer det här meddelandet verkligen från den avsändare det utger sig för? Och har det ändrats efter att det skapades? Med en korrekt fungerande digital signatur kan en mottagare svara ja på den första frågan och nej på den andra, utan att behöva lita på den kanal meddelandet kom igenom.

Tekniken kombinerar två byggstenar: en kryptografisk hashfunktion och ett par av asymmetriska nycklar. Var och en av dem löser en del av problemet, och det är samspelet mellan dem som gör en signatur både säker och praktisk.

Asymmetriska nycklar i korthet

Asymmetrisk kryptografi bygger på nyckelpar. Varje part har en privat nyckel, som hålls hemlig, och en publik nyckel, som får spridas fritt. De två nycklarna är matematiskt kopplade, men den privata går inte att räkna ut från den publika i praktiken.

För signaturer används nycklarna så här: den privata nyckeln används för att skapa en signatur, och den publika nyckeln används för att verifiera den. Eftersom bara innehavaren har sin privata nyckel kan bara den parten skapa en giltig signatur, men vem som helst med den publika nyckeln kan kontrollera signaturen. Det är just denna asymmetri som gör tekniken användbar: förmågan att signera är privat, medan förmågan att verifiera är offentlig.

Varför hashfunktionen behövs

Man skulle kunna tro att man borde signera hela meddelandet direkt, men i praktiken signeras nästan alltid ett hashvärde av meddelandet i stället. Det finns goda skäl till det.

Asymmetriska operationer är beräkningsmässigt tunga och passar dåligt för stora datamängder. Att signera en stor fil direkt vore långsamt och opraktiskt. En hashfunktion löser problemet genom att först komprimera meddelandet, oavsett storlek, till ett fingeravtryck av fast längd. Det är fingeravtrycket som signeras, inte hela meddelandet. Eftersom hashvärdet har en liten och konstant storlek blir signeringen snabb även för mycket stora filer.

Lika viktigt är att hashfunktionen knyter signaturen till exakt det innehåll som signerades. Tack vare lavineffekten ger även den minsta ändring i meddelandet ett helt annorlunda hashvärde. Om någon ändrar en enda bokstav efter signeringen stämmer det nya hashvärdet inte längre med signaturen, och verifieringen misslyckas.

Att signera ett meddelande

Signeringsprocessen går till i några tydliga steg.

Först beräknar avsändaren ett hashvärde av meddelandet med en kryptografisk hashfunktion. Det ger ett fingeravtryck av fast längd som representerar meddelandets exakta innehåll.

Därefter använder avsändaren sin privata nyckel för att skapa en signatur över det hashvärdet. Resultatet är själva den digitala signaturen, ett datablock som hör samman både med meddelandet, via hashvärdet, och med avsändarens privata nyckel.

Slutligen skickas meddelandet tillsammans med signaturen till mottagaren. Den publika nyckeln behöver mottagaren också, men den kan distribueras separat, ofta via ett certifikat som beskrivs längre ner.

Att verifiera en signatur

På mottagarsidan vänds processen för att kontrollera att allt stämmer.

Mottagaren beräknar själv ett hashvärde av det mottagna meddelandet, med samma hashfunktion som avsändaren använde. Det ger mottagarens egen bild av meddelandets fingeravtryck.

Sedan använder mottagaren avsändarens publika nyckel på signaturen för att få fram det hashvärde som avsändaren signerade. Om verifieringen ska lyckas måste detta värde stämma överens med det hashvärde mottagaren själv just beräknade.

Stämmer de två värdena överens vet mottagaren två saker. Signaturen skapades med den privata nyckel som hör till den publika, vilket bekräftar avsändaren. Och meddelandet är oförändrat sedan det signerades, eftersom minsta ändring skulle ha gett ett annat hashvärde. Skiljer sig värdena åt är något fel: antingen har meddelandet ändrats, eller så skapades signaturen inte med rätt privat nyckel.

Varför en hashkollision hotar signaturer

Hela konstruktionen vilar på antagandet att hashfunktionen är kollisionsbeständig, alltså att ingen kan hitta två olika meddelanden med samma hashvärde. Om det antagandet faller, faller också signaturens säkerhet.

Tänk igenom vad en signatur faktiskt binder sig till. Den binder sig till ett hashvärde, inte till meddelandet i sig. En signatur som är giltig för ett visst hashvärde är giltig för allt som råkar ge samma hashvärde. Så länge bara ett enda meddelande kan ge ett visst hashvärde är det ingen skillnad, men en kollision bryter precis det.

En angripare som kan skapa en kollision kan förbereda två meddelanden med samma hashvärde: ett ofarligt och ett skadligt. Den ofarliga varianten lämnas in för signering och godkänns. Eftersom det skadliga meddelandet har exakt samma hashvärde gäller signaturen lika väl för det. Angriparen kan då presentera det skadliga meddelandet tillsammans med den äkta signaturen, och verifieringen kommer att lyckas, eftersom mottagarens beräknade hashvärde stämmer med det signerade.

Det är precis denna risk som SHAttered gjorde konkret 2017, när CWI i Amsterdam och Google för första gången demonstrerade en praktisk kollision i SHA-1. Resultatet visade att SHA-1 inte längre kunde anses säker för signaturer, och det påskyndade övergången till starkare hashfunktioner. En signatur är aldrig starkare än den hashfunktion den vilar på.

Certifikat och signering av kod

Två vardagsnära exempel visar hur digitala signaturer fungerar i praktiken.

Ett certifikat är i grunden en publik nyckel plus identitetsuppgifter, signerad av en betrodd utfärdare. När din webbläsare tar emot ett certifikat från en webbplats kontrollerar den utfärdarens signatur, som i sin tur bygger på ett hashvärde över certifikatets innehåll. På så sätt vet webbläsaren att certifikatet inte har förvanskats och att den publika nyckel det innehåller verkligen hör till rätt webbplats. Här blir kopplingen till hashkollisioner tydlig: om två olika certifikatinnehåll kunde dela samma hashvärde, skulle en signatur för det ena kunna missbrukas för det andra.

Signering av kod fungerar enligt samma princip. När en utvecklare distribuerar ett program signeras det med utvecklarens privata nyckel, över ett hashvärde av programmet. När du installerar programmet kan systemet verifiera signaturen med utvecklarens publika nyckel och bekräfta både vem som står bakom programmet och att det inte har manipulerats sedan det signerades. Ändras en enda byte i programmet stämmer hashvärdet inte längre, och signaturen blir ogiltig.

Sammanfattning

En digital signatur kombinerar en kryptografisk hashfunktion med ett par asymmetriska nycklar. Avsändaren signerar ett hashvärde av meddelandet med sin privata nyckel, och mottagaren verifierar med den publika nyckeln genom att jämföra hashvärden. Konstruktionen ger både äkthet och integritet, men bara så länge hashfunktionen är kollisionsbeständig. SHAttered visade vad som händer när den förutsättningen brister, och varför valet av en säker hashfunktion är avgörande för att en signatur ska betyda något.