hash_hkdf
funkcja
Derywuje klucz kryptograficzny z materiału wejściowego metodą HKDF (Extract-and-Expand). Do rozszerzania kluczy — nie do przechowywania haseł.
hash_hkdf(string $algo, string $ikm, int $length = 0, string $info = "", string $salt = ""): string
hash_hkdf implementuje HKDF (HMAC-based Key Derivation Function, RFC 5869) — derywuje jeden lub więcej kluczy kryptograficznych z istniejącego materiału kluczowego (IKM). W przeciwieństwie do hash_pbkdf2 nie jest przeznaczony do wolnego iteracyjnego przetwarzania haseł — służy do rozszerzania już silnego sekretu na wiele kluczy celowych.
⚠️ Przeznaczenie: HKDF zakłada, że wejście (
$ikm) jest już kryptograficznie silne (np. wyjście z Diffie-Hellman, losowy master key). Nie używaj do derywacji z haseł użytkownika wpisywanych ręcznie — słabe hasło pozostaje słabe. Do przechowywania haseł w bazie użyjpassword_hash(). Wynik jest zawsze binarny (użyjbin2hex()do reprezentacji hex).
<?php
declare(strict_types=1);
// Rozszerzenie master key na klucze celowe (np. szyfrowanie + podpis):
$masterKey = random_bytes(32); // silny losowy sekret
$kluczSzyfrowania = hash_hkdf('sha256', $masterKey, 32, 'szyfrowanie-aes');
$kluczPodpisu = hash_hkdf('sha256', $masterKey, 32, 'podpis-hmac');
// Każdy klucz jest deterministyczny dla danego $masterKey i kontekstu ($info)
// Przykład weryfikowany (hex):
$wynik = bin2hex(hash_hkdf('sha256', 'tajny-klucz', 32, 'cel'));
echo $wynik;
// wynik: a38dc0754dd75cdf0408caee8613432837634e55659198c8733d9ba9efc2bd10
// Parametr $info oddziela domeny — nawet przy tym samym kluczu wejściowym
// daje różne, niepowiązane klucze wyjściowe:
$k1 = hash_hkdf('sha256', $masterKey, 32, 'email');
$k2 = hash_hkdf('sha256', $masterKey, 32, 'session');
var_dump($k1 === $k2); // bool(false)