Kryptografiassa avainten johdannaisfunktio (key derivation function, KDF) muodostaa pitkän salaisen avaimen (jota kutsutaan "hashiksi") salaisesta lausekkeesta, kuten salasanasta. Avaimen derivointifunktion tulos näyttää samalta kuin toinen satunnaisesta lauseesta tehty tulos. Niitä käytetään myös salaisen avaimen uudelleenkäyttöön tietyssä muodossa, kuten Diffie-Hellman-avaintenvaihdon jaetun salaisen avaimen käyttämiseen salaisuuksien lähettämiseen AES:ssä.
Mitä KDF tekee ja miksi sitä tarvitaan
Avainten johdannaisfunktio muuntaa jonkin lähtösalaisuuden (esimerkiksi salasanan, jaetun salaisuuden tai satunnaisavaimen) yhdestä tai useammaksi avaimiksi, joilla on halutut ominaisuudet kryptografista käyttöä varten. Tärkeimpiä tavoitteita ovat:
- Pseudorandomisuus — johdettu avain näyttää satunnaiselta eikä paljasta helposti alkuperäistä aineistoa.
- Erilaisuus kontekstin mukaan — sama lähtösalaisuus voi tuottaa eri avaimia eri käyttötarkoituksiin (domain separation) käyttämällä lisätietoa (info, label).
- Avainpituuden säätö — KDF voi tuottaa halutun pituisia avaimia (esim. 128/192/256 bittiä AES:lle).
- Hyökkäyksen kustannusten kasvattaminen — erityisesti salasanoista johdettaessa KDF voi tehdä brute-force‑hyökkäyksistä hitaampia tai muistia vaativampia.
Tärkeitä ominaisuuksia ja suosituksia
- Salt (suola): satunnainen, julkinen arvo, joka lisätään jokaiselle salasanalle. Suolan tarkoitus on estää saman salasanan tunnistamisen ja käytön etukäteen lasketuissa tauluissa (rainbow tables). Suositeltu pituus on yleensä vähintään 16 tavua (128 bittiä).
- Iteraatiot / työtekijä (work factor): toistokertojen määrä tai kustannusparametrit, jotka tekevät KDF:stä hitaamman ja vaikeamman suorittaa massiivisissa hyökkäyksissä. Parametria pitää voida kasvattaa laitteiston kehittyessä.
- Muistivaatimus: malli, jossa KDF vaatii paljon muistia (memory-hard), tekee hyökkäyksistä vähemmän tehokkaita erityisesti GPU-/ASIC-hyökkäyksissä (esim. scrypt, Argon2).
- Kontekstin erottelu: käytä erillisiä avaimia eri tarkoituksiin tai lisää "info"/"label" parametrina, jotta sama lähtösalaisuus ei tuota samaa avainta eri käyttötarkoituksiin.
- Deterministisyys: samalla lähtösalaisuudella, samalla suolalla ja parametreilla KDF tuottaa saman tuloksen — tästä seuraa, että suolaa ja parametreja pitää tallentaa tarvittaessa avaimen tarkistusta varten.
Tavallisia KDF-tyyppejä ja esimerkkejä
- PBKDF2 — HMAC-pohjainen, laajasti tuettu KDF, jossa on iteraatiomäärä. Käytetty esimerkiksi monissa standardeissa. Hyvä, mutta ei muistivaatimuksiltaan raskas.
- scrypt — suunniteltu erityisesti muistivaatimuksia hyödyntäväksi (memory-hard), mikä tekee hyökkäyksistä kalliita laitteistoratkaisuilla.
- Argon2 — kilpailun voittaja (Password Hashing Competition), suositeltu salasanojen johdannaisiin; tarjoaa säätömahdollisuudet muistille ja ajalle (Argon2i/Argon2d/Argon2id).
- HKDF — HMAC-pohjainen KDF protokollien avainperäisyyteen; toimii kahdessa vaiheessa: extract (suolan avulla tiivistys) ja expand (laajennus halutun pituuden avaimiksi käyttäen info-parametria).
Käytännön esimerkkejä
- Salasanan tallennus: älä tallenna pelkkää hashia. Käytä KDF:ää, jossa on suola ja säädettävä iteraatiomäärä tai muistivaatimus (esim. Argon2). Tallenna suola ja parametrit yhdessä hashin kanssa.
- Protokollat (TLS, SSH, IPsec): jaetusta salaisuudesta (esim. Diffie–Hellman) johdetaan useita avaimia — siihen soveltuu HKDF, koska se tukee selkeää erottelua ja useamman avaimen valmistamista turvallisesti.
- Avainten venyttäminen: jos sinulla on lyhyt jaettua salaisuutta mutta tarvitset pidemmän symmetrisen avaimen, KDF tuottaa sopivan pituisen ja turvallisen avaimen.
Turvallisuusvinkkejä
- Käytä nykyaikaisia, arvioituja KDF-algoritmeja (Argon2 tai hyvä konfiguroitu PBKDF2 / scrypt) riippuen käyttötapauksesta ja tuetusta ympäristöstä.
- Aseta kustannusparametrit (iteraatiot, muisti, aika) siten, että normaalikäyttäjälle toiminta on hyväksyttävän nopeaa mutta hyökkääjälle kallista. Päivitä parametreja laitteiston kehittyessä.
- Älä yritä korvata KDF:ää yksinkertaisella hash-funktiolla (kuten SHA-256) salasanojen säilytyksessä — se ei tarjoa riittävää suojaa brute-force-hyökkäyksiä vastaan.
- Suojaa KDF-parametrit ja suolat oikein ja varmista, että toteutuksessa ei ole sivukanava-aukkoja (timing, muistijäämät).
Yhteenveto
Avainten johdannaisfunktio (KDF) on keskeinen työkalu kryptografiassa: se muuntaa jonkin salaisuuden turvallisiksi avaimiksi, säätelee hyökkäyksen kustannuksia ja mahdollistaa avainten eriyttämisen eri käyttötarkoituksiin. Oikea KDF-valinta ja sen asianmukainen konfigurointi (suola, muisti, iteraatiot, info) ovat tärkeitä sekä salasanojen turvalliselle tallennukselle että protokollien turvalliselle toiminnalle.