Hvad er en digital signatur?
En digital signatur er en kryptografisk metode til at bevise to ting på én gang: at en besked virkelig stammer fra den, der hævder at have sendt den, og at beskeden ikke er blevet ændret undervejs. Den fungerer som en digital pendant til en håndskreven underskrift, men er langt stærkere, fordi den binder underskriften matematisk til selve indholdet.
Digitale signaturer hviler på to byggesten: kryptografiske hashfunktioner og asymmetriske nøgler. Tilsammen gør de det muligt at underskrive noget på en måde, som alle kan kontrollere, men ingen kan forfalske uden den rette hemmelige nøgle.
De to byggesten
Hashfunktionen
En hashfunktion omdanner en besked af vilkårlig størrelse til et fingeraftryk af fast længde, en digest. Den er deterministisk, så det samme input altid giver det samme hash, og den har en stærk lavineeffekt, så selv den mindste ændring i beskeden giver et helt andet hash. Det er disse egenskaber, der gør hashet egnet som en kompakt stedfortræder for hele beskeden.
Asymmetriske nøgler
Asymmetrisk kryptografi bruger et nøglepar: en privat nøgle, som ejeren holder hemmelig, og en offentlig nøgle, som frit kan deles. De to nøgler hænger matematisk sammen, men man kan i praksis ikke udlede den private nøgle fra den offentlige. Det, der låses med den ene, kan kun behandles korrekt med den anden. I forbindelse med signaturer betyder det, at noget skabt med den private nøgle kan kontrolleres med den offentlige.
Netop fordi nøglerne er adskilte, kan en afsender dele sin offentlige nøgle med hele verden uden at svække sikkerheden. Enhver kan bruge den til at kontrollere en signatur, men ingen kan bruge den til at fremstille en. Det er denne asymmetri, der gør digitale signaturer mulige: kontrol er åben for alle, mens selve underskriften forbliver forbeholdt den, der besidder den hemmelige nøgle. Holdes den private nøgle virkelig hemmelig, er det praktisk umuligt for andre at forfalske en gyldig signatur.
Sådan signeres en besked
Det er fristende at tro, at man krypterer hele beskeden, når man signerer den, men sådan fungerer det normalt ikke. I stedet sker signeringen i to trin:
- Beregn hashet. Først kører afsenderen beskeden gennem en hashfunktion og får et fingeraftryk af fast længde. Uanset om beskeden er en kort sætning eller et stort dokument, bliver resultatet en kompakt digest.
- Signer hashet med den private nøgle. Dernæst anvender afsenderen sin private nøgle på dette hash. Resultatet er den digitale signatur, som sendes med sammen med beskeden.
Grunden til, at man signerer hashet og ikke hele beskeden, er både effektivitet og praktik. Det er hurtigere at arbejde med en lille digest end med en stor besked, og resultatet er lige så sikkert, forudsat at hashfunktionen er stærk. Hashet repræsenterer hele beskeden, så en signatur over hashet er i praksis en signatur over indholdet.
Denne arbejdsdeling forklarer også, hvorfor signaturen fungerer lige godt, uanset om man underskriver en kort e-mail eller et stort installationsprogram. Hashfunktionen reducerer altid inputtet til et fingeraftryk af samme faste længde, så den asymmetriske del af arbejdet har lige meget at gøre i begge tilfælde. Beskedens størrelse påvirker dermed kun den hurtige hashberegning, ikke den tungere nøgleoperation. Det er en af grundene til, at netop kombinationen af en hashfunktion og et nøglepar er blevet den dominerende måde at lave signaturer på.
Sådan verificeres en signatur
Modtageren skal kunne kontrollere, at signaturen er ægte, og at beskeden ikke er ændret. Det sker også i to trin:
- Beregn hashet selv. Modtageren kører den modtagne besked gennem den samme hashfunktion og får et fingeraftryk.
- Kontroller signaturen med den offentlige nøgle. Ved hjælp af afsenderens offentlige nøgle udledes det hash, der oprindeligt blev signeret. Stemmer dette overens med det hash, modtageren selv beregnede, er signaturen gyldig.
Hvis de to hash er ens, ved modtageren to ting. For det første kommer signaturen fra en, der havde adgang til den private nøgle, eftersom kun den nøgle kunne frembringe en signatur, der passer til den offentlige. For det andet er beslutningen ikke ændret, for var bare en byte blevet rettet, ville modtagerens hash være forskelligt på grund af lavineeffekten, og kontrollen ville fejle.
Det er denne dobbelte garanti, der gør digitale signaturer så nyttige: de bekræfter både afsenderens identitet og indholdets uforanderlighed i én og samme handling.
En tredje egenskab følger naturligt af de to første, nemlig uafviselighed. Eftersom kun indehaveren af den private nøgle kan have skabt en gyldig signatur, kan vedkommende vanskeligt bagefter benægte at have underskrevet. Det gør digitale signaturer velegnede dér, hvor det skal kunne dokumenteres, hvem der stod bag en handling, for eksempel ved aftaler eller udgivelse af software. Forudsætningen er naturligvis, at den private nøgle ikke er kommet på afveje, for en kompromitteret nøgle underminerer hele garantien.
Hvorfor en kollision truer signaturer
Hele sikkerheden ved en digital signatur afhænger af, at hashfunktionen er stærk. Helt konkret afhænger den af, at man ikke kan finde to forskellige beskeder med samme hash. Hvis denne kollisionsmodstand brydes, opstår der et alvorligt hul.
Forestil dig, at en angriber konstruerer to dokumenter med samme hash. Det ene er harmløst, det andet skadeligt. Angriberen får offeret til at signere det harmløse dokument. Fordi de to dokumenter deler hash, og signaturen reelt er sat på hashet, gælder den nu lige så godt for det skadelige dokument. Angriberen kan derefter præsentere det skadelige dokument sammen med den ægte signatur, og enhver kontrol baseret på hashet vil acceptere det.
Det er præcis derfor, SHAttered-angrebet fra 2017 var så vigtigt. Det fremstillede to forskellige PDF-filer med det samme SHA-1-hash og viste dermed, at SHA-1 ikke længere kunne bære vægten af en digital signatur. En signatur er aldrig stærkere end den hashfunktion, den bygger på. Falder hashfunktionen, falder signaturens troværdighed med den.
Certifikater og kodesignering i praksis
Digitale signaturer er ikke et abstrakt begreb. De er i daglig brug rundt om i den digitale infrastruktur.
Certifikater
Når din browser opretter en sikker forbindelse, fremviser serveren et certifikat, der knytter dens identitet til en offentlig nøgle. Certifikatet er underskrevet af en certifikatudsteder, og din browser kontrollerer den signatur. Hele tillidskæden bygger på, at signaturerne i certifikaterne er ægte, hvilket igen kræver en stærk hashfunktion. Da SHA-1 svigtede, var det netop derfor, certifikater baseret på den blev udfaset til fordel for SHA-256.
Kodesignering
Udgivere af software underskriver deres programmer, så brugere og styresystemer kan kontrollere, at koden stammer fra den rette kilde og ikke er blevet manipuleret efter udgivelsen. Når du installerer et signeret program, beregnes hashet, og signaturen kontrolleres mod udgiverens offentlige nøgle. Er bare en del af programmet ændret, fejler kontrollen. Kodesignering er en af grundene til, at man kan stole på, at en opdatering faktisk kommer fra den oprindelige leverandør.
Den korte konklusion
En digital signatur kombinerer en hashfunktion med et asymmetrisk nøglepar for at bevise både hvem der har underskrevet, og at indholdet er uændret. Man signerer hashet af beskeden med sin private nøgle, og modtageren kontrollerer det med den offentlige. Styrken hviler helt på hashfunktionen: kan nogen finde kollisioner, kan en signatur flyttes fra et harmløst til et skadeligt dokument. SHAttered gjorde netop dette muligt for SHA-1 og blev en tydelig påmindelse om, hvorfor signaturer skal bygge på en stærk og tidssvarende hashfunktion som SHA-256.




