La necessità di generare una stringa random, a partire da determinati caratteri e di una certa lunghezza, è sentita soprattutto per quanto riguarda la gestione delle password. In questo caso possiamo fare riferimento ad alcuni script in javascript pre-confezionati.
Il concetto, in php, è lo stesso del codice in javascript.
In questo articolo vedremo una funzione leggermente più complessa, che permette di generare una stringa a random con alcune particolarità:
– la possibilità di ottenere come output una stringa della lunghezza voluta
– la possibilità di scegliere quali caratteri e quali simboli andranno a comporre la stringa finale
Il tutto sarà fatto tramite una funzione piuttosto semplice, a cui faremo passare determinati parametri.
Per la sua comprensione è utile la conoscenza sull’uso delle funzioni e degli array. Chi fosse alle prime armi può comunque fare uso della funzione, che richiede poca (o nessuna) personalizzazione.
Il codice è scaricabile gratuitamente in formato zip dal link qui sotto.
La funzione: creare una stringa random
La funzione è di facile comprensione (nello zip da scaricare troverete anche i commenti ai suoi argomenti da passare).
Vediamo il codice, che commenteremo subito dopo.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
function random_string($length=32, $args = array()){ $permit = array(); //contiene i gruppi di caratteri permessi //se non è stato passato alcun argomento, rendo tutti i gruppi disponibili //altrimenti rendo disponibili solo i gruppi abilitati in $args if(empty($args)){ $permit[] = 'alfa_upper'; $permit[] = 'alfa_lower'; $permit[] = 'number'; $permit[] = 'simbol'; }else{ $permit = $args; } $characters = ''; if(in_array('alfa_upper', $permit)){ $characters.= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; } if(in_array('alfa_lower', $permit)){ $characters.= 'abcdefghijklmnopqrstuvwxyz'; } if(in_array('number', $permit)){ $characters.= '1234567890'; } if(in_array('simbol', $permit)){ $characters.= '!"£$%&/()=?\'^@#[]*'; } //controllo di sicurezza: se è stato passato un valore errato a $length, prendo 32 come default if(!is_numeric($length)){ $length = 32; } $string = ''; for($i=0; $i<$length; $i++){ $string = $string.substr($characters, rand(0, strlen($characters)-1), 1); } return $string; } |
$length è la lunghezza della stringa da generare. Per default, cioè se non viene passato alcun valore, è impostato a 32 caratteri. All’interno della funzione troverete anche un controllo di sicurezza, che impone sempre 32 caratteri nel caso in cui non sia stato passato a $length un valore numerico (in questo modo si evitano degli errori non voluti).
$args è l’argomento che ci permette di stabilire quali caratteri andranno a comporre la stringa finale. Come potete notare, li ho suddivisi a gruppi, i cui “nomi” formeranno il valore di $args. Se non è stato passato alcun array, saranno presi tutti i gruppi di caratteri, altrimenti soltanto i gruppi passati in $args. I nomi dei gruppi sono i seguenti:
– alfa_upper: nella stringa finale sono permessi i caratteri alfabetici maiuscoli
– alfa_lower: nella stringa finale sono permessi i caratteri alfabetici minuscoli
– number: nella stringa finale sono permesse le cifre numeriche
– simbol: nella stringa finale sono permessi i simboli.
Da notare che la categoria “simbol” può essere personalizzata a piacere, aggiungendone o rimuovendone alcuni. Allo stesso modo, potete creare nuovi gruppi di caratteri seguendo il criterio visto sopra.
Anche nel caso di $args è stato inserito un controllo, che elimina dai valori quelli non permessi (cioè i valori diversi dai gruppi prestabiliti).
Test della funzione
Ecco due esempi di test della funzione.
Nel primo caso si prendono i parametri di default: quindi la stringa sarà lunga 32 caratteri e potrà essere composta da caratteri alfa-numerici e da simboli.
Nel secondo caso forziamo gli argomenti: la stringa sarà lunga 20 caratteri e conterrà soltanto caratteri minuscoli e numeri.
1 2 3 |
echo random_string(); echo random_string(20, array('alfa_lower', 'number')); |
mi complimento per la tua brillante capacità di scrivere programmi del genere; mi occorre un consiglio, per esperienze negative vissute sulla mia pelle, vorrei trasmettere messaggi non decifrabili ad un’altra persona . E’ fattibile, oppure una mera chimera. Grazie in anticipo per la cortese risposta.
P.S.= se uso Vernam posso stare tranquillo?
Ciao Lucius,
la criptografia è un tema complesso, ci sono aree di studio dedicate solo a questa, che tra l’altro è legata al fattore della sicurezza su qualsiasi software e sito web. Negli studi privati che ho fatto, ho letto di varie tipologie di cifratura e hashing, e ognuno ha dai suoi lati dei pregi e dei difetti. Un sistema perfetto, valido per tutte le casistiche, non esiste: bisogna considerare per cosa sarà utilizzato.
Il cifrario di Vernam è un sistema sicuro per trasmettere un messaggio, senza conoscere la chiave di lettura diventa davvero complicato decifrarlo; soprattutto diventa complicato farlo in tempo utile. Però ha qualche pecca da considerare:
– la chiave di lettura è spesso lunghissima, pari alla lunghezza del testo o anche di più (se per esempio si decide di assegnare a una singola lettera un numero a più cifre). Quindi è abbastanza scomoda da passare al destinatario.
– è utilizzabile una volta sola e al successivo messaggio occorre ricrearla, altrimenti si perde la sua fama di inviolabilità.
– il destinatario deve ottenere la chiave di lettura, per cui si deve trovare un sistema per passargliela in modo sicuro.
Detto questo, il Vernam è un sistema semplice e sicuro, usato con successo anche durante la Guerra Fredda. Come dicevo, dipende dal contesto in cui si usa 🙂