2010-09-09 4 views
7

Quando gli utenti registrano un account ricevono un'email con un codice di verifica che possono fare clic per verificare i propri account.MD5 è un buon metodo per generare il codice di verifica dell'account

Ecco come generare il codice di verifica.

md5(rand(0,1000) 

Sta usando il metodo di seguito una cattiva scelta? Genera un numero casuale compreso tra 0 e 1000. Poiché ci sono solo 1000 le opzioni, e le loro hash MD5 sono noti, si dovrebbe prendere un attaccante solo 1000 prove per verificare l'account senza realmente di loro proprietà

+0

"dovrebbe richiedere a un utente malintenzionato solo 1000 tentativi per verificare l'account senza appartenervi realmente" Ecco perché è necessario anche limitare i tassi. – NullUserException

+0

@NullUserException quale velocità limiti? Gli aggressori utilizzeranno più indirizzi IP e tenteranno di registrare più account ... –

risposta

3

Basta sementi con qualcosa l'attaccante non poteva sapere:

md5(rand(0,1000).'helloworld234'); 

non c'è limite a quanto si potrebbe andare crasy

md5(md5(time().'helloguys'.rand(0,9999))); 

modo troppo, ma si ottiene l'idea.

+4

più entropia, meglio è. Metterei almeno l'ID utente o l'email della persona che si registrava, insieme al tempo con la massima precisione possibile. –

+3

@John Beh, ho insegnato a suggerire un seme generato dallo spin di un atomo, ma tu conosci il costo e tutto il resto. – Iznogood

+0

rand() è orribile e non dovrebbe mai essere usato per la sicurezza, mt_rand() è migliore. Anche l'attaccante conosce il tempo(), è lui a creare l'account. – rook

1

rand (1,1000) è 10 bit di entropia. MD5ing non ne aggiunge nessuno. In media ci vorranno 500 tentativi per un utente malintenzionato per verificare un account. Nessuna quantità di limitazione dei tassi ti aiuterà, poiché gli hacker esperti noleggiano o già possiedono una botnet che verrà utilizzata per convalidare i conti.

Gioca in tutta sicurezza e dispone di 128 bit di entropia nei tuoi link di verifica. In PHP openssl_random_pseudo_bytes(16, true) è il modo portatile per ottenere byte casuali crittograficamente forti, ma se si ospita sotto qualche distribuzione Linux o uno dei sistemi operativi BSD, leggere/dev/urandom è anche una scelta accettabile.

Anche mettere in discussione la saggezza di verificare i conti affatto, molte persone usano email monouso irreperibili esattamente per questo (e la tua lista nera non sarà mai aggiornata).

+0

Downvoting piacevole senza una ragione ... –