Generare password casuali
In tutte le applicazioni che richiedono l’autenticazione da parte degli utenti un ruolo fondamentale per quanto riguarda la sicurezza dell’intero sistema è rappresentato dalla password inserita. Molte volte (se non nella totalità dei casi) lasciare all’utente la gestione completa della propria password è fonte di rischio visto che per semplice pigrizia l’utente medio utilizza spesso la stessa parola chiave sicuramente appartenente alla tipologia che possiamo definire debole: il proprio nome, date di nascita, parole estremamente corte. Oggi quindi presento una semplice classe per la generazione di password casuali scritta in PHP5.
Una strada per innalzare la sicurezza della propria applicazione e dell’intero sistema è quella di fornire all’utente una password creata dal sistema seguendo un determinato criterio con l’intento di rispettare quelli che sono i requisiti minimi per una password sicura. Vogliamo quindi utilizzare:
- un insieme di caratteri alfabetici maiuscoli e minuscoli
- un insieme di numeri
La classe che vediamo di seguito è molto semplice prende 2 valori in input length e numbers che indicano rispettivamente la lunghezza totale della password ed il numero di cifre intendiamo inserire nella stringa che andiamo a generare. E’ costituita dal costruttore che si occupa di creare l’oggetto al momento dell’istanziazione della classe e dal metodo getPassword() che si occupa dell’elaborazione vera e propria dell’input per la generazione dell’output: la password.
Il costruttore si occupa appunto di costruire l’oggetto facendo le dovute verifiche sui tipi, di cui abbiamo parlato in un post precedente, ed agendo in base alla situazione che si verifica.
public function __construct($length, $numbers) {
if (!is_int($length) || !is_int($numbers)) {
die("randoPassword() richiede argomenti di tipo intero\n");
}
if ($length < $numbers) {
die("length deve essere maggiore di numbers\n");
}
$this->length = $length;
$this->numbers = $numbers;
}
Come anticipato il metodo getPassword() si occupa del lavoro vero e proprio, vediamo quindi come si comporta. Innanzitutto andiamo ad inserire nell’array random_char un numero di caratteri alfabetici presi da $alphabet pari al valore di $length meno il valore di $numbers. In secondo luogo aggiungiamo dei caratteri numerici presi casualmente tra 0 e 9 fino a raggiungere una numerosità dell’array random_char pari a $length. A questo punto avremmo già una password composta da lettere (maiuscole e minuscole) con n=$numbers caratteri numerici in coda. Per rendere le password meno ripetitive ho deciso di rimischiare i valori interni all’array con la comoda funzione shuffle prima di eseguire il return del metodo.
public function getPassword() {
$a = 0;
while ($a < ($this->length - $this->numbers)) {
$random_char[$a] = $this->alphabet[rand(0,51)];
$a++;
}
while ($a < $this->length) {
$random_char[$a] = rand(0,9);
$a++;
}
shuffle($random_char);
$a = 0;
while ($a < ($this->length + $this->numbers)) {
$password .= $random_char[$a];
$a++;
}
return $password;
}
Come sempre potete scaricare il codice completo della classe randomPassword.class.php in modo da studiarlo attentamente (l’indentazione lì è corretta) e provarlo ma soprattutto modificarlo e perfezionarlo in base a quello che vi ha insegnato la vostra esperienza.
Usate i commenti qui sotto per esprimere il vostro parere, i vostri dubbi, le vostre critiche e i suggerimenti che riteniate possano essere utili a me ed ai lettori.
CREDITS
L’immagine utilizzata nell’articolo proviene da Flickr, dove è stata pubblicata da Imagined Reality con licenza Creative Commons.





Commenti
PHP: Generare password casuali…
In tutte le applicazioni che richiedono l’autenticazione da parte degli utenti un ruolo fondamentale per quanto riguarda la sicurezza dell’intero sistema è rappresentato dalla password inserita. Molte volte (se non nella totalità dei casi) lascia…
[...] dopo la prima parte di teoria passiamo oggi alla pratica vedendo alcuni esempi. Prendiamo in esame la classe per la generazione di password casuali presentata non molto tempo fa, lavoreremo su quel codice per realizzare i primi test ed i primi [...]
Buongiorno, volevo dire che se si utilizza un paradigma di sviluppo orientato agli oggetti, e quindi si lavora in una classe, anche la variabile $a, deve essere dichiarata e poi utilizzata secondo il metodo $this->a, altrimenti la variabile viene riconosciuta come indefinita. Lo stesso vale per random_char() ed $password. Non ho intenzione di offendere il lavoro di nessuno, ma questo sembra un miscuglio di procedurale e oop, indefinibile ne per l’uno che per l’altro paradigma.
Grazie dell’attenzione,
ancora buongiorno a tutti.
@Lexor
Grazie per la segnalazione correggerò al più presto il codice scritto effettivamente abbastanza in fretta.