hash_pbkdf2

funkcja

Derywuje klucz kryptograficzny z hasła i soli wielokrotnymi iteracjami HMAC (PBKDF2). Do derywacji kluczy — nie do przechowywania haseł w bazie.

hash_pbkdf2(string $algo, string $password, string $salt, int $iterations, int $length = 0, bool $binary = false): string

hash_pbkdf2 implementuje algorytm PBKDF2 (Password-Based Key Derivation Function 2) — derywuje klucz kryptograficzny z hasła i soli, wielokrotnie stosując HMAC. Duża liczba iteracji spowalnia obliczenia, utrudniając ataki brute-force.

⚠️ Uwaga na zastosowanie: PBKDF2 to funkcja derywacji kluczy, nie bezpośredniego przechowywania haseł użytkowników. Do przechowywania haseł w bazie zawsze używaj password_hash() — bcrypt/argon2 są lepiej dostosowane do tego celu (m.in. przez zużycie pamięci w argon2). hash_pbkdf2 stosuj tam, gdzie potrzebujesz deterministycznie wygenerować klucz o określonej długości — np. do szyfrowania symetrycznego lub protokołów kryptograficznych.

<?php
declare(strict_types=1);

// Derywacja klucza AES-256 z hasła (klucz do szyfrowania, nie do bazy):
$haslo      = 'haslo';
$sol        = random_bytes(16);          // przechowaj sól razem z zaszyfrowanymi danymi
$iteracje   = 600_000;                   // OWASP 2023: min 600 000 dla SHA-256
$dlugoscKlucza = 32;                     // 256 bitów = 32 bajty

$klucz = hash_pbkdf2('sha256', $haslo, $sol, $iteracje, $dlugoscKlucza, binary: true);
// $klucz to 32 bajty gotowe do użycia z openssl_encrypt()

// Przykład weryfikowany (sól ASCII, mniej iteracji):
$wynik = hash_pbkdf2('sha256', 'haslo', 'sol', 10_000, 32);
echo $wynik;
// wynik: 8b992a7022b23ac7072bfc71fe3ba4b3

// ❌ Nie rób tak — hash_pbkdf2 nie zastępuje password_hash w bazie:
// $hash = hash_pbkdf2('sha256', $hasloUzytkownika, $sol, 100000);
// Zamiast: password_hash($hasloUzytkownika, PASSWORD_DEFAULT)
📘 Naucz się w lekcji →