Utilizzare l'algoritmo scrypt di PHP per memorizzare le password

L'algoritmo scrypt è ritenuto più sicuro dell'algoritmo bcrypt.

Pubblicato da ,
Ultima modifica

Per poter utilizzare l'algoritmo scrypt è necessario installare questa estensione di PHP

pecl.php.net/package/scrypt

in questa pagina sono disponibili diverse versioni, ad esempio se stiamo lavorando in un ambiente di test con SO Windows 10 possiamo scaricare la versione più adatta alle nostre esigenze al seguente link

pecl.php.net/package/scrypt/1.4.2/windows

in particolare per sceglere la versione giusta dobbiamo sapere la versione di PHP installata, 'Architecture' e 'Thread Safety', queste informazioni si possono ottenere tramite la funzione phpinfo(), nel mio caso uso la seguente versione Thread Safe (TS) x86

 

pecl scrypt windows

 

poichè Architecture è uguale a x86, Thread Safety è uguale a enabled, e la versione di PHP è la 7.1.

Adesso che abbiamo scaricato il pacchetto adatto, estraiamo i file della cartella compressa, e i passaggi successivi sono:

  1. copiare il file php_scrypt.dll nella cartella ext delle estensioni di PHP (es. C:\xampp\php\ext)
  2. aggiungere al file php.ini la seguente stringa extension=php_scrypt.dll

Nel file .zip dell' estensione scrypt (php_scrypt-1.4.2-7.1-ts-vc14-x86.zip) come è possibile notare vi è un file scrypt.php che contiene una classe astratta Password, useremo questa classe per le nostre operazioni sulle password, fra l'altro è possibile consultare il repository completo al seguente link

github.com/DomBlack/php-scrypt

Creiamo una classe che estenda la classe Password

Codice PHP

<?php

class Scrypt extends Password
{}

in questo modo possiamo utilizzare tutti i metodi disponibili nella classe Password, in particolare usiamo il metodo hash per generare l'hash che verrà memorizzato nel database, e il metodo check per verificare la validità della password

Codice PHP

<?php

$salt= random_bytes(32);

$password = "secret";

$Scrypt = new Scrypt();

$hash = $Scrypt->hash($password , $salt, 16384, 8, 1);

$password è la password, $salt è un valore casuale generato tramite la funzione random_bytes() di PHP, 16384 è il parametro sul costo in termini di CPU, 8 è il parametro del costo in termini di memoria RAM, 1 è il parametro sulla parallelizzazione dell'algoritmo, il risultato della variabile $hash è una stringa simile a questa

16384$8$1$cBPJ2rQueaa6/vZq3UbZeUbcabMNpRi/4cMrkr0PwDw=$afb87e42bc3fce3ade860f334b6f5a7bea8b549239dbca1e2998aeb8fcfe43be

per verificare la validità della password usiamo il metodo check

Codice PHP

<?php

//.......

$check = $Scrypt->check($password,$hash);

se la variabile $check è un valore TRUE la pasword è corretta, se FALSE la password non è corretta.