hash_pbkdf2 în PHP

Derivă o cheie dintr-o parolă cu algoritmul PBKDF2: multe iterații de HMAC, ca să încetinească ghicirea parolei.

Sintaxă
hash_pbkdf2(string $algo, string $password, string $salt, int $iterations, int $length = 0, bool $binary = false, array $options = []): string

Ce face hash_pbkdf2

PBKDF2 transformă o parolă (ușor de ghicit) într-o cheie de lungime fixă, potrivită pentru criptare. Numărul mare de iterații face fiecare încercare a unui atacator lentă. Recomandările actuale pentru SHA-256 sunt de ordinul sutelor de mii de iterații.

Pentru salvarea parolelor utilizatorilor folosește password_hash. hash_pbkdf2 este pentru cazurile în care ai nevoie de o cheie (de exemplu pentru openssl_encrypt) sau de compatibilitate cu alt sistem care folosește PBKDF2.

Parametri

Parametru Descriere
$algo Algoritmul HMAC, de exemplu "sha256".
$password Parola.
$salt Sarea, aleatorie și unică, salvată lângă rezultat.
$iterations Numărul de iterații.
$length Opțional. Lungimea rezultatului: în caractere hexazecimale, sau în octeți cu $binary = true. 0 înseamnă lungimea completă a algoritmului.
$binary Opțional. true pentru rezultat binar.

Ce returnează

Cheia derivată.

Exemple

Exemplul 1: Cheie de 32 de octeți pentru criptare

<?php
$sare = "sare-aleatorie"; // în practică: random_bytes(16), salvată lângă date

$cheie = hash_pbkdf2("sha256", "parola", $sare, 600000, 32, true);
echo strlen($cheie) . " octeți\n";
echo bin2hex($cheie);

Rezultat

32 octeți
6db7da456df6053ee59f63192209868878d0019ed571cbb78597155a624b7dc7

Exemplul 2: Lungimea în modul hexazecimal

Fără $binary, lungimea 32 înseamnă 32 de caractere hexazecimale, adică doar 16 octeți.

<?php
echo strlen(hash_pbkdf2("sha256", "parola", "sare", 1000, 32)) . "\n";
echo strlen(hash_pbkdf2("sha256", "parola", "sare", 1000));

Rezultat

32
64

Greșeli frecvente

  • Ceri $length = 32 fără $binary și crezi că ai o cheie de 32 de octeți. Ai 32 de caractere hexazecimale, adică 16 octeți.
  • Folosești puține iterații (de exemplu 1000). Parola poate fi ghicită de mii de ori mai repede.

Comenzi înrudite

  • password_hash: Creează un hash sigur pentru o parolă, gata de salvat în baza de date. Este modul corect de a stoca parole.
  • hash_hkdf: Derivă una sau mai multe chei separate dintr-o cheie de bază puternică, cu algoritmul HKDF.
  • hash_hmac / hash_equals: Calculează o semnătură HMAC: o amprentă care depinde și de o cheie secretă. Dovedește că datele nu au fost modificate.