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żyj password_hash(). Wynik jest zawsze binarny (użyj bin2hex() 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)
📘 Naucz się w lekcji →