{"id":11,"date":"2026-06-10T09:12:36","date_gmt":"2026-06-10T09:12:36","guid":{"rendered":"https:\/\/shattered.io\/dk\/2026\/06\/10\/hashfunktioner\/"},"modified":"2026-06-10T09:12:36","modified_gmt":"2026-06-10T09:12:36","slug":"hashfunktioner","status":"publish","type":"post","link":"https:\/\/shattered.io\/dk\/cryptography\/hashfunktioner\/","title":{"rendered":"Hashfunktioner: egenskaber, form\u00e5l og praktisk brug"},"content":{"rendered":"<h2 id=\"hvad-er-en-hashfunktion\">Hvad er en hashfunktion?<\/h2>\n<p>En hashfunktion er en algoritme, der tager et input af vilk\u00e5rlig st\u00f8rrelse og omdanner det til et output af fast l\u00e6ngde. Outputtet kaldes et hash, en digest eller et fingeraftryk. Uanset om du hasher et enkelt bogstav eller en fil p\u00e5 flere gigabyte, har resultatet altid samme l\u00e6ngde.<\/p>\n<p>Hashfunktioner findes i to ret forskellige verdener. Almindelige hashfunktioner bruges til at organisere data effektivt, for eksempel i hashtabeller, hvor form\u00e5let bare er hurtige opslag. Kryptografiske hashfunktioner stiller langt strengere krav, fordi de skal kunne bruges som et p\u00e5lideligt fingeraftryk, man kan basere sikkerhed p\u00e5. Denne artikel handler is\u00e6r om den kryptografiske slags.<\/p>\n<p>En naturlig f\u00f8lge af, at outputtet har fast l\u00e6ngde, mens inputtet kan v\u00e6re vilk\u00e5rligt stort, er at der findes uendeligt mange flere mulige input end mulige hashv\u00e6rdier. Derfor <em>vil<\/em> der findes input, der deler samme hash. Det er matematisk uundg\u00e5eligt. Hele kunsten ved en god kryptografisk hashfunktion er ikke at undg\u00e5, at s\u00e5danne sammenfald eksisterer, men at g\u00f8re det s\u00e5 regnetungt at finde dem, at ingen i praksis kan. Den dag det alligevel lykkes, s\u00e5dan som det skete for SHA-1, holder funktionen op med at v\u00e6re sikker til de form\u00e5l, der afh\u00e6nger af netop den modstand.<\/p>\n<h2 id=\"de-centrale-egenskaber\">De centrale egenskaber<\/h2>\n<p>En kryptografisk hashfunktion skal opfylde flere egenskaber samtidigt. Det er kombinationen, ikke en enkelt af dem, der g\u00f8r funktionen brugbar.<\/p>\n<h3 id=\"deterministisk\">Deterministisk<\/h3>\n<p>Det samme input giver altid det samme output. Det lyder selvf\u00f8lgeligt, men det er afg\u00f8rende: kan to maskiner ikke n\u00e5 frem til det samme hash for den samme fil, kan hashet ikke bruges til at sammenligne data p\u00e5 tv\u00e6rs af tid og sted.<\/p>\n<h3 id=\"hurtig-at-beregne\">Hurtig at beregne<\/h3>\n<p>Det skal v\u00e6re effektivt at udregne et hash fra et input. Hashing bruges konstant, ofte p\u00e5 store datam\u00e6ngder, og en langsom funktion ville v\u00e6re upraktisk i de fleste sammenh\u00e6nge.<\/p>\n<h3 id=\"modstand-mod-preimage\">Modstand mod preimage<\/h3>\n<p>Givet et hash skal det i praksis v\u00e6re umuligt at finde et input, der frembringer netop det hash. Funktionen kan beregnes forl\u00e6ns, men ikke vendes om. Det er denne egenskab, der g\u00f8r det forsvarligt at gemme eller offentligg\u00f8re et hash uden at afsl\u00f8re det underliggende data.<\/p>\n<h3 id=\"modstand-mod-second-preimage\">Modstand mod second preimage<\/h3>\n<p>Givet et bestemt input skal det v\u00e6re praktisk umuligt at finde et <em>andet<\/em> input med samme hash. Forskellen fra preimage er, at angriberen her allerede kender \u00e9t gyldigt input og fors\u00f8ger at finde et alternativ, der kolliderer med netop det. Denne egenskab beskytter mod, at en kendt fil byttes ud med en anden, der b\u00e6rer samme fingeraftryk.<\/p>\n<h3 id=\"modstand-mod-kollisioner\">Modstand mod kollisioner<\/h3>\n<p>Det skal v\u00e6re praktisk umuligt at finde to vilk\u00e5rlige forskellige input, der giver det samme hash. Dette er et st\u00e6rkere krav end second preimage, fordi angriberen her frit kan v\u00e6lge begge input. Det var netop kollisionsmodstanden, SHA-1 mistede, da SHAttered-angrebet i 2017 fremstillede to forskellige filer med samme SHA-1-hash.<\/p>\n<h3 id=\"lavineeffekt\">Lavineeffekt<\/h3>\n<p>En lille \u00e6ndring i inputtet, helt ned til en enkelt bit, skal \u00e6ndre omkring halvdelen af bittene i outputtet. Resultatet er, at to n\u00e6sten identiske input giver to hash, der ser fuldst\u00e6ndig urelaterede ud. Lavineeffekten er grunden til, at man ikke kan g\u00e6tte sig til, hvor ens to input er, ved at kigge p\u00e5 deres hash.<\/p>\n<h2 id=\"forskellen-pa-kryptografiske-og-ikke-kryptografiske-hashfunktioner\">Forskellen p\u00e5 kryptografiske og ikke-kryptografiske hashfunktioner<\/h2>\n<p>Det er v\u00e6rd at skille de to typer skarpt ad, fordi de let forveksles.<\/p>\n<p>En ikke-kryptografisk hashfunktion, som dem der bruges internt i programmeringssprog til hashtabeller, er optimeret til hastighed og til at fordele v\u00e6rdier j\u00e6vnt. Den beh\u00f8ver ikke modst\u00e5 en angriber. Det er fuldt acceptabelt, at man let kan finde kollisioner, s\u00e5 l\u00e6nge almindelige data fordeles p\u00e6nt. Eksempler er funktioner designet udelukkende til opslag og checksummer, der kun skal opdage tilf\u00e6ldige fejl, ikke bevidst manipulation.<\/p>\n<p>En kryptografisk hashfunktion antager derimod, at der findes en modstander, som aktivt fors\u00f8ger at fremstille kollisioner eller regne bagl\u00e6ns. Derfor skal den modst\u00e5 preimage-, second-preimage- og kollisionsangreb. SHA-256 og SHA-3 er eksempler.<\/p>\n<p>Forskellen er ikke akademisk. Bruger man en simpel checksum eller en ikke-kryptografisk hash, hvor sikkerhed kr\u00e6ves, \u00e5bner man for, at en angriber bevidst fremstiller data med det forventede fingeraftryk. Et fingeraftryk er kun en garanti, hvis det er beregnet med en funktion, der er bygget til at modst\u00e5 netop den slags angreb.<\/p>\n<h2 id=\"hvor-hashfunktioner-bruges\">Hvor hashfunktioner bruges<\/h2>\n<p>Kryptografiske hashfunktioner er nogle af de mest anvendte byggesten i moderne it-sikkerhed. Et par af de vigtigste anvendelser:<\/p>\n<h3 id=\"opbevaring-af-adgangskoder-med-salt\">Opbevaring af adgangskoder med salt<\/h3>\n<p>Veldrevne systemer gemmer ikke adgangskoder i klartekst. I stedet gemmer de et hash af adgangskoden. N\u00e5r du logger ind, hashes det, du indtaster, og sammenlignes med det gemte hash. L\u00e6kker databasen, afsl\u00f8rer hashene ikke umiddelbart de oprindelige kodeord.<\/p>\n<p>For at g\u00f8re dette sikkert tilf\u00f8jer man en <em>salt<\/em>, en tilf\u00e6ldig v\u00e6rdi, der er unik for hver bruger og blandes ind f\u00f8r hashing. Salt sikrer, at to brugere med samme adgangskode f\u00e5r forskellige hash, og forhindrer angribere i at bruge forudberegnede tabeller. I praksis anvendes ofte specialiserede, bevidst langsomme funktioner til adgangskoder, men det grundl\u00e6ggende princip hviler p\u00e5 hashing.<\/p>\n<h3 id=\"integritetskontrol\">Integritetskontrol<\/h3>\n<p>N\u00e5r en fil hentes eller overf\u00f8res, kan man beregne dens hash f\u00f8r og efter og sammenligne. Stemmer de to hash overens, er filen u\u00e6ndret. Det bruges til alt fra softwaredownloads til kontrol af, om sikkerhedskopier er intakte.<\/p>\n<h3 id=\"digitale-signaturer\">Digitale signaturer<\/h3>\n<p>I stedet for at signere en hel besked signerer man hashet af beskeden. Det er hurtigere og lige s\u00e5 sikkert, s\u00e5 l\u00e6nge hashfunktionen er st\u00e6rk. Hvis hashfunktionen tillader kollisioner, opst\u00e5r der derimod et hul, hvor en signatur sat p\u00e5 \u00e9t dokument kan misbruges p\u00e5 et andet med samme hash.<\/p>\n<h3 id=\"blockchains\">Blockchains<\/h3>\n<p>Kryptovalutaer og andre blockchains bruger hashing til at l\u00e6nke blokke sammen. Hver blok indeholder et hash af den foreg\u00e5ende, s\u00e5 hele k\u00e6den h\u00e6nger sammen. \u00c6ndrer nogen et historisk data, \u00e6ndres hashet, og uoverensstemmelsen afsl\u00f8res straks l\u00e6ngere fremme i k\u00e6den. Hashing er dermed selve limen, der g\u00f8r en blockchain sv\u00e6r at forfalske.<\/p>\n<h2 id=\"nar-en-hashfunktion-svigter\">N\u00e5r en hashfunktion svigter<\/h2>\n<p>Egenskaberne ovenfor er idealer, en funktion skal leve op til. N\u00e5r den ikke l\u00e6ngere g\u00f8r det, holder anvendelserne op med at v\u00e6re sikre. SHA-1 er det tydeligste eksempel: da kollisioner blev praktisk mulige, kunne den ikke l\u00e6ngere bruges d\u00e9r, hvor sikkerhed afh\u00e6nger af, at to forskellige input ikke kan dele fingeraftryk.<\/p>\n<p>L\u00e6rdommen er, at valget af hashfunktion betyder noget, og at det b\u00f8r revurderes over tid. En funktion, der var sikker for et \u00e5rti siden, kan v\u00e6re svag i dag, fordi regnekraften er vokset, og angrebsmetoderne er blevet skarpere. Derfor anbefales i dag funktioner som SHA-256 og SHA-3, og derfor er det klogt at skifte v\u00e6k fra \u00e6ldre algoritmer, f\u00f8r nogen offentligt demonstrerer, at de kan brydes.<\/p>\n<h2 id=\"sadan-vaelger-man-en-hashfunktion\">S\u00e5dan v\u00e6lger man en hashfunktion<\/h2>\n<p>For den praktiske bruger kan r\u00e5dene koges ned til nogle f\u00e5 tommelfingerregler. Brug en anerkendt, moderne hashfunktion frem for hjemmestrikkede l\u00f8sninger eller for\u00e6ldede algoritmer. Til generel integritet og signaturer er SHA-256 et solidt standardvalg, og st\u00e6rkere varianter som SHA-512 og SHA-3 findes, hvis der er behov. Til adgangskoder b\u00f8r man ikke bruge en almindelig hurtig hashfunktion alene, men en specialiseret, bevidst langsom funktion kombineret med salt, fordi hastighed her er en ulempe snarere end en fordel. Og uanset valget b\u00f8r man holde \u00f8je med, om algoritmen stadig anses for sikker, og v\u00e6re parat til at skifte, hvis billedet \u00e6ndrer sig. En hashfunktion er et fundament, og fundamenter b\u00f8r efterses, f\u00f8r de begynder at sl\u00e5 revner.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hvad er en hashfunktion? En hashfunktion er en algoritme, der tager et input af vilk\u00e5rlig st\u00f8rrelse og omdanner det til et output af fast l\u00e6ngde. Outputtet kaldes et hash, en\u2026<\/p>\n","protected":false},"author":2,"featured_media":24,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-11","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cryptography"],"_links":{"self":[{"href":"https:\/\/shattered.io\/dk\/wp-json\/wp\/v2\/posts\/11","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/shattered.io\/dk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/shattered.io\/dk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/shattered.io\/dk\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/shattered.io\/dk\/wp-json\/wp\/v2\/comments?post=11"}],"version-history":[{"count":0,"href":"https:\/\/shattered.io\/dk\/wp-json\/wp\/v2\/posts\/11\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/shattered.io\/dk\/wp-json\/wp\/v2\/media\/24"}],"wp:attachment":[{"href":"https:\/\/shattered.io\/dk\/wp-json\/wp\/v2\/media?parent=11"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/shattered.io\/dk\/wp-json\/wp\/v2\/categories?post=11"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/shattered.io\/dk\/wp-json\/wp\/v2\/tags?post=11"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}