stringa di attivazione dell'email con il numero casuale di MD5 e l'e-mail protetta?

1

Per la registrazione sul mio sito web PHP, richiedo la conferma via email. Dopo che un utente si registra, una stringa viene generata con il seguente codice e inviata al suo indirizzo email.

$key = md5(mt_rand(1000,999999).$_POST['email']);

Quella stringa è anche memorizzata nel database, e se l'utente incolla la chiave corretta nella mia pagina di conferma, il loro account è validato.

Il codice di generazione della chiave che ho usato è sicuro? Come in, c'è un modo in cui si può accertare la stringa di posta elettronica originale se hanno ottenuto la chiave?

    
posta Philippe Gray 15.03.2014 - 15:21
fonte

3 risposte

6

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.

    
risposta data 15.03.2014 - 16:18
fonte
0

Generare l'hash non sarebbe un grosso problema dato che rand () non è abbastanza casuale.

Per il generatore di chiavi casuali, se sei su linux / unix, potresti ottenere i valori da / dev / urandom invece di rand () che sarebbe abbastanza buono per il tuo caso.

E sì, inviando un hash valido che ottiene un account convalidato, sarai in grado di dedurre il tuo indirizzo email (in quel momento la tua applicazione mostrerebbe probabilmente l'indirizzo email o il nome utente dell'utente nella pagina di convalida che farebbe in qualche modo la stessa cosa)

Tuttavia, nonostante il fatto che le e-mail possano essere recuperate in questo modo, direi che non è un gran problema, dato che puoi dedurre anche la pagina di login o la pagina di password dimenticata se la tua applicazione non soddisfa tali condizioni. Un altro punto sarebbe che, dopo che l'utente è stato convalidato, il link di convalida dovrebbe essere eliminato dal database in modo che l'aggressore non possa più non essere in grado di dedurre l'e-mail per tale account di posta elettronica. Quindi, gli account di posta elettronica che potrebbero essere dedotti sarebbero quelli che non sono attivi (come l'account non è ancora stato convalidato) o nuovi account. Eppure, non ha molto impatto dato che guadagnare il proprio indirizzo email da solo non ti farà molto.

Un po 'fuori dal comune, ma sento il bisogno di dirlo poiché è in qualche modo correlato.

A parte questo, convincere gli aggressori a convalidare l'account dell'utente o ottenere l'indirizzo email dell'utente non è davvero un grosso problema, tuttavia, se si consente all'utente di accedere direttamente dopo aver convalidato il proprio account, l'utente malintenzionato sarebbe in grado di ottenere l'accesso all'account dell'utente che è cattivo (che è abbastanza comune, purtroppo).

Quindi, il modo corretto sarebbe di convalidare solo l'account dell'utente al momento dell'attivazione e non permettere all'utente di accedere direttamente al proprio account.

    
risposta data 15.03.2014 - 16:24
fonte
0

As in, is there any way one could ascertain the original email string if they obtained the key?

Dato un utente malintenzionato che ha già ottenuto il valore hash MD5 (cioè ha ottenuto la chiave), ora è possibile un attacco offline.

Poiché oclHashcat utilizzando il clock del core 8x AMD R9 290Xstock è possibile generare test MD5 con oltre 80 miliardi di test (con un B) al secondo, e il tuo numero casuale è leggermente inferiore a un milione, oclHashcat con quelle GPU in grado di testare 80.000 indirizzi email diversi al secondo.

Poiché gli indirizzi e-mail sono molto prevedibili, non sono usati in modo insolito come password, sono normalmente considerati informazioni pubbliche e sono disponibili in blocco da precedenti violazioni dei dati così come da record di mailing list e in vendita e così via e così via. sono molto vulnerabili agli attacchi basati su regole, come pure attacchi combinati (a-z + cognomi + @ hotmail.com o @ yahoo.com o @ gmail.com, per esempio).

Inoltre, i numeri sul fronte e sulla fine sono un trucco di password comune a persone come, quindi gli attacchi di dizionario basati su regole e gli attacchi maschera che controllano questo tipo di cose sono già di uso comune.

Quindi, sì, l'indirizzo email potrebbe essere scoperto solo dall'hash che hai inviato se è abbastanza comune.

    
risposta data 15.03.2014 - 15:51
fonte

Leggi altre domande sui tag