Ensimmäinen rivi kirjaa käytetyt tarkat parametrit (algoritmi, tulkinta, syötekoot), joten kopioitu tulos on aina toistettavissa.
HMAC, PBKDF2 ja HKDF — avainpohjainen tiivistys alusta asti selitettynä
Yhdellä lauseella: paljas tiiviste, kuten SHA-256, jonka kuka tahansa voi laskea, ei todista mitään siitä, kuka viestin lähetti — HMAC sekoittaa mukaan salaisen avaimen, joten vain avaimen haltijat voivat tuottaa (tai vahvistaa) tiivisteen; PBKDF2 ja HKDF käyttävät sitten samaa HMAC-koneistoa muuntaakseen salaisuudet avaimiksi, hitaasti salasanoille ja nopeasti jo satunnaiselle materiaalille.
Mikä HMAC on (RFC 2104)
Rakenne. HMAC on kaksi tiivistysajoa, ei yksi. Avain täytetään tiivisteen lohkokokoon (64 tavua MD5/SHA-1/SHA-256:lle, 128 SHA-384/512:lle); viesti tiivistetään kerran avaimen XOR kiinteän sisäisen täytteen kanssa, ja tuo tiiviste tiivistetään uudelleen avaimen XOR kiinteän ulkoisen täytteen kanssa. Tämä kaksinkertainen voileipärakenne on osoitettavasti turvallinen, kunhan taustalla oleva tiiviste on kelvollinen pseudosatunnaisfunktio — siksi HMAC-MD5 kestää yhä käytännön törmäyshyökkäyksiä, jotka rikkoivat tavallisen MD5:n (vaikka se on joka tapauksessa poistettu käytöstä, katso alla).
Avaimet. Mikä tahansa avaimen pituus toimii: lohkokokoa lyhyempi käytetään sellaisenaan (mutta alle 32 tavua katsotaan huonosti), pidempi tiivistetään ensin. Sama sivu sallii avaimen kirjoittamisen tekstinä, heksana tai Base64:nä, jotta 64 heksamerkin tuotantoavain voidaan liittää ilman, että se sekoitetaan 64 merkin tekstisalasanaan — tulkinta kirjataan tulostusriville juuri tästä syystä.
Missä sen kohtaa. JWT-otsakkeen HS256-kenttä on sanatarkasti HMAC-SHA-256 base64url-koodattujen tunnusosien yli (tämän sivuston JWT-purkaja laskee juuri sen, kun HS256-salaisuus liitetään). Webhook-allekirjoitukset (Stripe, GitHub), AWS SigV4, TLS-tietueen suojaus (vanhemmat versiot) ja OpenSSH:n umac-64@openssh.com-serkku kuuluvat kaikki samaan perheeseen.
Miksi ei vain hash(viesti || avain)? Pituuden laajennus: jokainen MD5/SHA-1/SHA-2-perheen tiiviste antaa hyökkääjälle, joka tuntee H(secret || msg), mahdollisuuden laskea H(secret || msg || padding || mitä tahansa) ilman salaisuutta. HMAC:n sisä- ja ulkojako tappaa tämän hyökkäysluokan. Se on yksittäinen yleisin tee-se-itse-virhe API-allekirjoituskoodissa — ja syy, miksi HMAC on olemassa.
Mikä PBKDF2 on (RFC 8018)
Suunniteltu hitaaksi. Salasanassa on ehkä 40 bittiä todellista entropiaa; hyökkääjän GPU kokeilee miljardeja raakoja SHA-256-laskentoja sekunnissa. PBKDF2 ajaa HMAC(password, salt):ia yhä uudelleen — iter kertaa — joten jokainen arvaus maksaa saman iter HMAC:ia niin puolustajalle kuin hyökkääjällekin. Oletus on täällä 600 000 iteraatiota HMAC-SHA-256:lla, OWASPin salasanojen tallennuksen huijauslehden perusarvo; liukusäädin ulottuu kymmeneen miljoonaan, koska tietoturvasuositukset nousevat laitteiston nopeutuessa.
Suola. Salasanakohtainen satunnainen suola tarkoittaa, että samat käyttäjät eivät enää tiivisty samalla tavalla, ja esilaskennat (sateenkaaritaulukot) muuttuvat arvottomiksi. Se ei ole salainen — se tallennetaan tiivisteen viereen — sen vain on oltava yksilöllinen. Yleisin on 16 satunnaista tavua.
Tunnettu heikkous. PBKDF2 on suorittimelle raskas mutta ei muistiraskas: GPU:t ja ASIC:t rinnakkaistavat sen erittäin hyvin. Siksi nykyinen suositus on scrypt tai Argon2id, kun salasanatiivisteen tallennusta suunnitellaan (tämän perheen Salasanatiivisteen generaattori-sivu kattaa ne), ja PBKDF2 on yhä oikea vastaus yhteensopivuus- ja FIPS-140-asetuksiin.
Mikä HKDF on (RFC 5869)
Ensin poimi, sitten laajenna. HKDF tekee kaksi tehtävää. Poiminta: puristaa mahdollisesti epätasaisen syöteavainmateriaalin (esimerkiksi Diffie–Hellman-jaettu salaisuus) suolan kanssa yhdeksi lyhyeksi pseudosatunnaiseksi avaimeksi PRK = HMAC(salt, IKM). Laajennus: venyttää tuon PRK:n mihin tahansa pituuteen enintään 255 tiivistelohkoa, ja jokainen ulostulolohko ketjutetaan edelliseen ja merkitään info-kentällä. Tuloksena yksi salaisuus voi turvallisesti antaa salausavaimen, MAC-avaimen ja IV:n, kaikki erillään toisistaan.
Ei salasanoille. HKDF olettaa, että sen syötteellä on jo täysi entropia — se tekee yhden HMAC:n 32 ulostulotavua kohden, joten ihmisen salasana kulkee sen läpi käytännössä välittömästi, juuri sen, mitä hyökkääjä haluaa. Salasanojen syöttäminen HKDF:n kautta PBKDF2:n sijaan on klassinen suunnitteluvirhe; info-kenttä on tarkoitusmerkinnöille ("client traffic key", "server iv"), ei lisäentropialle.
Missä sen kohtaa. TLS 1.3 johtaa jokaisen käyttämänsä avaimen kättelysalaisuudesta HKDF:n avulla; WireGuard, Signal, EAP-TLS 1.3 ja JSON Web Encryption (suorana avaimensopimus-KDF:nä) kuuluvat kaikki samaan sukupuuhun.
Ankkuriarvot — toista ne tällä sivulla
Kaksi ensimmäistä taulukkoa ovat testivektoreita, joihin tämän sivun Näyte-painike ja itsetesti perustuvat (avain "key", viesti “The quick brown fox jumps over the lazy dog”; sitten RFC-tyylinen tapaus, jossa on 16 tavun 0x0b-avain ja viesti “Hi There”). Kaikki on luotu itsenäisellä natiivitoteutuksella ja vahvistettu uudelleen tällä sivulla.
HMAC merkkijonolle “fox”, avain = key | Tiiviste (hex) |
| HMAC-MD5 | 80070713463e7749b90c2dc24911e275 |
| HMAC-SHA-1 | de7c9b85b8b78aa6bc8a7a36f70a90701c9db4d9 |
| HMAC-SHA-256 | f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8 |
| HMAC-SHA-384 | d7f4727e2c0b39ae0f1e40cc96f60242d5b7801841cea6fc592c5d3e1ae50700582a96cf35e1e554995fe4e03381c237 |
| HMAC-SHA-512 | b42af09057bac1e2d41708e48a902e09b5ff7f12ab428a4fe86653c73dd248fb82f948a549f7b791a5b41915ee4d1ec3935357e4e2317250d0372afa2ebeeb3a |
| KDF-ankkurit | Parametrit | Tulos (hex, ensimmäiset tavut) |
| PBKDF2-HMAC-SHA-1 | password / salt, c=4096, 32 tavua | 4b007901b765489abead49d926f721d065a429c12e463f6c4cd79401085b03db |
| PBKDF2-HMAC-SHA-256 | password / salt, c=4096, 32 tavua | 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, tyhjä suola ja info, L=42 | 8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d201395faa4b61a96c8 |
Yleisiä virheitä
- HMAC:n sekoittaminen salaukseen. HMAC todistaa eheyden ja alkuperän (jaetun salaisuuden perusteella); se ei piilota mitään. Jokainen ilman avainta näkee yhä koko viestin.
- HMAC:n sekoittaminen allekirjoitukseen. Digitaaliset allekirjoitukset ovat julkisen avaimen menetelmiä: yksi allekirjoittaa, kuka tahansa vahvistaa. HMAC on symmetrinen: jokainen vahvistaja voisi myös väärentää. Kiistämättömyyteen tarvitaan RSA/ECDSA (katso tämän perheen RSA-työkalu, kun se on julkaistu), ei HMAC.
- Avaimen tulkintaerot. Tekstiavainkenttään liitetty 64 merkin heksamerkkijono muuttuu 64 tavuksi, ei 32:ksi — ja HMAC muuttuu kokonaan. Tämä sivu tulostaa tulkinnan tulostusriville; kun kaksi työkalua ovat eri mieltä, se on ensimmäinen vertailtava asia.
- PBKDF2:n liian alhainen iteraatiomäärä. 1 000 iteraatiota oli järkevä vuonna 2000; nykyään GPU-koneet syövät sen. Jos järjestelmä tallentaa yhä 1 000 iteraation tiivisteitä, suunnittele siirto, jossa tiiviste lasketaan uudelleen kirjautumisen yhteydessä.
- HKDF salasanalle. Yksi HMAC ulostulolohkoa kohden tarkoittaa, että salasana kulkee läpi välittömästi — käytä salasanoille PBKDF2:ta (tai Argon2id:tä) ja HKDF:ää korkean entropian salaisuuksille.
- Saman johdetun avaimen käyttö kaikkeen. Korjaus on ilmainen: johda erilliset avaimet eri
info-merkinnöillä. Kaksi avainta yhdestä IKM:stä eri merkinnöillä ovat suunnittelultaan riippumattomia.
UKK
Onko HMAC-MD5 murtunut? Törmäysvastuksessa MD5 on kuollut, mutta HMAC-MD5:n turvallisuus perustuu MD5:een pseudosatunnaisfunktiona, eikä käytännöllistä murtoa tunneta. Joka tapauksessa se on poistettu käytöstä — ei ole syytä valita sitä HMAC-SHA-256:n sijaan muuten kuin yhteensopivuuden vuoksi vanhan protokollan kanssa.
Kuinka pitkä HMAC-avaimen pitäisi olla? Vähintään tiivisteen ulostulon koko (SHA-256:lle 32 tavua) ja luotu CSPRNG:llä. Tiivistettä lyhyempi avain on sallittu, mutta jokainen sen alapuolinen bitti heikentää suoraan turvallisuutta.
Muuttuuko PBKDF2 “turvallisemmaksi” loputtomiin, kun iteraatioita lisätään? Se nostaa hyökkääjän kustannuksia lineaarisesti, mutta myös kirjautumisen kustannukset lineaarisesti. Pelin ydin on valita suurin määrä, jonka käyttäjät sietävät — juuri sen OWASP:n luvut kalibroivat.
Miksi HKDF on rajattu arvoon 255 × tiivisteen koko? Laajennussilmukka on T(i) = HMAC(PRK, T(i-1) || info || i), jossa on yhden tavun laskuri i — 255 on suurin laskuriarvo, RFC 5869:n kova rakenteellinen raja, ei käytännön valinta.
Mikä on ero tämän sivun PBKDF2:n ja Salasanatiivisteen generaattorin välillä? Sama algoritmi, eri tehtävä. Tämä sivu johtaa raakoja avaintavuja käytettäviksi muualla; salasanatiiviste-sivu tuottaa tallennettavia tunnistetietomerkkijonoja (upotetulla suolalla ja parametreilla) ja vahvistaa liitetyt ehdokkaat niitä vasten.