PHP: generare una password casuale (random)

Se effettuassimo un test comparativo usando un dizionario di password MD5 con relativa "traduzione" in linguaggio umano, resteremmo sorpresi dai criteri con cui gli utenti scelgono le loro password. Imporre agli utenti una password scelta da noi non è il massimo da un punto di vista dell'usabilità, ma fornire delle restrizioni per la scelta della password è sicuramente una pratica da adottare. Una password con un sufficiente livello di sicurezza non solo dovrebbe avere una certa lunghezza, ma anche presentare una combinazione casuale di lettere (maiuscole e minuscole), numeri e caratteri speciali. Possiamo fornire ai nostri utenti un percorso obbligato per la scelta delle password, o suggerirne una noi. Quella che segue è un'implementazione elementare di un tale meccanismo di generazione di una password casuale (random).

La funzione generatePassword() accetta come unico parametro la lunghezza, in caratteri, della password:


function generatePassword ( $length = 8 )
{

  $password = '';

  $possibleChars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_?*+&%!#@><°-:,/'; 
    
  $i = 0; 
    
  while ($i < $length) { 

    $char = substr($possibleChars, mt_rand(0, strlen($possibleChars)-1), 1);
        
    if (!strstr($password, $char)) { 
      $password .= $char;
      $i++;
    }

  }

  return $password;

}

I caratteri possibili sono 76. La funzione estrae un carattere a caso dalla stringa di caratteri possibili e lo aggiunge alla stringa da restituire, verificando sempre che il carattere da inserire non sia già presente nella stringa.

Un esempio d'uso è il seguente:


$pwd = generatePassword(16);
$md5Pwd = md5($pwd);

Questa funzione può anche essere usata per resettare una password di un utente qualora l'utente l'avesse smarrita e inviargliela via e-mail.