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_pbkdf2stosuj 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)