Risposte brevi: No, la tua generazione di chiavi non è sicura. Sì, l'utente malintenzionato può trovare l'e-mail dal codice.
Un utente malintenzionato può ottenere il codice di attivazione per qualsiasi indirizzo email a causa della generazione di numeri casuali estremamente deboli. mt_rand()
non è adatto a questo scopo , a questo si aggiunge il vantaggio ottenuto conoscere alcune informazioni sullo stato del proprio sistema (tempo di generazione, ad esempio). Ciò può ridurre notevolmente lo spazio per le chiavi potenziali per ogni email.
Per quanto riguarda l'altro punto, non penso che sia così preoccupante che l'e-mail possa essere brutalmente forzata dalla chiave. Questa dovrebbe essere l'ultima delle tue preoccupazioni. La chiave è, presumibilmente, di breve durata e inviata solo all'indirizzo email. Avere il proprietario dell'indirizzo email che sta cercando il loro indirizzo email è .. beh, si ottiene il punto.
Tuttavia, sì, non è molto difficile forzare la e-mail dalla chiave. Soprattutto perché le e-mail non sono certamente generate casualmente e molto probabilmente esistono nei dizionari con alcune altre combinazioni. Il tuo numero casuale ti dà circa 1 milione di combinazioni, che è molto basso.
"Come posso fare meglio?", chiedi. È molto semplice. Utilizzare un metodo / API di generazione di numeri casuali sicuri offerti dalla lingua preferita. Nel tuo caso, in PHP, puoi utilizzare openssl_random_pseudo_bytes()
. Ecco un esempio per tua comodità:
$activationKey = bin2hex(openssl_random_pseudo_bytes(16)); //128-bit
Dopo aver generato la chiave e averla inviata all'utente, memorizzare un hash della chiave nel database. Quasi tutte le funzioni di hash lo faranno, raccomando SHA-1. Quando viene utilizzato il collegamento / chiave di attivazione, è sufficiente cancellarlo e confrontarlo con la voce nel database. Successivamente, puoi attivare l'account e invalidare la chiave.