hash în PHP

Securitate și hash PHP 5.1.2+

Calculează amprenta unui text cu algoritmul ales: sha256, sha512, sha3-256, xxh3 și multe altele.

Sintaxă
hash(string $algo, string $data, bool $binary = false, array $options = []): string

Ce face hash

hash este funcția generală pentru amprente. Primul parametru este numele algoritmului. Pentru securitate (verificarea integrității, semnături) alege sha256 sau mai puternic. Pentru viteză, fără cerințe de securitate (chei de cache), xxh3 sau crc32b sunt mult mai rapide.

hash_algos() returnează lista algoritmilor disponibili pe server. hash_file($algo, $fisier) calculează amprenta unui fișier, pe bucăți, fără să îl încarce tot în memorie.

Parametri

Parametru Descriere
$algo Numele algoritmului, de exemplu "sha256". Un nume necunoscut aruncă ValueError.
$data Textul pentru care se calculează amprenta.
$binary Opțional. true returnează octeți binari în loc de text hexazecimal.
$options Opțional. Opțiuni pentru unii algoritmi, de exemplu ["seed" => 123] pentru xxHash.

Ce returnează

Amprenta, ca text hexazecimal (sau binar).

Exemple

Exemplul 1: SHA-256 și alți algoritmi

<?php
echo hash("sha256", "dexblog") . "\n";
echo hash("xxh3", "dexblog") . "\n";
echo hash("crc32b", "dexblog");

Rezultat

312ec798280e370f7bf8e9d933ad7138a69592a6dbad34a4b51e166b7e644f11
711dbc632b95e0f5
925f0c30

Exemplul 2: Algoritmii disponibili

<?php
$algoritmi = hash_algos();

echo implode(", ", array_slice($algoritmi, 0, 8)) . "...\n";
var_dump(in_array("sha3-256", $algoritmi));

Rezultat

md2, md4, md5, sha1, sha224, sha256, sha384, sha512/224...
bool(true)

Exemplul 3: Amprenta unui fișier descărcat

Compari amprenta calculată cu cea publicată de autorul fișierului. Dacă diferă, fișierul a fost stricat sau modificat.

<?php
file_put_contents("instalare.zip", "conținutul arhivei");

$asteptat = "7512493d610addbc8ad628ddd11459710820b4624ee719bc623b82eb30b8b149";
$calculat = hash_file("sha256", "instalare.zip");

echo $calculat === $asteptat ? "Fișier intact" : "Atenție: amprenta diferă!";

Rezultat

Fișier intact

Greșeli frecvente

  • Folosești hash("sha256", $parola) pentru parole. SHA-256 este prea rapid și poate fi spart prin încercări în masă. Pentru parole folosește password_hash.
  • Compari o amprentă secretă (de exemplu un token) cu ===. Pentru valori secrete folosește hash_equals, care nu dezvăluie prin timpul de răspuns câte caractere se potrivesc.

Comenzi înrudite

  • 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.
  • md5: Calculează amprenta MD5 a unui text: 32 de caractere hexazecimale. Bună pentru sume de control, nu pentru parole.
  • sha1: Calculează amprenta SHA-1 a unui text: 40 de caractere hexazecimale. Nu mai este recomandată pentru securitate.
  • password_hash: Creează un hash sigur pentru o parolă, gata de salvat în baza de date. Este modul corect de a stoca parole.