Avaimien johdannaisfunktio (KDF): määritelmä ja käyttö kryptografiassa
Avaimien johdannaisfunktio (KDF) — selkeä määritelmä ja käytännön esimerkit kryptografiassa: salausavaimet, Diffie‑Hellman ja AES‑turvallisuus.
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.
Käytä
Avainten johdannaistoiminnot ovat tärkeitä tietoturvan kannalta. Niiden avulla pienempi "salainen lause" voidaan laajentaa suuremmaksi avaimeksi (jonka pituus määräytyy KDF:n digest-koon mukaan). Tämä vaikeuttaa alkuperäisen "salaisen lauseen" löytämistä. Avaimen pituus vaikeuttaa lauseen tai piilotetun salaisuuden löytämistä kokeilemalla ja erehtymällä (eli brute-forcingin avulla), koska tietokoneen on vaikea arvata sitä. Joskus salaiseen lausekkeeseen lisätään pieni satunnaisdatan pala (jota kutsutaan "suolaksi") ennen kuin sitä käytetään KDF:n kanssa, jotta alkuperäisen "salaisen lausekkeen" arvaaminen tunnettujen "hashien" luettelon avulla olisi vaikeampaa.
Se tekee salasanojen tarkistamisesta turvallisempaa ilman todellisen salasanan käyttöä. Oikean salasanan säilyttämisen sijaan säilytetään avaimen "hash", ja salasanaa tarkistettaessa oikean salasanan "hash" tarkistetaan syötteen perusteella. Jotkin ohjelmistot rajoittavat salasanan pituutta, ja niitä käytetään joskus tekemään suuremmista salaisista lausekkeista pienempiä. KDF-tietokannat on myös tehty siten, että "hashin" muodostaminen vaatii tietokoneelta jonkin verran vaivaa. Tämä vaikeuttaa mahdollisten yhdistelmien luettelon laatimista.
Yleisesti käytetyt KDF:t
- SHA-2
- PBKDF2
- Scrypt
- Bcrypt
- Argon2
- Chacha20
Etsiä