Crittografare le password con password_hash() di PHP

La funzione password_hash crea un hash della password utilizzando un potente algoritmo di hashing unidirezionale.

Pubblicato da ,
Ultima modifica

Sempre più spesso le applicazioni web devono gestire dati sensibili, ad esempio le password degli utenti registrati, per questo è necessario usare un adeguato sistema di crittografia.

PHP mette a disposizione le funzioni password_hash() e password_verify() rispettivamente per crittografare e verificare una password.

Codice PHP

<?php
$password = "mypassword";

$hash = password_hash($password, PASSWORD_DEFAULT);

if (password_verify($password, $hash)) {    
    // password corretta

} else {
    // password errata

}

in questo esempio viene generato un hash ($hash) tramite la funzione password_hash(), la quale riceve come primo parametro la password ($password) e secondo parametro il tipo di algoritmo da utilizzare, in questo esempio è quello di default (PASSWORD_DEFAULT), in particolare l'argoritmo di default di PHP è bcrypt, è possibile usare esplicitamente questo algoritmo tramite la costante PASSWORD_BCRYPT, alla funzione password_verify() vengono passati la password e l'hash generato, se la password è corretta questa funzione restituisce un valore TRUE, in caso contrario valore FALSE, il risultato della funzione password_hash() è una stringa di 60 caratteri che cambia ogni volta che si esegue lo script

string(60) "$2y$10$fZXLqjLhDGHL0yw0Ong6TeCUv0WO561UiLrTpJHIUL8Kap2xKUeHO"

normalmente l'hash viene memorizzato in un database in modo da poter verificare la password qualora l'utente effettui un login.

La funzione password_hash() può ricevere un terzo parametro opzionale cost, il valore di dafault è pari a 10, questo parametro può avere un valore compreso tra 4 e 31, più alto è tale valore più tempo ci vuole per generare un hash, in particolare più tempo ci vuole per generare un hash e più sicuro diventa l'hash stesso, però un valore troppo elevato richiederebbe tempi elevati di esecuzione dell'applicazione, pertanto il valore di default pari a 10 è ritenuto adatto, questo è un esempio di utilizzo della funzione password_hash() col parametro cost

Codice PHP

<?php

$options = ['cost' => 12];
$hash = password_hash($password, PASSWORD_BCRYPT, $options);

come è possibile notare il parametro cost viene passato tramite un array chiave-valore ($options).

A partire dalla versione 7.2 di PHP è possibile usare in alternativa all'algoritmo bcrypt l'algoritmo Argon2, in particolare usando la costante PASSWORD_ARGON2I

Codice PHP

<?php

$hash = password_hash($password, PASSWORD_ARGON2I);

questo algoritmo è ritenuto più sicuro, l'hash generato è una stringa di 95 caratteri simile a questa

string(95) "$argon2i$v=19$m=1024,t=2,p=2$Mmp6T05RWnlwSlp0RWp5Vw$EDWj45RLqE50+dhSH6o0utcoGtQVYtezsUc7lp0Ykz8"