Nel tuo codice, hai per riempire $legal_characters
con l'elenco di caratteri che accetti come parte di una password. Per esempio:.
$legal_characters = "abcdefghijklmnopqrstuvwxyz";
se desideri password composte da lettere minuscole (tutte lettere latine minuscole, ma nessun altro carattere e nessun accento).
Questo codice è un po 'strano; usa mt_rand()
(un PRNG interno) seminato con l'ora corrente e l'ID di processo per ottenere la lunghezza della password, tra 15 e 60 caratteri. Quindi usa /dev/urandom
per la password stessa, che è intelligente poiché mt_rand()
non è crittograficamente sicuro (soprattutto perché l'ID di processo non è qualcosa che è molto segreto, e nemmeno l'ora corrente).
La generazione effettiva della password funziona così: produce 500 byte casuali (da /dev/urandom
), quindi rimuove tutti quelli che non sono nel set di caratteri accettati (che è il " tr
"), e infine tronca nuovamente il sequenza di caratteri rimanente alla lunghezza desiderata. Questo processo genera sequenze casuali uniformemente, quindi va bene, e /dev/urandom
è il PRNG appropriato per questo. Nota, tuttavia, alcuni avvertimenti:
-
Se il set di "caratteri legali" è piccolo, è possibile terminare con una password più breve. Per esempio. se si desiderano password con solo cifre da 1 a 6, in media ci saranno solo 12 byte corrispondenti nei 500 byte casuali. Il codice non ha sicurezza per "troppo breve". Se imposti $legal_characters
su tutte le 26 lettere minuscole, allora circa 1 byte su 10 sarà legale (i valori dei byte vanno da 0 a 255 e 26/256 è vicino a 1/10) e, in media, "% co_de" % "parte produrrà circa 50 caratteri, ed è estremamente improbabile che ceda meno di 20. Comunque, questo è degno di nota e dovrebbe essere un failsafe.
-
Non ha molto senso avere una lunghezza variabile per la password. Se una password di lunghezza minima è accettabile per la sicurezza, allora tutte le password potrebbero avere quella lunghezza. E se è non accettabile, allora perché usi quella lunghezza minima? Faresti meglio ad usare una singola lunghezza fissa, piuttosto che un intervallo. Ciò ti consentirebbe di rimuovere tr
e seed_random()
, semplificando sostanzialmente il codice.
-
Una "password" è qualcosa che un essere umano sarà in grado di digitare un memo - quindi "parola". Memorizzerà una sequenza di 60 caratteri? Sono sicuro che esiste un nome medico per tale condizione.
-
È necessario impostare la lunghezza delle password su un valore "appropriato" in modo che l'entropia sia sufficientemente alta. Se ci sono x caratteri legali e la lunghezza della password è n , allora l'entropia sarà x n . Quale entropia è necessaria dipende dall'uso previsto. Per autenticare gli utenti su un sito Web, tramite un tunnel SSL appropriato, 2 40 ("40 bit" di entropia) è più che sufficiente, che si traduce in 9 lettere minuscole (26 9 è maggiore di 2 40 ).
-
Il codice usa unixisms ( mt_rand_custom()
, /dev/urandom
, head
...) e avrà difficoltà a funzionare su, ad esempio, un server Windows (e PHP runs su Windows, anche ).
Riepilogo: le password saranno forti, ma il codice è strano. Dovresti eliminare la lunghezza variabile, e se i tuoi utenti possono ingoiare password di 60 caratteri, ti preghiamo di congratularmi con loro per me. O vendili allo zoo. Ecco un codice semplificato che dovrebbe essere OK (attenzione: io non uso PHP quindi sto improvvisando qui):
function generate_password() {
return shell_exec('head -c 500 /dev/urandom | tr -dc abcdefghijklmnopqrstuvwxyz | head -c 9; echo');
}