Den første linjen registrerer de nøyaktige parametrene som ble brukt (algoritme, lesemåte, inndatastørrelser), så et kopiert resultat kan alltid reproduseres.
HMAC, PBKDF2 og HKDF — nøklet hashing forklart fra grunnen av
I én setning: en nakenhash som SHA-256 kan alle beregne, så den beviser ingenting om hvem som sendte en melding — HMAC blander inn en hemmelig nøkkel slik at bare nøkkelholdere kan lage (eller verifisere) digesten; PBKDF2 og HKDF gjenbruker deretter den samme HMAC-maskineriet for å gjøre hemmeligheter om til nøkler, langsomt for passord og raskt for allerede tilfeldig materiale.
Hva HMAC er (RFC 2104)
Konstruksjonen. HMAC er to hash-kjøringer, ikke én. Nøkkelen fylles opp til hashens blokkstørrelse (64 byte for MD5/SHA-1/SHA-256, 128 for SHA-384/512); meldingen hashes én gang med nøkkelen XOR-et med et fast indre fyll, og den digesten hashes igjen med nøkkelen XOR-et med et fast ytre fyll. Denne dobbeltsmørbrødkonstruksjonen er bevist sikker så lenge den underliggende hashen er en brukbar pseudotilfeldig funksjon — og det er grunnen til at HMAC-MD5 fortsatt motstår de praktiske kollisjonsangrepene som knekte vanlig MD5 (selv om den uansett er utrangert, se nedenfor).
Nøkler. Enhver nøkkellengde fungerer: en kortere enn blokkstørrelsen brukes som den er (men under 32 byte frarådes det), en lengre hashes først. Den samme siden lar nøkkelen skrives som tekst, heks eller Base64, så en produksjonsnøkkel på 64 heksadesimale tegn kan limes inn uten at noen forveksler den med et 64-tegns tekstpassord — lesemåten registreres i utdatalinjen nettopp av den grunnen.
Hvor man møter den. HS256-feltet i en JWT-header er bokstavelig talt HMAC-SHA-256 over de base64url-kodede tokendelene (JWT-dekoderen på dette nettstedet beregner nøyaktig det når man limer inn en HS256-hemmelighet). Webhook-signaturer (Stripe, GitHub), AWS SigV4, TLS-postbeskyttelse (eldre versjoner) og OpenSSHs umac-64@openssh.com-slektning hører alle til samme familie.
Hvorfor ikke bare hash(melding || nøkkel)? Lengdeutvidelse: enhver hash i MD5/SHA-1/SHA-2-familien lar en angriper som kjenner H(hemmelighet || melding) beregne H(hemmelighet || melding || fyll || noe) uten hemmeligheten. HMACs indre/ytre deling dreper den klassen angrep. Det er den vanligste hjemmelagde feilen i API-signaturkode — og grunnen til at HMAC finnes.
Hva PBKDF2 er (RFC 8018)
Langsom med vilje. Et passord har kanskje 40 bit reell entropi; en angripers GPU prøver milliarder av rå SHA-256 per sekund. PBKDF2 kjører HMAC(passord, salt) om og om igjen — iter ganger — så hver gjetning koster de samme iter HMAC-ene for systemet og for angriperen. Standarden her er 600 000 iterasjoner med HMAC-SHA-256, OWASPs grunnlinje i Password Storage Cheat Sheet; glidebryteren går til ti millioner fordi sikkerhetsveiledningen øker etter hvert som maskinvaren blir raskere.
Salt. Et tilfeldig salt per passord betyr at identiske brukere ikke lenger gir identiske hasher, og forhåndsberegnede tabeller (regnbuetabeller) blir verdiløse. Det er ikke hemmelig — det lagres ved siden av hashen — det må bare være unikt. 16 tilfeldige byte er normen.
Kjent svakhet. PBKDF2 er CPU-tung, men ikke minnetung: GPU-er og ASIC-er parallelliserer den svært godt. Derfor er moderne råd scrypt eller Argon2id der lagring av passordhasher designes (Passordhasgeneratoren i denne familien dekker dem), mens PBKDF2 fortsatt er riktig svar for kompatibilitet og FIPS-140-innstillinger.
Hva HKDF er (RFC 5869)
Ekstraher, deretter utvid. HKDF gjør to jobber. Ekstraher: presser sammen nøkkelmateriale av muligens ujevn kvalitet (en Diffie–Hellman-delt hemmelighet, for eksempel) sammen med et salt til én kort pseudotilfeldig nøkkel PRK = HMAC(salt, IKM). Utvid: strekker PRK til en hvilken som helst lengde opp til 255 hash-blokker, der hver utdatablokk kjedes til den forrige og merkes av info-feltet. Resultatet er at én hemmelighet trygt kan gi en krypteringsnøkkel, en MAC-nøkkel og en IV, alle adskilt.
Ikke for passord. HKDF forutsetter at inndata allerede har full entropi — den gjør én HMAC per 32 utdatabyte, så et menneskelig passord går gjennom den praktisk talt øyeblikkelig, nøyaktig det en angriper ønsker. Å mate passord gjennom HKDF i stedet for PBKDF2 er en klassisk designfeil; info-feltet er for formålsetiketter ("client traffic key", "server iv"), ikke for ekstra entropi.
Hvor man møter den. TLS 1.3 avleder alle nøklene den bruker fra håndtrykkhemmeligheten via HKDF; WireGuard, Signal, EAP-TLS 1.3 og JSON Web Encryption (som den direkte nøkkelavtale-KDF-en) står alle i samme slektstre.
Ankerverdier — reproduser dem på denne siden
De to første tabellene er testvektorene som eksempelknappen og selvtesten på denne siden bygger på (nøkkel "key", melding “The quick brown fox jumps over the lazy dog”; deretter det RFC-lignende tilfellet med en 16-byte 0x0b-nøkkel og meldingen “Hi There”). Alle ble laget av en uavhengig, innfødt implementasjon og verifisert på nytt på denne siden.
HMAC av “fox”, nøkkel = key | Digest (heks) |
| HMAC-MD5 | 80070713463e7749b90c2dc24911e275 |
| HMAC-SHA-1 | de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9 |
| HMAC-SHA-256 | f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8 |
| HMAC-SHA-384 | d7f4727e2c0b39ae0f1e40cc96f60242d5b7801841cea6fc592c5d3e1ae50700582a96cf35e1e554995fe4e03381c237 |
| HMAC-SHA-512 | b42af09057bac1e2d41708e48a902e09b5ff7f12ab428a4fe86653c73dd248fb82f948a549f7b791a5b41915ee4d1ec3935357e4e2317250d0372afa2ebeeb3a |
| KDF-ankere | Parametere | Utdata (heks, første byte) |
| PBKDF2-HMAC-SHA-1 | passord / salt, c=4096, 32 byte | 4b007901b765489abead49d926f721d065a429c12e463f6c4cd79401085b03db |
| PBKDF2-HMAC-SHA-256 | passord / salt, c=4096, 32 byte | c5e478d59288c841aa530db6845c4c8d962893a001ce4e11a4963873aa98134a |
| HKDF-SHA-256 (RFC 5869 A.1) | IKM=0x0b×22, salt=00..0c, info=f0..f9, L=42 | 3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865 |
| HKDF-SHA-256 (RFC 5869 A.2) | IKM=00..4f, salt=60..af, info=b0..ff, L=82 | b11e398dc80327a1c8e7f78c596a49344f012eda2d4efad8a050cc4c19afa97c… |
| HKDF-SHA-256 (RFC 5869 A.3) | IKM=0x0b×22, tomt salt og info, L=42 | 8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d201395faa4b61a96c8 |
Vanlige feil
- Å forveksle HMAC med kryptering. HMAC beviser integritet og opprinnelse (gitt en delt hemmelighet); den skjuler ingenting. Den som ikke har nøkkelen, ser fortsatt hele meldingen.
- Å forveksle HMAC med en signatur. Digitale signaturer er offentlig nøkkel: én signerer, alle kan verifisere. HMAC er symmetrisk: enhver verifiserer kan også forfalske. For ikke-benektbarhet trenger man RSA/ECDSA (se RSA-verktøyet i denne familien når det er publisert), ikke HMAC.
- Avvik i nøkkellesing. En 64-tegns heksstreng limt inn i en tekstnøkkelboks blir til 64 byte, ikke 32 — og HMAC-en endrer seg fullstendig. Denne siden skriver lesemåten i utdatalinjen; når to verktøy er uenige, er det det første å sammenligne.
- For lavt PBKDF2-antall iterasjoner. 1 000 iterasjoner var rimelig i 2000; i dag spiser GPU-rigger det. Hvis systemet fortsatt lagrer hasher med 1 000 iterasjoner, bør man planlegge en migrering der hashen byttes ved innlogging.
- HKDF på et passord. Én HMAC per utdatablokk betyr at et passord går gjennom øyeblikkelig — bruk PBKDF2 (eller Argon2id) for passord og HKDF for hemmeligheter med høy entropi.
- Å gjenbruke én avledet nøkkel til alt. Løsningen er gratis: avled separate nøkler med ulike
info-etiketter. To nøkler fra samme IKM med ulike etiketter er uavhengige, som designet.
Ofte stilte spørsmål
Er HMAC-MD5 brutt? Som kollisjonsresistent hash er MD5 død, men HMAC-MD5s sikkerhet avhenger av MD5 som pseudotilfeldig funksjon, og ingen praktisk brudd er kjent. Den er uansett utrangert — det er ingen grunn til å velge den fremfor HMAC-SHA-256, bortsett fra kompatibilitet med en gammel protokoll.
Hvor lang bør HMAC-nøkkelen være? Minst hashens utdatastørrelse (32 byte for SHA-256) og generert av en CSPRNG. En nøkkel kortere enn digesten er tillatt, men hver bit under den reduserer sikkerheten direkte.
Blir PBKDF2 med flere iterasjoner “sikrere” i det uendelige? Den øker angriperens kostnad lineært, men også innloggingskostnaden lineært. Spillet er å velge det største antallet brukerne tåler — det er det OWASPs tall kalibreres etter.
Hvorfor er HKDF begrenset til 255 × hashstørrelse? Ekspansjonsløkken er T(i) = HMAC(PRK, T(i-1) || info || i) med en ett-byte teller i — 255 er den høyeste tellerverdien, en hard strukturell grense i RFC 5869, ikke et policyvalg.
Hva er forskjellen mellom PBKDF2 på denne siden og Passordhasgeneratoren? Samme algoritme, ulik jobb. Denne siden avleder rå nøkkelbyte for bruk andre steder; passordhashsiden lager lagrede legitimasjonsstrenger (med innebygd salt og parametere) og verifiserer innlimte kandidater mot dem.